ARM指令——跳转指令
目录
一、跳转指令
方式一:直接修改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指令——跳转指令相关推荐
- ARM 指令集跳转指令
一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...
- ARM中跳转指令BL/BLX偏移值计算规则
源文地址:http://www.cnblogs.com/Reyzal/p/4857948.html 1. 4字节对齐arm指令 规则:偏移=( 跳转地址-(指令地址+8) )/4 原因: 指令地址 + ...
- 汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式
文章目录 1 nop 指令 2 现场保护指令 2.1 push 与 pop 2.2 pushad 与 popad 2.3 pushfd 与 popfd 3 内存操作 3.1 mov指令 3.2 mov ...
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...
- ARM汇编之跳转指令
ARM汇编语言之跳转指令 前言 ARM架构在当今主流的芯片中无论是MCU还是SOC都占有很大的市场,因此基于ARM架构的汇编语言对于嵌入式软件开发人员而言,其实也是一项必须掌握的基本功. " ...
- ARM汇编指令(ARM寻址方式、汇编指令、伪指令
1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...
- 逆向知识内存ARM常用的汇编指令合集
ARM 处理器的指令集可以分为 跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令 六大指令,这里把其它几个指令一起发了出来,可以查看具体的目录 ...
- ARM指令集复习 | 基本指令用法
文章目录 1.ARM指令集概述 2.ARM的寻址方式 2.1 立即寻址 2.2 寄存器寻址 2.3 多寄存器及块拷贝寻址 2.4 堆栈寻址 2.5 相对寻址 3.ARM指令集 3.1 存储器访问(L/ ...
- arm 跳转指令跳转范围
B 和 BL 指令都是 相对跳转(短跳转) 指令,通过偏移量跳转, 最大跳转距离是 ±32M 使用 mov pc, <>可以实现 对跳转(长跳转)(不会保存当前 PC 值) 关于B指令和B ...
最新文章
- curl php 空,直接访问链接有数据,CURL GET 一片空白
- AJAX推送与拉取方式的比较
- python 在不同层级目录import 模块的方法
- Linux与Windows中动态链接库的分析与对比
- JDBC 连接MYSQL数据库
- transactional注解的使用_Java:Spring @Transactional工作原理
- 子网掩码、最大主机、最大子网数的计算
- gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
- IOS::.a的生成,以及模拟器和真机.a 的合并
- 基于JAVA+SpringMVC+Mybatis+MYSQL的会员管理系统
- python爬虫requests简单案例_python网络爬虫(三)requests库的13个控制访问参数及简单案例...
- pycharm调试GreenOdoo
- nfc卡模式与标准模式_干货丨NFC最全解析
- PTA 数据结构与算法题目集(中文) 7-49 打印学生选课清单 (25分)题解
- 谷歌邮箱lmap服务器填什么_Gmail/QQ邮箱/163邮箱等各大邮箱IMAP/SMTP/POP3地址
- IOS捷径早安,创建自动化可实现自动化叫醒
- multisim红绿灯元器件在哪里_基于Multisim的红绿灯控制器仿真实现
- 用 PHP 来刷leetCode 之 三数之和
- background-image属性
- 3.2 CMMI3级——需求开发(Requirements Development)
热门文章
- excel多组数据散点图生成
- PDO连接数据库及DSN详解
- s盒密码c语言源代码csdn,AES中S盒的c语言实现及代码
- 大数据计算,如何优化SQL?
- 跨跃平台交流无极限——linux下如何使用即时聊天工具,跨跃平台 交流无极限——Linux下如何使用即时聊天工具(一)...
- Comsol软件入门基础教学
- android图片美化开源,GitHub - xingxing-yan/BLImage: Android中美化图片的库。功能包括滤镜,贴纸,标签,裁剪,涂鸦,亮度,饱和度,对比度,马赛克等功能...
- 有道 linux 安装路径,「Linux」- 安装有道词典
- undefinednbsp;methodnbsp;`titl…
- HTTP状态码1xx到5xx