欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

ARM 汇编基础速成6:条件执行与分支

来源:本站整理 作者:佚名 时间:2017-07-14 TAG: 我要投稿

条件执行
在之前讨论CPSR寄存器那部分时,我们大概提了一下条件执行这个词。条件执行用来控制程序执行跳转,或者满足条件下的特定指令的执行。相关条件在CPSR寄存器中描述。寄存器中的比特位的变化决定着不同的条件。比如说当我们比较两个数是否相同时,我们使用的Zero比特位(Z=1),因为这种情况下发生的运算是a-b=0。在这种情况下我们就满足了EQual的条件。如果第一个数更大些,我们就满足了更大的条件Grater Than或者相反的较小Lower Than。条件缩写都是英文首字母缩写,比如小于等于Lower Than(LE),大于等于Greater Equal(GE)等。
下面列表是各个条件的含义以及其检测的状态位(条件指令都是其英文含义的缩写,为了便于记忆不翻译了):

我们使用如下代码来实践条件执行相加指令:
.global main
main:
        mov     r0, #2     /* 初始化值 */
        cmp     r0, #3     /* 将R0和3相比做差,负数产生则N位置1 */
        addlt   r0, r0, #1 /* 如果小于等于3,则R0加一 */
        cmp     r0, #3     /* 将R0和3相比做差,零结果产生则Z位置一,N位置恢复为0 */
        addlt   r0, r0, #1 /* 如果小于等于3,则R0加一R0 IF it was determined that it is smaller (lower than) number 3 */
        bx      lr
上面代码段中的第一条CMP指令将N位置一同时也就指明了R0比3小。之后ADDLT指令在LT条件下执行,对应到CPSR寄存器的情况时V与N比特位不能相同。在执行第二条CMP前,R0=3。所以第二条置了Z位而消除了N位。所以ADDLT不会执行R0也不会被修改,最终程序结果是3。
Thumb模式中的条件执行
在指令集那篇文章中我们谈到了不同的指令集,对于Thumb中,其实也有条件执的(Thumb-2中有)。有些ARM处理器版本支持IT指令,允许在Thumb模式下条件执行最多四条指令。
相关引用:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABIJDIC.html
指令格式:Syntax: IT{x{y{z}}} cond
cond 代表在IT指令后第一条条件执行执行指令的需要满足的条件。
x 代表着第二条条件执行指令要满足的条件逻辑相同还是相反。
y 代表着第三条条件执行指令要满足的条件逻辑相同还是相反。
z 代表着第四条条件执行指令要满足的条件逻辑相同还是相反。
IT指令的含义是“IF-Then-(Else)”,跟这个形式类似的还有:
IT,If-Then,接下来的一条指令条件执行。
ITT,If-Then-Then,接下来的两条指令条件执行。
ITE,If-Then-Else,接下来的两条指令条件执行。
ITTE,If-Then-Then-Else,接下来的三条指令条件执行。
ITTEE,If-Then-Then-Else-Else,接下来的四条指令条件执行。
在IT块中的每一条条件执行指令必须是相同逻辑条件或者相反逻辑条件。比如说ITE指令,第一条和第二条指令必须使用相同的条件,而第三条必须是与前两条逻辑上相反的条件。这有一些ARM reference上的例子:
ITTE   NE           ; 后三条指令条件执行
ANDNE  R0, R0, R1   ; ANDNE不更新条件执行相关flags
ADDSNE R2, R2, #1   ; ADDSNE更新条件执行相关flags
MOVEQ  R2, R3       ; 条件执行的move
ITE    GT           ; 后两条指令条件执行
ADDGT  R1, R0, #55  ; GT条件满足时执行加
ADDLE  R1, R0, #48  ; GT条件不满足时执行加
ITTEE  EQ           ; 后两条指令条件执行
MOVEQ  R0, R1       ; 条件执行MOV
ADDEQ  R2, R2, #10  ; 条件执行ADD
ANDNE  R3, R3, #1   ; 条件执行AND
BNE.W  dloop        ; 分支指令只能在IT块的最后一条指令中使用
错误的格式:
IT     NE           ; 下一条指令条件执行
ADD    R0, R0, R1   ; 格式错误:没有条件指令
下图是条件指令后缀含义以及他们的逻辑相反指令:

让我们试试下面这段代码:
.syntax unified    @ 这很重要!
.text
.global _start
_start:
    .code 32
    add r3, pc, #1   @ R3=pc+1
    bx r3            @ 分支跳转到R3并且切换到Thumb模式下由于最低比特位为1
    .code 16         @ Thumb模式
    cmp r0, #10     
    ite eq           @ if R0 == 10
    addeq r1, #2     @ then R1 = R1 + 2

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载