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

时间:2013-10-18 17:44:54

标签: c++ c x86 inline-assembly

我有一个关于在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'),但它不会构建。

想法?

3 个答案:

答案 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)中。

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