【发布时间】:2019-04-16 17:58:09
【问题描述】:
我正在尝试使用 c __asm__ 打印 AAAA,如下所示:
#include <stdio.h>
int main()
{
__asm__("sub $0x150, %rsp\n\t"
"mov $0x0,%rax\n\t"
"lea -0x140(%rbp), %rax\n\t"
"movl $0x41414141,(%rax)\n\t"
"movb $0x0, 0x4(%rax)\n\t"
"lea -0x140(%rbp), %rax\n\t"
"mov %rax, %rdi\n\t"
"call printf\n\t");
return 0;
}
反汇编:
Dump of assembler code for function main:
0x0000000000400536 <+0>: push %rbp
0x0000000000400537 <+1>: mov %rsp,%rbp
0x000000000040053a <+4>: sub $0x150,%rsp
0x0000000000400541 <+11>: mov $0x0,%rax
0x0000000000400548 <+18>: lea -0x140(%rbp),%rax
0x000000000040054f <+25>: movl $0x41414141,(%rax)
0x0000000000400555 <+31>: movb $0x0,0x4(%rax)
0x0000000000400559 <+35>: lea -0x140(%rbp),%rax
0x0000000000400560 <+42>: mov %rax,%rdi
0x0000000000400563 <+45>: callq 0x400410 <printf@plt>
0x0000000000400568 <+50>: mov $0x0,%eax
0x000000000040056d <+55>: pop %rbp
0x000000000040056e <+56>: retq
End of assembler dump.
在运行代码时,基本上有两个问题。 #1 它不打印“AAAA”,#1 当 RIP 到达 retq 时,它会抛出 segmentation fault
我有什么遗漏吗?
【问题讨论】:
-
printf之后可能需要在调用代码中重新调整栈 -
为什么不写个C程序调用
printf看看反汇编呢? -
我诚实的建议:不要从
asm语句中调用函数。这不是内联汇编的目的。内联汇编是学习汇编语言的一个很差的工具,所以我建议你在熟悉汇编编程之前不要使用它。 -
@amiTheregroot 这不是一个好的工具!只需在汇编文件中编写普通的汇编代码。使用内联汇编器,编译器可以在生成代码时做出各种奇怪的选择,并且需要对编译器如何工作有充分的了解才能使其正确。这不利于学习。
-
嗯,不要用内联汇编来做C代码能做的事情,也不要用内联汇编来学习汇编。