因此,我尝试在控制台上使用gdb调试第一个程序。我能够弄清楚已发布的内容,但是我不知道为什么如果该地址以0开头,那么该地址为什么会移入rcx寄存器?因此,我尝试进一步往地址线下方看,实际的字符串出现在距离移入rcx寄存器的地址14个字节的位置。但为什么?我知道GDB有一个地址放在那里“ 0x404000”,它实际上是字符串开始的地方,但是为什么这个地址不移入rcx寄存器呢?我希望我能在这里得到答案!
源代码:
#include <stdio.h>
int main()
{
int i;
for(i = 0; i < 10; ++i)
{
printf("Hello, world!\n");
}
}
以下是main的反汇编:
Dump of assembler code for function main():
0x0000000000401550 <+0>: push rbp
0x0000000000401551 <+1>: mov rbp,rsp
0x0000000000401554 <+4>: sub rsp,0x30
0x0000000000401558 <+8>: call 0x401640 <__main>
0x000000000040155d <+13>: mov DWORD PTR [rbp-0x4],0x0
0x0000000000401564 <+20>: cmp DWORD PTR [rbp-0x4],0x9
0x0000000000401568 <+24>: jg 0x40157c <main()+44>
0x000000000040156a <+26>: lea rcx,[rip+0x2a8f] # 0x404000
0x0000000000401571 <+33>: call 0x402a70 <puts>
0x0000000000401576 <+38>: add DWORD PTR [rbp-0x4],0x1
0x000000000040157a <+42>: jmp 0x401564 <main()+20>
0x000000000040157c <+44>: mov eax,0x0
0x0000000000401581 <+49>: add rsp,0x30
0x0000000000401585 <+53>: pop rbp
0x0000000000401586 <+54>: ret
End of assembler dump.
0x403ff3: 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000'
0x403ffb: 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 72 'H' 101 'e' 108 'l'
0x404003: 108 'l' 111 'o' 44 ',' 32 ' ' 119 'w' 111 'o' 114 'r' 108 'l'
0x40400b: 100 'd' 33 '!'