gpt4 book ai didi

c - 如何用内联汇编编译这个程序?

转载 作者:太空狗 更新时间:2023-10-29 17:08:48 29 4
gpt4 key购买 nike

我无法编译从教程中获取的这个程序。它应该打印“Hello World”。

void main() 
{
__asm__("jmp forward\n\t"
"backward:\n\t"
"popl %esi\n\t"
"movl $4, %eax\n\t"
"movl $2, %ebx\n\t"
"movl %esi, %ecx\n\t"
"movl $12, %edx\n\t"
"int $0x80\n\t"
"int3\n\t"
"forward:\n\t"
"call backward\n\t"
".string \"Hello World\\n\""
);
}

gcc 4.7 在 Linux 下给我以下错误:

gcc hello.c -o hello
hello.c: Assembler messages:
hello.c:5: Error: invalid instruction suffix for `pop'

是否还有一种方法可以避免为每一行指定双引号?

另外,我想知道如何修改程序以使用 libc 调用 printf 而不是 kernel 服务。

最佳答案

:

hello.c: Assembler messages:
hello.c:5: Error: invalid instruction suffix for `pop'

A:popl 在 x86-32 上可用,但在 x86-64 上不可用(它有 popq)。您需要调整您的汇编代码以在 x86-64 上工作,或者您需要调用 GCC 来生成 x86-32 二进制输出。

假设您要生成 x86-32,请使用命令行选项 -m32

:

Is there also a way to avoid to specify double quotes for each line?

A:没有。这是因为 __asm__() 是一个接受字符串参数的伪函数,所以字符串遵循 C 语法。字符串的内容被传递给汇编程序,很少或没有处理。

请注意,在 C 语言中,当字符串并列时,它们是连接在一起的。例如,"a""b""ab" 相同。

请注意,在汇编语言语法 (GAS) 中,您可以用换行符或分号分隔语句,例如:"movl xxx; call yyy""movl xxx\n 调用 yyy"

:

how to modify the program to use libc call printf

A:关注calling convention for C on x86 .从右向左推送参数,调用函数,然后清理堆栈。示例:

pushl $5678  /* Second number */
pushl $1234 /* First number */
pushl $fmtstr
call printf
addl $12, %esp /* Pop 3 arguments of 4 bytes each */

/* Put this away from the code */
fmtstr: .string "Hello %d %d\n" /* The \n needs to be double-backslashed in C */

关于c - 如何用内联汇编编译这个程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158498/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com