我用C:
创建了这个程序int main(){
int i=0;
for(i=0;i<10;i++)
puts("Hello, world!");
return 0;
}
我正在使用GDB来检查程序,这是主要的反汇编:
0x000055555555463a <+0>: push rbp
0x000055555555463b <+1>: mov rbp,rsp
0x000055555555463e <+4>: sub rsp,0x10
0x0000555555554642 <+8>: mov DWORD PTR [rbp-0x4],0x0
0x0000555555554649 <+15>: jmp 0x55555555465b <main+33>
0x000055555555464b <+17>: lea rdi,[rip+0xa2] # 0x5555555546f4
=> 0x0000555555554652 <+24>: call 0x555555554510 <puts@plt>
0x0000555555554657 <+29>: add DWORD PTR [rbp-0x4],0x1
0x000055555555465b <+33>: cmp DWORD PTR [rbp-0x4],0x9
0x000055555555465f <+37>: jle 0x55555555464b <main+17>
0x0000555555554661 <+39>: mov eax,0x0
0x0000555555554666 <+44>: leave
0x0000555555554667 <+45>: ret
我不明白为什么在LEA指令中,当$ rip + 0xa2给出地址0x5555555546时,它会加载地址0x5555555546f4? 我知道地址0x5555555546f4是存储字符串的地方。