我需要一些帮助来理解堆栈寄存器如何在x86汇编中工作。下面的代码片段来自我正在研究的一个引导加载程序。
print函数有三个参数。因为我把这三个都推到堆栈中,所以我期望sp
在0xfff9
处。bp
在print函数中使用一次相同的地址。
为什么我必须做[bp+4]
而不是[bp+2]
?因为不是变量我推在位置0xfffd
, 0xfffb
和0xfff9
?然后,当我从打印函数返回时,我添加add sp, 6
以在打印之前将sp恢复到相同的位置。
; stack initialization
mov ax, 0x0000
mov ss, ax
mov sp, 0xffff
mov bp, 0xffff
EDIT忘了函数返回地址
BP points to where the previous BP value was pushed
BP + 2 points to the return address pushed by `call PRINTMESSAGE`
BP + 4 points to the last argument pushed
and so on