如何使用Intel语法内联汇编在GCC中设置变量?

时间:2011-03-22 20:50:48

标签: gcc inline-assembly intel-syntax

为什么此代码不将temp设置为1?我该怎么做呢?

int temp;
__asm__(
    ".intel_syntax;"
    "mov %0, eax;"
    "mov eax, %1;"
    ".att_syntax;"
    : : "r"(1), "r"(temp) : "eax");
printf("%d\n", temp);

3 个答案:

答案 0 :(得分:13)

我认为你希望temp是输出,而不是输入。尝试:

  __asm__(
      ".intel_syntax;"
      "mov eax, %1;"
      "mov %0, eax;"
      ".att_syntax;"
      : "=r"(temp)
      : "r"(1) 
      : "eax");

答案 1 :(得分:8)

此代码执行您要实现的目标。我希望这会对你有所帮助:

#include <stdio.h>

int main(void)
{
    /* Compile with C99 */
    int temp=0;

    asm
    (   ".intel_syntax;"
        "mov %0, 1;"
        ".att_syntax;"
        : "=r"(temp)
        :                   /* no input*/
    );
    printf("temp=%d\n", temp);
}

答案 2 :(得分:6)

您必须将参数传递给GCC汇编程序。

gcc.exe -masm=intel -c Main.c
gcc.exe Main.o -oMain.exe

你有这样的C代码:

#include <conio.h>
#include <stdio.h>

int myVar = 0;

int main(int argc, char *argv[])
{
    asm("mov eax, dword ptr fs:[0x18]");
    asm("mov eax, dword ptr ds:[eax+0x30]");
    asm("movzx eax, byte ptr ds:[eax+0x2]");
    asm("mov _myVar, eax");

    if(myVar == 1) printf("This program has been debugged.\r\n");
    printf("Welcome.\r\n");
    getch();

    return 0;
}

不要忘记为asm()关键字中的每个变量添加前缀下划线(_),否则它将无法识别它。

关键字asm()对每个十六进制整数使用前缀'0x',而不是后缀'h'。