举例这些指令做了什么
1.push指令
- pushl %eax
将eax数值压入栈中,可分解为: - subl $4, %esp ——> esp = esp - 4
- movl %eax, (%esp) ——> *(int32_t *)esp = eax
2.popl指令
- pop %eax
将eax数值弹出栈,可分解为: - movl (%esp), %eax ——> eax = *(int32_t *)esp
- addl $4, %esp ——> esp = esp + 4
3.call指令
- call 0x12345
调用0x12345这个地址,可分解为: - pushl %eip ——> 将cpu下一条要执行的指令压入栈中
- movl $0x12345, %eip ——> eip = 0x12345
注意:CPU下一条指令将会从地址0x12345中取。
4.ret指令
- ret
返回call之前的地址,可分解为: - popl %eip ——> 将call压入栈的指令弹出赋给eip