首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM程序集SVC调用--对用LDRH获取SVC指令的困惑

ARM程序集SVC调用--对用LDRH获取SVC指令的困惑
EN

Stack Overflow用户
提问于 2017-10-27 01:07:54
回答 2查看 1.1K关注 0票数 0

我正在努力理解我为SVC编写的汇编代码。我得到了所有的东西直到LDRH部分。

代码语言:javascript
复制
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指令。令我困惑的是,书中说PC在进入SVC_Handler之前已经指向SVC指令了。这是真的吗,如果是的话,为什么会有a-2?如果是PC-2,那会在SVC之前得到指令吗?既然SVC指令是大拇指,那么PC-2是因为下一条指令(在PC更新后)实际上是在SVC指令之后吗?这是一幅我是如何想象它的图画。我用的是TM4C123GX,皮质M4。谢谢!

PC指向哪里?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-27 01:31:53

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

这几乎肯定是发生了什么,这就是为什么你减去两者,得到导致这种传输的代码的地址。

那么,唯一的问题是,为什么这些评论似乎是错误的,一旦你对它们进行重组,这些评论就会立即显现出来:

代码语言:javascript
复制
MRS r7, psp

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

; Carry on with other stuff.

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

票数 0
EN

Stack Overflow用户

发布于 2017-10-27 02:48:05

正如所指出的,对于程序计数器来说,在执行一条指令时指向下一条指令是非常典型的,如果每条指令返回到一个线性的多个时钟,那么它必须使用pc作为地址来获取所有东西,它不能开始执行,或者至少要完成所有指令的所有部分。手臂电脑在这一点上是假的,但假象是有道理的。如果您阅读手册,它会告诉您返回的特定指令,也就是说,arm指令集将从链接寄存器中减去4,以重新运行指令。对手臂大小来说是一条指令。对于拇指或经典的拇指指令,它是16位或两个字节。

作为一个皮质-m,你是安全的,因为它似乎只有一个拇指指令编码为svc (据我所见没有拇指-2扩展),所以你可以回去提取编码的值。不是在大脑皮层--尽管你有大拇指和手臂,而且很难确定你在多远的时间里试图找到编码的即时模式,而不是用寄存器来表示指令中没有编码的函数,或者制定一个系统级规则,你必须始终使用其中的编码之一svc。

他们在这里所做的就是备份到当前的指令,并从指令中提取直接的指令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46966021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档