给定一个字节可寻址系统。字大小(=寄存器大小)是2个字节。堆栈向上增长,当前堆栈指针为0x016E .CALL指令有两个字,操作码字和另一个是子程序的起始地址.CALL指令的工作原理如下:
i)将PC,PSW加载到堆栈中;
ii)在PC中加载子程序的起始地址。
CALL指令前的PC内容为0x5FA0(填充信息I' m假设)。执行CALL指令后堆栈指针的值是什么?
答案是0x172 所以这就是我无法解决的问题。 PC + PSW + CALL =堆栈上的8个字节。或者CALL指令是否未存储在堆栈中?很清楚会有一系列明确的事件。谢谢!
答案 0 :(得分:2)
根据列出的规则,你应该发生这种情况
致电之前
...
0x16a uuuu PC 0x5fa0
0x16c uuuu
0x16e uuuu <-- Stack pointer uuuu = Undefined but allocated
0x170 xxxx xxxx = Undefined and not allocated
0x172 xxxx
0x174 xxxx
...
通话后
...
0x16a uuuu PC 0x????
0x16c uuuu
0x16e uuuu uuuu = Undefined but allocated
0x170 5fa4 (Return address) xxxx = Undefined and not allocated
0x172 PSW <-- Stack pointer
0x174 xxxx
...
我已经淹没了堆栈,增加了地址到底部,因为我使用了不断增长的堆栈,但堆栈实际上正在成长。
在堆栈上推送的返回地址为0x5fa4
,因为例程必须在调用后返回,并且在0x5fa0-0x5fa1
处有调用操作码并且在0x5fa2-0x5fa3
处有调用操作数。
假设调用指令是
call 0x1234
绝对 1 call
指令的操作码为0xfffe
。 0x5fa0
的内存将是
...
0x5f9c ????
0x5f9e ????
0x5fa0 0xfffe <-- Call opcode
0x5fa2 0x1234 <-- Call operand
0x5fa4 ????
0x5fa6 ????
...
1 忽略此形容词,只是让示例更容易。
push 操作实际上是两个操作:
这就是我用文字淹没堆栈的原因。
这种堆栈称为完全升序,因为堆栈指针朝向更高的地址增长并指向存储的最后一个字。
我通过你给出的答案推断出这种堆栈,它不是唯一的,请参见ARM stack的这种情况(不涉及汇编指令)。
调用在堆栈上按 PC (一个字),作为堆栈指针0x16e
,它增加2,给出0x170
并且 PC 存储在0x170-0x171
处。 PSW (我假设是程序状态 Word )的内容相同,它存储在0x172-0x173
,堆栈指针指向0x172