LEA操作码如何在此代码中工作?

时间:2018-03-06 00:37:19

标签: c assembly memory intel disassembly

我用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是存储字符串的地方。

0 个答案:

没有答案