堆栈指针是否在字节可寻址系统中以字或字节递增/递减?

时间:2015-07-03 08:45:42

标签: pointers assembly stack

给定一个字节可寻址系统。字大小(=寄存器大小)是2个字节。堆栈向上增长,当前堆栈指针为0x016E .CALL指令有两个字,操作码字和另一个是子程序的起始地址.CALL指令的工作原理如下:

i)将PC,PSW加载到堆栈中;

ii)在PC中加载子程序的起始地址。

CALL指令前的PC内容为0x5FA0(填充信息I' m假设)。执行CALL指令后堆栈指针的值是什么?

答案是0x172 所以这就是我无法解决的问题。 PC + PSW + CALL =堆栈上的8个字节。或者CALL指令是否未存储在堆栈中?很清楚会有一系列明确的事件。谢谢!

1 个答案:

答案 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指令的操作码为0xfffe0x5fa0的内存将是

...
0x5f9c ????
0x5f9e ????
0x5fa0 0xfffe <-- Call opcode
0x5fa2 0x1234 <-- Call operand
0x5fa4 ????
0x5fa6 ????
...

1 忽略此形容词,只是让示例更容易。

push 操作实际上是两个操作:

  1. 将两个添加到堆栈指针
  2. 将操作数存储在现在递增的堆栈指针地址
  3. 这就是我用文字淹没堆栈的原因。
    这种堆栈称为完全升序,因为堆栈指针朝向更高的地址增长并指向存储的最后一个字。
    我通过你给出的答案推断出这种堆栈,它不是唯一的,请参见ARM stack的这种情况(不涉及汇编指令)。

    调用在堆栈上按 PC (一个字),作为堆栈指针0x16e,它增加2,给出0x170并且 PC 存储在0x170-0x171处。 PSW (我假设是程序状态 Word )的内容相同,它存储在0x172-0x173,堆栈指针指向0x172