gpt4 book ai didi

C内联汇编内存拷贝

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:40 27 4
gpt4 key购买 nike

我正在尝试将一些内联汇编写入 C。我有两个数组作为输入,我需要的是将 array1 中的一个元素复制到 array2 中,以下是我目前拥有的:

asm (
"movl %0,%%eax;"
"movl %1,%%ebx;"
"movl (%%eax),%%ecx;"
"movl %%ecx,(%ebx);"

"xor %%ecx,%%ecx;"
"movl 4(%%eax),%%ecx;"
//do something on %ecx
"movl %%ecx,4(%ebx);" //write second
:
:"a"(array1),"b"(array2)
);

为什么会出现段错误?

最佳答案

您的内联汇编代码已损坏。如果不将 EAX 和 EBX 添加到 clobber 列表中,则不能直接使用它们。否则编译器不知道哪些寄存器被修改了。

很可能您修改的其中一个寄存器包含了一些非常重要的东西,这些东西后来导致了段错误。


此代码会将一个元素从 array1 复制到 array2:

asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);

具有适当寄存器约束的更好版本会像这样丢弃硬编码的 EAX:

int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);

顺便说一句 - 总的来说,我觉得您还不太熟悉汇编程序。由于所有编译器的魔力,编写内联汇编程序有点难。我建议你开始用汇编程序编写一些简单的函数,然后先将它们放入一个单独的 .S 文件中。这样就容易多了。

关于C内联汇编内存拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656010/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com