【问题标题】:Does the stack pointer increment/decrement in words or bytes in a byte addressable system?在字节可寻址系统中,堆栈指针是否以字或字节为单位递增/递减?
【发布时间】:2015-09-21 00:54:07
【问题描述】:

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

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

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

CALL指令前的PC内容为0x5FA0(我假设是填充信息)。CALL指令执行后堆栈指针的值是多少?

答案是 0x172。
所以这就是我无法解决的问题。 PC + PSW + CALL = 堆栈上的 8 个字节。或者 CALL 指令没有存储在堆栈上?一个明确的事件顺序将不胜感激。提前致谢!

【问题讨论】:

  • 为什么要在堆栈上存储调用指令?
  • 通常,调用函数时唯一存储在堆栈中的是返回地址(PC)。其他一切都是可选的。例如,x86 中的 CALL 指令只会将 EIP 压入堆栈。在 ARM 架构上,没有任何东西被压入堆栈。

标签: pointers assembly stack


【解决方案1】:

根据您给出的列出的规则,这应该发生

通话前

...
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调用操作码,在@987654326 @ 有 call 操作数。

假设call指令是这样的

call 0x1234

absolute1call 指令的操作码是0xfffe0x5fa0 的内存是

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

1忽略这个形容词,让例子更简单。

push操作其实是两个操作:

  1. 向堆栈指针添加两个
  2. 将操作数存储在现在递增的堆栈指针地址

这就是我用文字淹没堆栈的原因。
这种堆栈称为全升序,因为堆栈指针向更高地址增长并指向存储的最后一个字.
我根据您给出的答案推断出这种堆栈,它不是唯一的,请参阅ARM stack 这个案例(不涉及汇编指令)。

调用PC(一个单词)压入堆栈,作为堆栈指针 0x16e,它增加了两个,给出了0x170PC 存储在0x170-0x171PSW(我假设它是一个程序状态 Word)也是如此,它存储在0x172-0x173,堆栈指针指向0x172

【讨论】:

  • 谢谢!但我不清楚 0x5fa0 以后的操作码和操作数如何。
  • @VishnuNair 更新了答案,提供了有关呼叫说明的更多详细信息。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多