1

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

想法?

4

3 回答 3

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])
    );
}

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

于 2013-10-29T13:13:31.357 回答
2

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

您可以将数组的元素传递给:

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

或者它的地址:

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

此外,如果您在内联汇编程序中切换汇编程序语法,您必须在之后恢复它,并且不要使用内存 asm 操作数,因为这些操作数将使用错误的语法。

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

于 2013-10-19T08:00:38.147 回答
0

不要做 &name 尝试只是 name,数组总是指向它所在的内存空间。现在你要做的是将数组'thisisatest'放入一个不能保存这么多数据的寄存器(eax)中。

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

于 2013-10-18T17:58:43.720 回答