ARM程序集SVC调用 - 与使用LDRH获取SVC指令相混淆

时间:2017-10-27 01:07:54

标签: assembly arm

我正在尝试理解我的书中的SVC汇编代码。我得到了一切,直到LDRH部分。

SVC_Handler PROC
     EXPORT SVC_Handler
     CPSID I
     PUSH {r4-r8, lr}

     MRS r7, psp
     LDR r8,[r7, #24] ; gets SVC instruction address from PC
     LDRH r8,[r8, #-2] ;How come it's -2?
     BIC r8,r8,#0xFF00
     ....

本书使用压入堆栈的PC来获取SVC指令。令我困惑的是,该书说在进入SVC_Handler之前PC已经指向SVC指令。这是真的,如果这是为什么有-2?如果它是PC-2,那么在SVC之前不会得到指令吗?由于SVC指令是Thumb,它是PC-2,因为下一条指令(在PC更新之后)实际上是在SVC指令之后吗?这是我如何将其可视化的图纸。我正在使用TM4C123GX,Cortex M4。谢谢!

Where is PC pointing to?

2 个答案:

答案 0 :(得分:0)

许多架构在传输执行(调用函数或服务中断)时,会将 next 指令的地址放在堆栈上,以便返回那里。

这几乎可以肯定这里发生了什么,这就是为什么你减去这两个来获取导致这种传输的代码的地址。

唯一的问题是为什么评论似乎是错误的,一旦你重组它们就会立即显而易见:

MRS r7, psp

; Gets SVC instruction address from stack.
LDR  r8,[r7, #24]
LDRH r8,[r8, #-2]

; Carry on with other stuff.

换句话说,评论适用于两个行,而不仅仅是第一行。第一个将给出您将返回的指令的地址,第二个将调整它以引用调用指令。

答案 1 :(得分:0)

正如指出的那样,在执行指向下一条指令的指令期间,程序计数器是非常典型的,如果你回到每个指令方法的线性多个时钟,它必须使用pc作为地址来获取所有内容在内存中,它无法开始执行或至少完成,直到获取指令的所有部分。武器电脑在这一点上是假的,但假装是有道理的。如果您阅读本手册,它会告诉您返回的具体指令,例如,arm指令集将从链接寄存器中减去4以重新运行该指令。对于手臂大小是一个指令。对于拇指或经典拇指指令,它是16位或2个字节。

作为一个皮质你是安全的,因为看起来只有一个拇指指令编码为svc(到目前为止我没有看到拇指-2扩展),所以你可以回来提取编码值。虽然你有拇指和手臂,但不是在皮层上,并且很难确定你在多长时间内尝试找到编码的即时模式的模式,非常不值得,而是使用寄存器来指示该函数不是指令中的编码,或者是一个系统级规则,您必须始终使用其中一种编码进行svc。

他们在这里做的就是备份当前指令并从指令中提取立即数。