目录

一、跳转指令

方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址)

方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址

方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器

C语言的函数调用

二、ARM指令的条件码

2.1比较指令

2.2ARM指令集中大多数指令都可以带条件码后缀

2.3练习:用汇编语言实现以下逻辑

三、Load/Srore指令:访问(读写)内存

3.1写内存

3.2读内存

3.3读/写指定的数据类型

四、ARM指令的寻址方式

4.1立即寻址

4.2寄存器寻址

4.3寄存器移位寻址

4.4寄存器间接寻址

4.5基址加变址寻址

4.6基址加变址寻址的索引方式

4.6.1前索引

4.6.2后索引

4.6.3自动索引


一、跳转指令

实现程序的跳转本质上就是修改了PC寄存器的值

一般一个函数编译成的汇编指令在内存中是连续的

方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址)

@ MAIN:
        @ MOV R1, #1
        @ MOV R2, #2
        @ MOV R3, #3
        @ MOV PC, #0x18
        @ MOV R4, #4
        @ MOV R5, #5    
@ FUNC:
        @ MOV R6, #6
        @ MOV R7, #7
        @ MOV R8, #8

方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址

@ MAIN:
        @ MOV R1, #1
        @ MOV R2, #2
        @ MOV R3, #3
        @ B   FUNC
        @ MOV R4, #4
        @ MOV R5, #5    
@ FUNC:
        @ MOV R6, #6
        @ MOV R7, #7
        @ MOV R8, #8


方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器

@ MAIN:
        @ MOV R1, #1
        @ MOV R2, #2
        @ MOV R3, #3
        @ BL  FUNC
        @ MOV R4, #4
        @ MOV R5, #5    
@ FUNC:
        @ MOV R6, #6
        @ MOV R7, #7
        @ MOV R8, #8
        @ MOV PC, LR
        @ 程序返回

C语言的函数调用

二、ARM指令的条件码

2.1比较指令

@ CMP指令的本质就是一条减法指令(SUBS),只是没有将运算结果存入目标寄存器


        @ MOV R1, #1
        @ MOV R2, #2
        @ CMP R1, R2
        @ BEQ FUNC    
        @ 执行逻辑:if(EQ){B FUNC}    本质:if(Z==1){B FUNC}
        @ BNE FUNC    
        @ 执行逻辑:if(NE){B FUNC}    本质:if(Z==0){B FUNC}
        @ MOV R3, #3
        @ MOV R4, #4
        @ MOV R5, #5
@ FUNC:
        @ MOV R6, #6
        @ MOV R7, #7

R1 和 R2不相等,并没有跳转,相等时发生跳转

 换成BNE跳不了了

2.2ARM指令集中大多数指令都可以带条件码后缀


        @ MOV R1, #1
        @ MOV R2, #2
        @ CMP R1, R2
        @ MOVGT R3, #3

C语言翻译成汇编

2.3练习:用汇编语言实现以下逻辑

@ int R1 = 9;
            @ int R2 = 15;
        @ START:
            @ if(R1 == R2)
            @ {
            @     STOP();
            @ }
            @ else if(R1 > R2)
            @ {            
            @     R1 = R1 - R2;
            @     goto START;
            @ }
            @ else
            @ {
            @     R2 = R2 - R1;
            @    goto START;
            @ }

我的答案比较笨,也许是病没好的事

.text
.global _start
 
_start:

MOV R1, #9
    MOV R2, #15
START:
    CMP R1, R2
    BEQ STOP
    BHI FUNC
    SUB R2, R2, R1
    B START
STOP:
    B STOP
FUNC:
    SUB R1, R1, R2
    B START
    
.end

老师的就简便多了

@ 练习答案
        MOV R1, #9
        MOV R2, #15
START:
        CMP R1,R2
        BEQ STOP
        SUBGT R1, R1, R2
        SUBLT R2, R2, R1
        B START
STOP:                
        B STOP

三、Load/Srore指令:访问(读写)内存

一般LD开头的指令将指令从内存读到CPU,ST开头的指令将CPU的指令拿到内存。

在debug模式下单击Memory map,可以告诉我们当前芯片每段的权限

3.1写内存

@ MOV R1, #0xFF000000
        @ MOV R2, #0x40000000
        @ STR R1, [R2] 
        @ 将R1寄存器中的数据写入到R2指向的内存空间

同时验证了ARM是小端对齐的

数据是几个字节数据的起始地址就是几的整数倍

3.2读内存

@ LDR R3, [R2]
        @ 将R2指向的内存空间中的数据读取到R3寄存器

3.3读/写指定的数据类型

@ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x40000000
        @ STRB R1, [R2]
        @ 将R1寄存器中的数据的Bit[7:0]写入到R2指向的内存空间
        @ STRH R1, [R2]     
        @ 将R1寄存器中的数据的Bit[15:0]写入到R2指向的内存空间
        @ STR  R1, [R2]     
        @ 将R1寄存器中的数据的Bit[31:0]写入到R2指向的内存空间
        
        @ LDR指令同样支持以上后缀

四、ARM指令的寻址方式

寻址方式就是CPU去寻找操作数的方式

4.1立即寻址

@ MOV R1, #1
        @ ADD R1, R2, #1

4.2寄存器寻址

@ ADD R1, R2, R3

4.3寄存器移位寻址

@ MOV R1, R2, LSL #1

4.4寄存器间接寻址

@ STR R1, [R2]

4.5基址加变址寻址

@ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x40000000
        @ MOV R3, #4
        @ STR R1, [R2,R3]
        @ 将R1寄存器中的数据写入到R2+R3指向的内存空间(以R2为基地址偏移R3的数量)
        @ STR R1, [R2,R3,LSL #1]
        @ 将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间

4.6基址加变址寻址的索引方式

4.6.1前索引

@ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x40000000
        @ STR R1, [R2,#8]
        @ 将R1寄存器中的数据写入到R2+8指向的内存空间

4.6.2后索引

@ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x40000000
        @ STR R1, [R2],#8
        @ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8

4.6.3自动索引

@ MOV R1, #0xFFFFFFFF
        @ MOV R2, #0x40000000
        @ STR R1, [R2,#8]!
        @ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
        
        @ 以上寻址方式和索引方式同样适用于LDR

ARM指令——跳转指令相关推荐

  1. ARM 指令集跳转指令

    一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...

  2. ARM中跳转指令BL/BLX偏移值计算规则

    源文地址:http://www.cnblogs.com/Reyzal/p/4857948.html 1. 4字节对齐arm指令 规则:偏移=( 跳转地址-(指令地址+8) )/4 原因: 指令地址 + ...

  3. 汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

    文章目录 1 nop 指令 2 现场保护指令 2.1 push 与 pop 2.2 pushad 与 popad 2.3 pushfd 与 popfd 3 内存操作 3.1 mov指令 3.2 mov ...

  4. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

    文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...

  5. ARM汇编之跳转指令

    ARM汇编语言之跳转指令 前言 ARM架构在当今主流的芯片中无论是MCU还是SOC都占有很大的市场,因此基于ARM架构的汇编语言对于嵌入式软件开发人员而言,其实也是一项必须掌握的基本功. " ...

  6. ARM汇编指令(ARM寻址方式、汇编指令、伪指令

    1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...

  7. 逆向知识内存ARM常用的汇编指令合集

    ARM   处理器的指令集可以分为 跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令  六大指令,这里把其它几个指令一起发了出来,可以查看具体的目录 ...

  8. ARM指令集复习 | 基本指令用法

    文章目录 1.ARM指令集概述 2.ARM的寻址方式 2.1 立即寻址 2.2 寄存器寻址 2.3 多寄存器及块拷贝寻址 2.4 堆栈寻址 2.5 相对寻址 3.ARM指令集 3.1 存储器访问(L/ ...

  9. arm 跳转指令跳转范围

    B 和 BL 指令都是 相对跳转(短跳转) 指令,通过偏移量跳转, 最大跳转距离是 ±32M 使用 mov pc, <>可以实现 对跳转(长跳转)(不会保存当前 PC 值) 关于B指令和B ...

最新文章

  1. curl php 空,直接访问链接有数据,CURL GET 一片空白
  2. AJAX推送与拉取方式的比较
  3. python 在不同层级目录import 模块的方法
  4. Linux与Windows中动态链接库的分析与对比
  5. JDBC 连接MYSQL数据库
  6. transactional注解的使用_Java:Spring @Transactional工作原理
  7. 子网掩码、最大主机、最大子网数的计算
  8. gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
  9. IOS::.a的生成,以及模拟器和真机.a 的合并
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的会员管理系统
  11. python爬虫requests简单案例_python网络爬虫(三)requests库的13个控制访问参数及简单案例...
  12. pycharm调试GreenOdoo
  13. nfc卡模式与标准模式_干货丨NFC最全解析
  14. PTA 数据结构与算法题目集(中文) 7-49 打印学生选课清单 (25分)题解
  15. 谷歌邮箱lmap服务器填什么_Gmail/QQ邮箱/163邮箱等各大邮箱IMAP/SMTP/POP3地址
  16. IOS捷径早安,创建自动化可实现自动化叫醒
  17. multisim红绿灯元器件在哪里_基于Multisim的红绿灯控制器仿真实现
  18. 用 PHP 来刷leetCode 之 三数之和
  19. background-image属性
  20. 3.2 CMMI3级——需求开发(Requirements Development)

热门文章

  1. excel多组数据散点图生成
  2. PDO连接数据库及DSN详解
  3. s盒密码c语言源代码csdn,AES中S盒的c语言实现及代码
  4. 大数据计算,如何优化SQL?
  5. 跨跃平台交流无极限——linux下如何使用即时聊天工具,跨跃平台 交流无极限——Linux下如何使用即时聊天工具(一)...
  6. Comsol软件入门基础教学
  7. android图片美化开源,GitHub - xingxing-yan/BLImage: Android中美化图片的库。功能包括滤镜,贴纸,标签,裁剪,涂鸦,亮度,饱和度,对比度,马赛克等功能...
  8. 有道 linux 安装路径,「Linux」- 安装有道词典
  9. undefinednbsp;methodnbsp;`titl…
  10. HTTP状态码1xx到5xx