在32位的ARM架构系统中,通用寄存器中有一个寄存器比较特殊,就是r15,它也是PC寄存器。

PC是program counter。也叫做ip,instruction pointer。

当ARM处理器执行一条指令时,在其执行结束时可能会发生两件事。 如果指令没有修改pc,则pc只会增加4,因为在32位ARM中,指令为32位宽,所以每条指令之间有4个字节。 如果指令修改了pc,则使用pc的新值。当然64位的ARM就是增加8了每次指令过后。

如果一条指令确实将pc修改为例如pc + 4以外的其他值,那么可以运行该程序的另一条指令。 更改pc值的过程称为分支。 在ARM中,这是使用分支指令完成的。

      可以分为无条件分支和有条件分支。

无条件分支就是强制跳转了,我们主要来看下有条件分支。

有条件分支

这里涉及到一个寄存器cpsr(urrent Program Status Register)。

其包含条件flag:

N (negative), Z (zero), C (carry) and V (overflow)

N:如果指令结果为负数,则启用,否则禁用。

Z:如果指令的结果为零,则将启用。 如果非零,则禁用。

C:如果指令的结果产生的值需要完全表示第33位,则将启用C。 例如,加法溢出了32位整数范围。 对于减法,有一个特殊情况,即无借位减法使能C,否则将其禁用:否则,将较大的数减为较小的值将启用C,但如果反之亦然,则将其禁用。

V:如果指令结果产生的值不能用32位二进制补码表示,则将启用V。

汇编指令

32位示例

.text.global mainmain:    mov r1, #2       /* r1 ← 2 */    mov r2, #2       /* r2 ← 2 */    cmp r1, r2       /* update cpsr condition codes with the value of r1-r2 */    beq case_equal   /* branch to case_equal only if Z = 1 */case_different :    mov r0, #2       /* r0 ← 2 */    b end            /* branch to end */case_equal:    mov r0, #1       /* r0 ← 1 */end:    bx lr复制代码

as -g -o com.o com.s

ld -o com com.o

当r1和r2寄存器相等的时候才会跳转。

64位示例

我们再来看下64位的示例代码。

.arch armv8-a.global _start.text_start:    mov x1, #2       /* r1 ← 2 */    mov x2, #2       /* r2 ← 2 */    cmp x1, x2       /* update cpsr condition codes with the value of r1-r2 */    beq case_equal   /* branch to case_equal only if Z = 1 */case_different :    mov x0, #2       /* r0 ← 2 */    b end            /* branch to end */case_equal:    mov x0, #1       /* r0 ← 1 */mov x8, 93svc 0复制代码

as -g -o com64.o com64.s

ld -o com64 com64.o



©著作权归作者所有:来自51CTO博客作者wx607823dfcf6a9的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Nodejs 开发CLI必备基础依赖库
  2. volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意
  3. 工作常用的git指令
  4. mongodb的指令集
  5. 深度:RISC-V指令集架构和生态
  6. 【Linux】shell脚本实战-if多分支条件语句详解
  7. 在阿里,我们如何管理代码分支?
  8. VUE学习之常用指令2
  9. Linux之文件目录类指令基本使用

随机推荐

  1. Android 9 (P)系统启动之SystemServer大
  2. Android开发经验总结——ListView的使用
  3. 解决Android(安卓)Toobar与状态栏重叠
  4. Android的ListView控件滚动时背景问题
  5. Android 应用程序(APK) 如何获得系统签名
  6. libacc : Android 2.0 內建的輕量級 C Co
  7. Android学习及如何利用android来赚钱
  8. Android关于ViewPager+Fragment缓存问题
  9. Android 轻松实现语音识别的完整代码
  10. Android开发工程师 iOS开发工程师正在招