我需要一些帮助来理解堆栈寄存器在x86 Assembly中的工作原理。下面的代码片段来自我正在研究的引导程序。
打印功能需要三个"参数"。由于我将所有三个推送到堆栈,我希望sp
位于0xfff9
。 bp
在打印功能中一次获取相同的地址。
为什么我必须[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
编辑忘记了函数返回地址。
答案 0 :(得分:4)
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