如何使用“英特尔语法内联汇编”在GCC中设置变量?

如何使用“英特尔语法内联汇编”在GCC中设置变量?,gcc,inline-assembly,intel-syntax,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); 我想,你希望temp成为一种输出,而不是一种输入。尝试: __asm__( ".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);

我想,你希望
temp
成为一种输出,而不是一种输入。尝试:

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

这段代码实现了您试图实现的目标。我希望这能帮助你:

#包括
内部主(空)
{
/*用C99编译*/
内部温度=0;
asm
(.intel_语法;”
mov%0,1
“.att_语法;”
:“=r”(温度)
:/*无输入*/
);
printf(“temp=%d\n”,temp);
}

您必须将参数传递给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;
}
#包括
#包括
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,字节ptr-ds:[eax+0x2]”;
asm(“mov_myVar,eax”);
如果(myVar==1)printf(“此程序已调试。\r\n”);
printf(“欢迎使用。\r\n”);
getch();
返回0;
}
不要忘了为asm()关键字中的每个变量添加前缀下划线(389;),否则它将无法识别它


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

哦,我真不敢相信我错过了它x\uuuux你绝对是对的;这就是问题所在。非常感谢@Mehrdad-我想你也需要其他顺序的说明,现在我看了。编辑@Mehrdad-只是巧合。您可以查看输出二进制文件以了解具体原因。在我的机器上,它对输入和输出重复使用了相同的寄存器,所以它看起来就是这样工作的。顺便说一句,使用att_语法,行应该是:
asm(“mov$1,%0;”:“=r”(temp):/*无输入*/)相关:。如果使用内存输出操作数,则需要使用
-masm=intel
进行编译。感谢您的参考,PeterThe header conio.h和getch()是非标准的,应替换为标准的替代品。这个链接显示了标准C和C++的例子。它还提到了getch()和其他特定于平台的方法,但最好提供使用标准构造的示例,特别是当您不知道用户在哪个平台上运行时。这在语法上是有效的,但您的asm语句缺少约束,因此编译器不知道您正在使用哪个寄存器,或者asm语句修改全局
myVar
。如果使用优化进行编译,这可能很容易中断。这是一个如何不使用内联asm的示例。它需要是一个单独的asm语句,最好具有
“=m”(myvar)
输出。另见