C内联汇编内存拷贝

标签 c assembly inline-assembly memcpy

我正在尝试将一些内联汇编写入 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/

相关文章:

c - RSA_sign() 段错误不可预测

c - 为什么 scanf ("%c\n") 在 stdin 中有延迟

c - 时间测量、CPU 滴答声和可调节的 CPU 频率?

c - 是否可以将汇编指令放入 CUDA 代码中?

c - 忽略无效输入,直到将正确的字符分配给 char 变量

c++ - _CrtSetAllocHook - 空文件名和行号参数

assembly - 如何阅读汇编操作码引用?

assembly - 扩展编译器以获得自己的汇编输出

C++ 从内存中执行函数

C++ 将 DWORD_PTR* 字符串打印到文件