【发布时间】:2016-08-26 02:16:41
【问题描述】:
休闲程序必须打印 3 ,但从 asm 中看不到 'buff'。
#include <stdio.h>
char buff[] = "%d\n";
int main (void)
{
asm("mov eax, 3");
asm("mov esi,eax");
asm("mov edi,buff");
asm("mov eax, 0");
asm("call printf");
return 0;
}
我尝试使用 asm intel 语法。
它编译为:gcc -masm=intel -o test2 test2.c
线
asm("mov edi,buff");
错了,我这里的buff怎么写?我试过 [buff] 但没有用。谢谢
**更新:
下一个程序有效,但使用的是 AT&T 语法:
#include <stdio.h>
char Format[] = "%d\n";
int main (void)
{
asm
(
// Make stack space for arguments to printf
"movl $3, %eax\n"
"movl %eax, %esi\n"
"movl $Format, %edi\n"
"movl $0, %eax\n"
"call printf\n"
);
return 0;
} //compile with gcc -o test2 test2.c
我尝试使用 intel 语法做同样的事情,但我不知道如何从 asm 访问全局变量
【问题讨论】:
-
很难知道从哪里开始告诉你出了什么问题。 #1 点可能是:不要使用内联 asm(请参阅 gcc.gnu.org/wiki/DontUseInlineAsm)。 #2:不要使用多个内联 asm 行,使用 1 条语句和多条指令。 #3:不要从“基本”asm 访问 C 变量,使用来自 extended asm 的约束。 #4:从内联 asm 调用函数非常棘手并且可能注定失败。 #5:是什么让你认为这会打印“5”而不是(比如说)“3”?可能还有更多,但这只是一个糟糕想法的糟糕实现。
-
@DavidWohlferd 看起来这是一个学习内联汇编的练习。
-
是的,我正在做测试,如何从 c 代码中使用 asm,我更新了问题,是的,它必须打印 3,只是输入错误。我放置了使用 AT&T 语法的工作 asm 代码,但我尝试使用 intel 语法做同样的事情
-
x86 tag wiki 有一些链接。具体看this answer底部的链接,尤其是教程。并阅读该答案以了解为什么内联 asm 是学习汇编的最难方法。在 asm 中编写整个函数并从 C 中调用它们。还要注意,在 GNU C 内联 asm 语句中使用
call是不安全的,因为你不能告诉编译器你想破坏红色区域,因为答案解释。 -
@PeterCordes:果然
-O2不足以让这个被丢弃。但是-fwhole-program可以。