【问题标题】:passing arguments between c and inline assembly在 c 和内联汇编之间传递参数
【发布时间】:2013-10-29 21:13:31
【问题描述】:

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

想法?

【问题讨论】:

  • 该代码甚至无法编译。你能举一个真实的例子吗?
  • 我知道它不会编译,这就是我寻求帮助的原因
  • 不同的编译器对内联汇编有不同的支持和语法——如果你说明你正在使用的编译器会有所帮助。

标签: c++ c x86 inline-assembly


【解决方案1】:

以防其他人遇到此问题。

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

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

【讨论】:

    【解决方案2】:

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

    你可以将数组的元素传入:

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

    或者它的地址:

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

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

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

    【讨论】:

    • 您可以使用asm("incb %0" : : "m"(name[0]) : "memory"); - 它会创建与asm("incb (%0) : : "r"(name) : "memory");(或"r"(&name[0]))相同的代码。
    • 根据我对手册的阅读,在asm("incb %0" : : "m"(name[0]) : "memory"); 的情况下,如果指向它的指针没有转义,则允许编译器假设 name[0] 不会改变。但是我无法演示。
    • 再次感谢肯(以及链接)。我认为该链接解释了发生了什么。这看起来像是终极答案:asm ("movdqu %1, %0" : "=x"(r) : "m"(t[0]));。你知道,在接受原始语句的编译器中,我没有收到 1 个带有 -Wall-Wextra 的警告。
    【解决方案3】:

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

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

    【讨论】:

    • 我尝试过使用 name 和 &name,我希望它传递 name 的地址(即 eax 持有指向我的字符串的指针)
    • 那么我认为正在发生的是汇编编译器区分指针和数组(即使它们都具有相同的值)在这种情况下,您可能必须按照您的想法进行操作char *nameptr = 名称。
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多