比如我们常用的push指令: 5.1 push压入立即数 当运行在实模式下时: 如果立即数是8位,会将其扩展为16位,然后再将sp-2 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp- 4 当运行在保护模式下时: 如果立即数是8位,会将其扩展为32位,然后再将sp-4 如果立即数是16位,则将sp-2 如果立即数是32位,则将sp-4 5.2 push压入段寄存器 当运行在实模式下时, 当运行在保护模式下时,CPU压入4字节,然后再将sp-4。 压入通用寄存器或内存 push ax push eax push word [0x1234] push dword [0x1234] 无论实模式或者保护模式: 如果操作数是16位,sp-2 如果操作数是32位,sp
, { r0-r12,lr } //每次传送前-4,且从右往左存储寄存器 //所以sp-4=lr,sp-8=r12,... sp-56=r0; 由于!
, { r0-r12,lr } //每次传送前-4,且从右往左存储寄存器 //所以sp-4=lr,sp-8=r12,... sp-56=r0; 由于!
满栈就是用栈过程中对地址的操作不能超过SP,所以你很少在计算过程中看到 把sp-4地址中的值给某个寄存器, 除非是特别的指令,否则不可能有这样的指令.第二: sub sp, sp, #8 和 add sp
可以看出,这些正常了,先申请空间,然后保存环境,恢复的时候是先恢复环境,然后释放局部变量空间 这里申请局部变量空间的时候,并没有使用 sup sp,4 而是使用的加法指令 add sp-4 其实是一样的
也就是说,sp先减4,然后把r0的内容存入sp-4指向的地址处,然后再把sp-4写入到sp中。
, {fp, ip, lr, pc}:按高编号寄存器存在高地址,依次将pc、lr、ip、fp存入sp-4中; sub fp, ip, #4:fp的值为ip-4=4096-4=4092; sub
(3) 格式:PUSHFD POPFD 功能:PUSHFD将标志寄存器32位内容压入堆栈SP←SP-4。POPFD将当前栈顶一个双字传送到32位标志寄存器中,SP←SP+4。