汇编/霓虹灯代码崩溃

gre*_*til 0 assembly neon

我正在使用以下代码:

#include <stdlib.h>
#include <fcntl.h>

int main(int argc, char **argv) {
    char *auyvy = malloc(640 * 480 * 2);
    char *ay8 = malloc(640 * 480);

    int fd = open("input.uyvy", O_RDONLY);
    if (fd >= 0) {
        read(fd, auyvy, 640 * 480 * 2);
        close(fd);
    }

    __uyvy_luma_extract(640, 480, auyvy, 640 * 2, ay8, 640);

    fd = open("output.y8", O_RDWR | O_CREAT);
    if (fd >= 0) {
        write(fd, ay8, 640 * 480);
        close(fd);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外两个文件:https : //github.com/emrainey/DVP/blob/master/libraries/public/yuv/__uyvy_luma_extract.S https://github.com/emrainey/DVP/blob/master/libraries/public /yuv/yuv.inc

我用"gcc -g convert.c __uyvy_luma_extract.S -mfpu = neon"编译

奇怪的是,程序在转换过程中崩溃了.知道我做错了什么吗?

*FIRST EDIT* 我已经上传了一个包含各种文件的zip文件,因此可以在ARM平台上轻松复制:http://www.gentil.com/tmp/convert.zip

*第二次编辑* 我更新了不正确的汇编文件链接.

*第三次编辑* gdb给出以下内容:

Starting program: /home/ai/convert/convert                                      

Program received signal SIGSEGV, Segmentation fault.
0x00008036 in ?? ()
(gdb) bt
#0  0x00008036 in ?? ()
#1  0x000084f2 in __uyvy_luma_extract () at __uyvy_luma_extract.S:38
#2  0x000084f2 in __uyvy_luma_extract () at __uyvy_luma_extract.S:38
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)

Mån*_*ård 5

哦,这是一个很好的.

如果使用-marm构建但使用-mthumb断开,它可以正常工作.Ubuntu和Android可能有不同的默认值.

它在Thumb模式下中断的原因是汇编函数(总是非Thumb)缺少符号的类型规范,因此链接器不知道它需要使用BLX指令从Thumb代码调用它.执行程序时,因此在Thumb状态下错误地调用汇编函数.当解释为Thumb指令时,此函数的第一个半字0x47ff BLX pc对于不可预测的行为是无效的.显然,Cortex内核只是以明显的方式执行它,即切换到ARM状态,分支到PC值(Thumb状态下的当前指令+4),并将下一个(Thumb)指令地址存储在LR中,从而给出简单地忽略了STM指令的外观.

修复是将此行添加到程序集文件中:

.type __uyvy_luma_extract, STT_FUNC
Run Code Online (Sandbox Code Playgroud)