我有一个关于在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'),但它不会构建。
想法?
答案 0 :(得分:4)
如果其他任何人遇到这个问题,我就让它发挥作用。
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])
);
}
密钥是将数组的第一个元素作为内存参数传递,然后询问有效地址。然后我有一个指向我的字符串的指针。希望这有助于其他人
答案 1 :(得分:2)
在转换为指针时,不能将数组传递给内联汇编(除了结构中),并且不能将内存约束应用于该指针,因为它不是左值。
您可以在:
中传递数组元素asm ("incb %0" : "+g" name[0] : : ); // AT&T syntax
或者它的地址:
asm volatile ("incb (%0)" : : "r" name : "memory"); // AT&T syntax
此外,如果您在内联汇编程序中切换汇编语法,则必须在之后将其恢复,而不是使用内存asm操作数,因为它们的语法错误。
编辑:在第二个代码片段中省略了变量名,并在第一个代码片段中添加了一个括号。
答案 2 :(得分:0)
不要做和名称只尝试名称,数组总是指向内存中的空间。 现在你要做的是将数组'thisisatest'放入一个无法容纳如此多数据的寄存器(eax)中。
寄存器可以保存几个字符(取决于寄存器大小)或数组所在的地址