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

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

来源:本站整理 作者:佚名 时间:2017-07-14 TAG: 我要投稿
    addne r1, #3     @ else R1 = R1 + 3
    bkpt
.code16是在Thumb模式下执行的代码。这段代码中的条件执行前提是R0等于10。ADDEQ指令代表了如果条件满足,那么就执行R1=R1+2,ADDNE代表了不满足时候的情况。
分支指令
分支指令(也叫分支跳转)允许我们在代码中跳转到别的段。当我们需要跳到一些函数上执行或者跳过一些代码块时很有用。这部分的最佳例子就是条件跳转IF以及循环。先来看看IF分支。
.global main
main:
mov r1, #2 / 初始化 a /
mov r2, #3 / 初始化 b /
cmp r1, r2 / 比较谁更大些 /
blt r1_lower / 如果R2更大跳转到r1_lower /
mov r0, r1 / 如果分支跳转没有发生,将R1的值放到到R0 /
b end / 跳转到结束 /
r1_lower:
mov r0, r2 / 将R2的值放到R0 /
b end / 跳转到结束 /
end:
bx lr / THE END /
上面的汇编代码的含义就是找到较大的数,类似的C伪代码是这样的:
int main() {
int max = 0;
int a = 2;
int b = 3;
if(a
max = b;
}
else {
max = a;
}
return max;
}
再来看看循环中的条件分支:
.global main
main:
mov r0, #0 / 初始化 a /
loop:
cmp r0, #4 / 检查 a==4 /
beq end / 如果是则结束 /
add r0, r0, #1 / 如果不是则加1 /
b loop / 重复循环 /
end:
bx lr / THE END /
对应的C伪代码长这样子:
int main() {
int a = 0;
while(a
a= a+1;
}
return a;
}
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:
.code 32 @ ARM模式
add r2, pc, #1 @ PC+1放到R2
bx r2 @ 分支切换到R2
.code 16          @ Thumb模式
 mov r0, #1
上面的代码将当前的PC值加1存放到了R2中(此时PC指向其后两条指令的偏移处),通过BX跳转到了寄存器指向的位置,由于最低有效位为1,所以切换到Thumb模式执行。下面GDB调试的动图说明了这一切。

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

对应汇编代码如下:
.text
.global _start
_start:
mov r0, #2
mov r1, #2
add r0, r0, r1
cmp r0, #4
beq func1
add r1, #5
b func2
func1:
mov r1, r0
bx lr
func2:
mov r0, r1
bx lr
 

上一页  [1] [2] 

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