Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【系列分享】ARM 汇编基础速成6:条件执行与分支

0
0
【系列分享】ARM 汇编基础速成6:条件执行与分支

2017-07-13 19:02:40

阅读:939次
点赞(0)
收藏
来源: azeria-labs.com





【系列分享】ARM 汇编基础速成6:条件执行与分支

作者:arnow117





【系列分享】ARM 汇编基础速成6:条件执行与分支

译者:arnow117

预估稿费:160RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【系列分享】ARM 汇编基础速成1:ARM汇编以及汇编语言基础介绍

【系列分享】ARM 汇编基础速成2:ARM汇编中的数据类型

【系列分享】ARM 汇编基础速成3:ARM模式与THUMB模式

【系列分享】ARM 汇编基础速成4:ARM汇编内存访问相关指令

【系列分享】ARM 汇编基础速成5:连续存取


条件执行

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

下面列表是各个条件的含义以及其检测的状态位(条件指令都是其英文含义的缩写,为了便于记忆不翻译了):


【系列分享】ARM 汇编基础速成6:条件执行与分支

我们使用如下代码来实践条件执行相加指令:

.globalmain main: movr0,#2/*初始化值*/ cmpr0,#3/*将R0和3相比做差,负数产生则N位置1*/ addltr0,r0,#1/*如果小于等于3,则R0加一*/ cmpr0,#3/*将R0和3相比做差,零结果产生则Z位置一,N位置恢复为0*/ addltr0,r0,#1/*如果小于等于3,则R0加一R0IFitwasdeterminedthatitissmaller(lowerthan)number3*/ bxlr

上面代码段中的第一条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上的例子:

ITTENE;后三条指令条件执行 ANDNER0,R0,R1;ANDNE不更新条件执行相关flags ADDSNER2,R2,#1;ADDSNE更新条件执行相关flags MOVEQR2,R3;条件执行的move ITEGT;后两条指令条件执行 ADDGTR1,R0,#55;GT条件满足时执行加 ADDLER1,R0,#48;GT条件不满足时执行加 ITTEEEQ;后两条指令条件执行 MOVEQR0,R1;条件执行MOV ADDEQR2,R2,#10;条件执行ADD ANDNER3,R3,#1;条件执行AND BNE.Wdloop;分支指令只能在IT块的最后一条指令中使用

错误的格式:

ITNE;下一条指令条件执行 ADDR0,R0,R1;格式错误:没有条件指令

下图是条件指令后缀含义以及他们的逻辑相反指令:


【系列分享】ARM 汇编基础速成6:条件执行与分支

让我们试试下面这段代码:

.syntaxunified@这很重要! .text .global_start _start: .code32 addr3,pc,#1@R3=pc+1 bxr3@分支跳转到R3并且切换到Thumb模式下由于最低比特位为1 .code16@Thumb模式 cmpr0,#10 iteeq@ifR0==10 addeqr1,#2@thenR1=R1+2 addner1,#3@elseR1=R1+3 bkpt

.code16是在Thumb模式下执行的代码。这段代码中的条件执行前提是R0等于10。ADDEQ指令代表了如果条件满足,那么就执行R1=R1+2,ADDNE代表了不满足时候的情况。


分支指令

分支指令(也叫分支跳转)允许我们在代码中跳转到别的段。当我们需要跳到一些函数上执行或者跳过一些代码块时很有用。这部分的最佳例子就是条件跳转IF以及循环。先来看看IF分支。

.globalmain main: movr1,#2/初始化a/ movr2,#3/初始化b/ cmpr1,r2/比较谁更大些/ bltr1_lower/如果R2更大跳转到r1_lower/ movr0,r1/如果分支跳转没有发生,将R1的值放到到R0/ bend/跳转到结束/ r1_lower: movr0,r2/将R2的值放到R0/ bend/跳转到结束/ end: bxlr/THEEND/

上面的汇编代码的含义就是找到较大的数,类似的C伪代码是这样的:

intmain(){ intmax=0; inta=2; intb=3; if(a<b){ max=b; } else{ max=a; } returnmax; }

再来看看循环中的条件分支:

.globalmain main: movr0,#0/初始化a/ loop: cmpr0,#4/检查a==4/ beqend/如果是则结束/ addr0,r0,#1/如果不是则加1/ bloop/重复循环/ end: bxlr/THEEND/

对应的C伪代码长这样子:

intmain(){ inta=0; while(a<4){ a=a+1; } returna; }

B/BX/BLX

有三种类型的分支指令:

Branch(B)

简单的跳转到一个函数

Branch link(BL)

将下一条指令的入口(PC+4)保存到LR,跳转到函数

Branch exchange(BX) 以及 Branch link exchange(BLX)

与B/BL相同,外加执行模式切换(ARM与Thumb)

需要寄存器类型作为第一操作数:BX/BLX reg

BX/BLX指令被用来从ARM模式切换到Thumb模式。

.text .global_start _start: .code32@ARM模式 addr2,pc,#1@PC+1放到R2 bxr2@分支切换到R2 .code16@Thumb模式 movr0,#1

上面的代码将当前的PC值加1存放到了R2中(此时PC指向其后两条指令的偏移处),通过BX跳转到了寄存器指向的位置,由于最低有效位为1,所以切换到Thumb模式执行。下面GDB调试的动图说明了这一切。


【系列分享】ARM 汇编基础速成6:条件执行与分支

条件分支指令

条件分支指令是指在满足某种特定条件下的跳转指令。指令模式是跳转指令后加上条件后缀。我们用BEQ来举例吧。下面这段汇编代码对一些值做了操作,然后依据比较结果进行条件分支跳转。


【系列分享】ARM 汇编基础速成6:条件执行与分支

对应汇编代码如下:

.text .global_start _start: movr0,#2 movr1,#2 addr0,r0,r1 cmpr0,#4 beqfunc1 addr1,#5 bfunc2 func1: movr1,r0 bxlr func2: movr0,r1 bxlr

传送门

【系列分享】ARM 汇编基础速成1:ARM汇编以及汇编语言基础介绍

【系列分享】ARM 汇编基础速成2:ARM汇编中的数据类型

【系列分享】ARM 汇编基础速成3:ARM模式与THUMB模式

【系列分享】ARM 汇编基础速成4:ARM汇编内存访问相关指令

【系列分享】ARM 汇编基础速成5:连续存取




【系列分享】ARM 汇编基础速成6:条件执行与分支
【系列分享】ARM 汇编基础速成6:条件执行与分支
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://azeria-labs.com/arm-conditional-execution-and-branching-part-6/

Viewing all articles
Browse latest Browse all 12749