在c和内联汇编之间传递参数

我有一个关于在c和内联汇编之间传递参数的问题

我在将数组传递到内联汇编时遇到了麻烦。 我一直收到错误’错误:内存输入1无法直接寻址’

以下是我的代码示例:

void main() { char name[] = "thisisatest"; __asm__ ("\ .intel_syntax noprefix \n\ mov eax, %[name] \n\ inc (eax) \n\ " :/*no output*/ :[name]"m"(name) ); } 

这应该增加我的字符​​串的第一个字母(使它’u’),但它不会构建。

想法?

如果其他任何人遇到这个我就让它工作了。

 void main() { char name[] = "thisisatest"; __asm__ ("\ .intel_syntax noprefix \n\ lea, eax, %[name] \n\ inc BYTE PTR [eax] \n\ " :/*no output*/ :[name]"m"(name[0]) ); } 

关键是将数组的第一个元素作为内存参数传递,然后询问有效地址。 然后我有一个指向我的字符串的指针。 希望这有助于其他人

在转换为指针时,不能将数组传递给内联汇编(除了包含在结构中),并且不能将内存约束应用于该指针,因为它不是左值。

您可以在以下位置传递数组元素:

 asm ("incb %0" : "+g" name[0] : : ); // AT&T syntax 

或者它解决:

 asm volatile ("incb (%0)" : : "r" name : "memory"); // AT&T syntax 

此外,如果您在内联汇编程序中切换汇编程序语法,则必须在之后将其还原,而不是使用内存asm操作数,因为这些将使用错误的语法。

编辑:省略第二个代码片段中的变量名称,并在第一个代码片段中添加了一个括号。

不要和名称尝试只是名称,一个数组总是指向它所在的内存空间。 现在你要做的是将数组’thisisatest’放入一个无法容纳如此多数据的寄存器(eax)中。

寄存器可以保存几个字符(取决于寄存器大小)或数组所在的地址