【发布时间】:2014-10-30 18:59:11
【问题描述】:
我正在试验 GCC 的内联汇编程序(我使用 MinGW,我的操作系统是 Win7)。 现在我只能让一些基本的 C stdlib 函数工作。我通常熟悉 Intel 语法,但对 AT&T 不熟悉。
以下代码运行良好:
char localmsg[] = "my local message";
asm("leal %0, %%eax" : "=m" (localmsg));
asm("push %eax");
asm("call %0" : : "m" (puts));
asm("add $4,%esp");
然而,LEA 似乎是多余的,因为我可以直接将值压入堆栈。好吧,由于我认为这是 AT&T 的特点,所以这样做:
asm("push %0" : "=m" (localmsg));
将在最终的可执行文件中生成以下汇编代码:
PUSH DWORD PTR SS:[ESP+1F]
因此,不是将地址推送到我的字符串,而是推送其内容,因为“指针”被“取消引用”,用 C 术语来说。这显然会导致崩溃。
我相信这只是 GAS 的正常行为,但我找不到任何有关如何克服此问题的信息。如有任何帮助,我将不胜感激。
附:我知道这对于那些有经验的人来说是一个微不足道的问题。我预计会被否决,但我花了 45 分钟寻找解决方案,但一无所获。
附言我意识到这样做的正确方法是在 C 代码中调用 puts( )。这纯粹是出于教育/实验的原因。
【问题讨论】:
-
asm("push %0" : "=m" (&localmsg));工作吗? -
@markgz 不,它抱怨“asm 语句中需要左值”。无论如何,我认为这没有多大意义,因为 localmsg 已经是一个指针。
-
为什么将 localmsg 标记为输出操作数?
-
@MarcGlisse 我的错误,我不明白第一个冒号总是用于输出,无论修饰符如何。但是,这对我的问题没有影响。
标签: c gcc inline-assembly att