在 C 和内联程序集之间传递参数

passing arguments between c and inline assembly

本文关键字:之间 参数 程序集      更新时间:2023-10-16

我有一个关于在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 操作数,因为这些操作数的语法错误。

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

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

寄存器

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