聘我网

新概念招聘3.0

如何理解leaveq和retq

vote up0vote downstar

貌似所有函数最后两条指令都是这个,怎么理解?

(gdb) disas main
Dump of assembler code for function main:
0x00000000004004cc <main+0>:    push   %rbp
0x00000000004004cd <main+1>:    mov    %rsp,%rbp
0x00000000004004d0 <main+4>:    sub    $0x30,%rsp
0x00000000004004d4 <main+8>:    mov    %edi,-0x24(%rbp)
0x00000000004004d7 <main+11>:   mov    %rsi,-0x30(%rbp)
0x00000000004004db <main+15>:   lea    -0x20(%rbp),%rdi
0x00000000004004df <main+19>:   mov    $0x0,%eax
0x00000000004004e4 <main+24>:   callq  0x400498 <func>
0x00000000004004e9 <main+29>:   movzbl -0x10(%rbp),%eax
0x00000000004004ed <main+33>:   movsbl %al,%ecx
0x00000000004004f0 <main+36>:   mov    -0x18(%rbp),%rdx
0x00000000004004f4 <main+40>:   mov    -0x20(%rbp),%rsi
0x00000000004004f8 <main+44>:   mov    $0x400608,%edi
0x00000000004004fd <main+49>:   mov    $0x0,%eax
0x0000000000400502 <main+54>:   callq  0x400398 <printf@plt>
0x0000000000400507 <main+59>:   mov    $0x0,%eax
0x000000000040050c <main+64>:   leaveq 
0x000000000040050d <main+65>:   retq   
End of assembler dump.
 

1 个答复

vote up0vote downcheck

leaveqretq中的q是指64位操作数。

leaveq相当于:

movq %rbp, %rsp
popq %rbp

retq相当于:

popq %rip

注意leaveq跟开头是对应的:

push   %rbp
mov    %rsp,%rbp

有些指令集也把它叫做enterq

而与retq对应的是callq,相当于:

pushq %rip
jmpq addr
链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.