堆栈指针 increment/decrement 在字节寻址系统中是字还是字节?
Does the stack pointer increment/decrement in words or bytes in a byte addressable system?
给定一个可寻址的字节 system.Say 字大小(=寄存器大小)为 2 bytes.The 堆栈向上增长,当前堆栈指针位于 0x016E.The CALL 指令是两个字,操作码字和另一个是subroutine.The CALL指令的起始地址工作如下:
i)加载PC,PSW入栈;
ii)加载PC中子程序的起始地址
CALL指令前的PC内容是0x5FA0(我假设是filler info)。CALL指令执行后栈指针的值是多少?
答案是0x172。
所以这就是我无法解决的问题。 PC + PSW + CALL = stack.Or 上的 8 个字节 CALL 指令是否未存储在堆栈中?一个清晰的事件顺序会提前很多appreciated.Thanks!
根据您给出的列出的规则,这应该会发生
调用前
...
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
...
当我使用向下增长的堆栈时,我已经用向底部增加的地址淹没了堆栈,但堆栈实际上在增长。
压入堆栈的 return 地址是 0x5fa4
因为例程必须 return 在 调用之后和 0x5fa0-0x5fa1
有 call 操作码,在 0x5fa2-0x5fa3
处有 call 操作数。
假设call指令是这个
call 0x1234
并且 absolute1 call
指令的操作码是 0xfffe
。 0x5fa0
处的内存将是
...
0x5f9c ????
0x5f9e ????
0x5fa0 0xfffe <-- Call opcode
0x5fa2 0x1234 <-- Call operand
0x5fa4 ????
0x5fa6 ????
...
1忽略这个形容词,只是让例子更简单。
push操作其实就是两个操作:
- 栈指针加2
- 将操作数存储在现在递增的堆栈指针地址
这就是我用文字淹没堆栈的原因。
这种堆栈称为全升序,因为堆栈指针向更高地址增长并指向存储的最后一个字。
我是根据你的回答推断出这种栈的,不是唯一的,ARM stack(不涉及汇编指令)见本例。
call push PC,一个word,在栈上,作为栈指针0x16e
递增通过两个给出 0x170
和 PC 存储在 0x170-0x171
。 PSW(我假设是一个程序状态 Word)也是一样,它存储在 0x172-0x173
中,堆栈指针指向在 0x172
.
给定一个可寻址的字节 system.Say 字大小(=寄存器大小)为 2 bytes.The 堆栈向上增长,当前堆栈指针位于 0x016E.The CALL 指令是两个字,操作码字和另一个是subroutine.The CALL指令的起始地址工作如下:
i)加载PC,PSW入栈;
ii)加载PC中子程序的起始地址
CALL指令前的PC内容是0x5FA0(我假设是filler info)。CALL指令执行后栈指针的值是多少?
答案是0x172。
所以这就是我无法解决的问题。 PC + PSW + CALL = stack.Or 上的 8 个字节 CALL 指令是否未存储在堆栈中?一个清晰的事件顺序会提前很多appreciated.Thanks!
根据您给出的列出的规则,这应该会发生
调用前
...
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
...
当我使用向下增长的堆栈时,我已经用向底部增加的地址淹没了堆栈,但堆栈实际上在增长。
压入堆栈的 return 地址是 0x5fa4
因为例程必须 return 在 调用之后和 0x5fa0-0x5fa1
有 call 操作码,在 0x5fa2-0x5fa3
处有 call 操作数。
假设call指令是这个
call 0x1234
并且 absolute1 call
指令的操作码是 0xfffe
。 0x5fa0
处的内存将是
...
0x5f9c ????
0x5f9e ????
0x5fa0 0xfffe <-- Call opcode
0x5fa2 0x1234 <-- Call operand
0x5fa4 ????
0x5fa6 ????
...
1忽略这个形容词,只是让例子更简单。
push操作其实就是两个操作:
- 栈指针加2
- 将操作数存储在现在递增的堆栈指针地址
这就是我用文字淹没堆栈的原因。
这种堆栈称为全升序,因为堆栈指针向更高地址增长并指向存储的最后一个字。
我是根据你的回答推断出这种栈的,不是唯一的,ARM stack(不涉及汇编指令)见本例。
call push PC,一个word,在栈上,作为栈指针0x16e
递增通过两个给出 0x170
和 PC 存储在 0x170-0x171
。 PSW(我假设是一个程序状态 Word)也是一样,它存储在 0x172-0x173
中,堆栈指针指向在 0x172
.