【发布时间】:2014-04-22 14:37:05
【问题描述】:
我试图对汇编语言有一个基本的了解,但我在一些事情上遇到了麻烦,并且找不到对我有意义的在线资源。
“离开”命令有什么作用?
我知道:
(R) = 内存[Reg[R]]
其中 R 是一个寄存器,但我不知道正确的部分是什么意思。那是取消引用寄存器吗?
对于堆栈帧,参数总是负数吗?局部变量总是正数?并且返回地址是否总是(4 + VAR1)?(VAR1是第一个参数的地址)
【问题讨论】:
我试图对汇编语言有一个基本的了解,但我在一些事情上遇到了麻烦,并且找不到对我有意义的在线资源。
“离开”命令有什么作用?
我知道:
(R) = 内存[Reg[R]]
其中 R 是一个寄存器,但我不知道正确的部分是什么意思。那是取消引用寄存器吗?
对于堆栈帧,参数总是负数吗?局部变量总是正数?并且返回地址是否总是(4 + VAR1)?(VAR1是第一个参数的地址)
【问题讨论】:
“leave” - 这是一个汇编程序指令,用于与汇编程序的“enter”一起使用。
Reg[R] - 它只是寄存器 R,如 si、esi 或 rsi,但如果您查看指令操作码,可能会有一个位域用于选择一个寄存器,如果您调用该位域的值R,则 Reg[R] 表示位域选择的寄存器。
堆栈帧 - 这是可选的。一些编译器可以选择不使用堆栈帧。如果启用了堆栈帧,那么函数开始的通常顺序是“push ebp”,然后是“mov ebp,esp”,所以[esp] = ebp的前一个值,并且使用ebp-offset来访问参数, ebp+offset 用于访问局部变量。如果不使用帧,则从 esp 开始的正偏移或零偏移用于参数和局部变量。
【讨论】:
leave 是一个单字节指令,相当于
movl %ebp, %esp
popl %ebp
在 32 位模式下。在 16 位或 64 位模式下,与 16 位或 64 位寄存器相同。
【讨论】: