【发布时间】:2014-10-29 07:19:13
【问题描述】:
目前我尝试更接近汇编程序编程,因此查看了一个简单的 hello world 程序的汇编代码:
#include <stdio.h>
int main ()
{
int i;
for(i=0; i<10; i++)
{
printf("Hello, world!\n");
}
return 0;
}
现在我尝试了解几个简单的汇编命令是如何工作的,同时逐步了解汇编代码并分析究竟发生了什么:
0x000000000040052d <+0>: push rbp
0x000000000040052e <+1>: mov rbp,rsp
0x0000000000400531 <+4>: sub rsp,0x10
0x0000000000400535 <+8>: mov DWORD PTR [rbp-0x4],0x0
0x000000000040053c <+15>: jmp 0x40054c <main+31>
0x000000000040053e <+17>: mov edi,0x4005e4
0x0000000000400543 <+22>: call 0x400410 <puts@plt>
0x0000000000400548 <+27>: add DWORD PTR [rbp-0x4],0x1
0x000000000040054c <+31>: cmp DWORD PTR [rbp-0x4],0x9
0x0000000000400550 <+35>: jle 0x40053e <main+17>
0x0000000000400552 <+37>: mov eax,0x0
0x0000000000400557 <+42>: leave
0x0000000000400558 <+43>: ret
问题是我真的不明白这一行:
0x0000000000400543 <+22>: call 0x400410 <puts@plt>
我尝试以各种方式查看地址 0x400410,但我真的不明白它的真正作用:/ 我也不知道这到底意味着什么:<puts@plt>
如果有人能帮助我理解这一行,那就太好了:) 问候瞌睡
【问题讨论】:
-
puts@plt 是一个函数调用。 cplusplus.com/reference/cstdio/puts
-
它调用
puts()库函数来打印你的文本(代替printf()——因为你没有传递任何参数,它相当于调用更简单/更快的puts()) -
嗯,有道理。谢谢你帮助我