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

1、ARM指令集概述

特点

【特点】:
	- RISC,译码机制简单;
	- 程序的启动从ARM指令集开始,进入异常转化为ARM状态,运行ARM指令集指令;

在这里插入图片描述
指令格式

<opcode>{<cond>}{S} <Rd>, <Rn> {,<operand2>}
opcode:操作码(指令助记符)如B,STR;
cond:可选择的条件码,执行条件,如NE,EQ;
S:若有S后缀,则根据计算结果更新CPSR中的条件码;
Rd:目标寄存器;
Rn:存放第一个操作数的寄存器;
operand2:第二个操作数;

条件指令
在这里插入图片描述

2、ARM的寻址方式

2.1 立即寻址
操作数包含在指令的32位机器编码中;
	- 在指令中,立即数作为操作数2出现,编码格式中仅安排12位空间(8位常数和4位循环右移植),32位立即数显然不能直接编码;
	- 12位编码包括8位常数和4位循环右移值,由8位常数循环右移4位值的2倍得到最后的32位立即数;

在这里插入图片描述

#代表立即数;

在这里插入图片描述

2.2 寄存器寻址
操作符存放在寄存器中;

【注意】:
第二个操作数为寄存器时方可进行移位操作,移位数可以是五位立即数或某个寄存器内的数值,执行完毕后第二操作数寄存器中的数值并不改变;

【位移方式】:
LSL:逻辑左移(乘);
LSR:逻辑右移(除);
ASL:算数左移,和LSL一样;
ASR:算数右移,分正负来填充右移后的空余位,正0负1;
ROR:循环右移;
RRX:带扩展的循环右移,循环右移1位后左端用C填充,这种方式只移位1位,所以无须指定移位位数;

在这里插入图片描述
寄存器间接寻址

利用寄存器的值作为存储器指针,数据传送类的load/store类指令都使用寄存器间接寻址方式;
	- 间接寻址加上[];

在这里插入图片描述

基址加偏移地址
在这里插入图片描述
在这里插入图片描述

2.3 多寄存器及块拷贝寻址
一条指令完成多字数据或数据块的传送;
	- LDM/STM;
【基址寄存器变化】:
IA:操作完后地址递增;
IB:地址先增后完成操作;
DA:操作完后地址递减;
DB:地址先减后完成操作;
多寄存器用{}包含,连续寄存器使用-间隔,否则使用,分隔; 

在这里插入图片描述
在这里插入图片描述

2.4 堆栈寻址
存储空间中的数据栈与寄存器组之间的批量数据传输,采用R13(SP)作为堆栈指针,采用FILO(先进后出)的方式工作,SP指向栈顶;
	- LDM/STM;
【堆栈组织生长方式】:
	- FD/ED:满递减/空递减;
	- FA/EA:满递增/空递增;

在这里插入图片描述

在这里插入图片描述

2.5 相对寻址
将程序计数器PC作为基址寄存器,指令中的地址标号字段作为偏移量进行寻址,跳转指令采用相对寻址方式;

3、ARM指令集

3.1 存储器访问(L/S)指令
【常规】
LDR R2, [R5] ;将R5为地址的存储单元中数据加载至R2;
STR R1, [R0, #0x04]	;mem32[R0+4]<-R1

【传送数据类型】
LDRB R3, [R2], #1	;以R2为地址读取一字节数据至R3
STRH R1, [R0, #2]!	;半字传送,传送R1中低两字节数据至R0+2为地址的存储单元,R0更新
3.2 数据处理类指令

数据传送指令

MOV R1, R0	;R1<-R0
MOV R1, R0, LSL #3	;R1<-R0*8
MVN R0, #0	;立即数0取反传送至R0, R0=-1

算数逻辑运算指令

64位整数加法】:
RO/R1与R2/R3分别存放两个加数的低/32,R4/R5存放结果的低/32位︰
	ADDS R4 ,RO ,R2	;带S后缀结果影响CPSR中的标志位C
	ADC R5 ,R1 ,R3	;带进位的加法,C标志位参与运算

【64位整数减】:
SUBS R4, R0, R2	;R0-R2->R4
SBC R5, R1, R3	;R1-R3->R5

【逆向减法】:
RSB RO,R1,R2 ;RO=R2-R1
RSC RO,R1,R2 ;在上行指令基础上再减C标志位的反码

【逻辑运算】:
AND R0, R0, #3  ;保持R0的01位,其余清0 R0&3 -> R0
ORR R0, R0, #3  ;置位R0的01位,其余不变	R0|3 -> R0
EOR R0, R0, #3  ;反转R0的01位,其余不变 R0^3 -> R0
BIC, R0, #3	;0 R0的01位,其余不变 对应位清0

【比较指令】:
CMP R1,RO	;R1-RO ,结果影响CPSR中的标志位,但不保留运算结果
CMN RO,#1 	;判断RO的值是否为1的补码,是则Z置位
			;CMN指令将操作数1寄存器减去操作数2的负值

【测试指令】:
TST R1,#3 ;按位与,结果影响CPSR中的标志位
TEO R1,R2 ;按位异或,结果影响CPSR中的标志位

【乘法指令】:
- MUL:32位乘法;
- MLA:三操作数乘法,将操作数1与操作数2相乘,结果加第三个操作数,存入目的寄存器;
	MLA, Rd, Rm, Rs, Rn	;Rd<-Rm*Rs+Rn
- 规则:Rd和Rm不能是同一寄存器;
- 形成两个矢量的标量积例程:
	MOV R11, #20	//立即数20给R11
	MOV R10, #0		//初始化结果寄存器
loop:
	LDR R0, [R8], #4	//读取矢量1指针
	LDR R1, [R9], #4	//读取矢量2指针
	MLA R10, R0, R1, R10	// R0*R1+R10->R10
	subs R11, R11, #1	// R11-1->R11
	bne loop	// 条件跳转

在这里插入图片描述

【条件码】:
- N:补码表示的符号数运算结果,1负,0正;
- Z:1表示结果为0;
- C:加时1表示进位,减时0表示借位,移位操作时为移出值的最后一位;
- V:1为溢出;

跳转指令

跳转指令用于控制程序的走向,可完成从当前指令向前或向后的32MB的地址空间跳转,包括基本跳转指令B ,
带返回的跳转指令BL,带状态切换(ARM与Thumb之间)的跳转指令BX,带返回和状态切换的跳转指令BLX;

程序状态寄存器访问指令

当前程序状态寄存器可分为4个8位独立域:
CPSR[31:24] : _f(标志域);
CPSR[31:24] : _s(状态域);
CPSR[31:24] : _x(扩展域);
CPSR[31:24] : _c(控制域);

【清CPSR标志位】:
MRS R0, CPSR	;R0<-CPSR
BIC R0, R0, #0xF0000000	;清高四位
MSR CPSR_f, R0	;CPSR_f<-R0

GNU ARM汇编基础

1、GNU ARM汇编器
label: instruction or directive or pseudo-instruction @comment
instruction :机器指令,处理器中有特定硬件来执行;
directive :伪操作,没有对应机器指令,只起编译器指示作用;
pseudo-instruction :伪指令,会被编译为一条或多条机器指令;
@:注释
2、GNU编译环境构成
GNU编译工具主要包括汇编器as、编译器gcc、链接器ld、反汇编工具objdump等,
每种工具都有×86版本和ARM版本如arm-linux-gcc;
3、段及lds文件
GNU ARM以段为单位来组织程序,段是具有相同属性的一段内容,汇编所产生的目标文件至少具有text、 data . bss这三个段,
分别对应可执行代码、初始化数据及未初始化数据;
GNU ARM常用伪操作

符号定义伪操作

.equ symbol , expr  @将symbol定义为expr
.set 				@与.equ相同
.global symbol		@将symbol定义为全局标号
.extern symbol 		@声明symbol为一个外部变量

数据定义伪操作

.word expr {,expr}...   @分配子内仔里兀开用expr 初始化
.byte expr {,expr}...   @分配字节内存单元并用expr初始化
.long expr {,expr}...   @同.word
.ascii expr{,expr}...   @字符串,非零结束符
.string expr {,expr}... @字符串,零结束符,同.asciz
.zreo size				@用О填充size个字节的内存

  • 1
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原作者:宛城布衣。 本文件已移除PDF签名,如内容有误,欢迎大家指正。 目录 前言 i 目录 I ARM7TDMI(-S)指令集及汇编1 ARM 处理器寻址方式2 寄存器寻址2 立即寻址2 寄存器偏移寻址2 寄存器间接寻址3 基址寻址3 多寄存器寻址4 堆栈寻址4 块拷贝寻址5 相对寻址5 指令集介绍7 ARM 指令集7 指令格式7 第 2 个操作数7 #immed_8r 7 Rm8 Rm,shift8 条件码9 ARM 存储器访问指令 11 LDR 和 STR 11 LDM 和 STM14 SWP 17 ARM 数据处理指令19 数据传送指令20 MOV 20 MVN 20 算术逻辑运算指令20 ADD 20 SUB21 RSB 21 ADC 21 SBC 21 RSC 22 AND 22 ORR22 EOR22 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII BIC 23 第 I 页常用 ARM 指令集及汇编 Ver:1010 比较指令23 CMP 23 CMN23 TST24 TEQ24 乘法指令25 MUL25 MLA25 UMULL25 UMLAL26 SMULL 26 SMLAL 26 ARM 跳转指令27 B27 BL27 BX 27 ARM 协处理器指令28 CDP28 LDC29 STC 29 MCR30 MRC30 ARM 杂项指令31 SWI 31 MRS 32 MSR 33 ARM指令34 ADR 35 ADRL35 LDR36 NOP37 Thumb 指令集39 Thumb 指令集ARM 指令集的区别 39 Thumb 存储器访问指令 40 LDR 和 STR 41 PUSH 和 POP 43 LDMIA 和 STMIA 43 Thumb 数据处理指令 45 数据传送指令46 MOV 46 MVN 46 NEG47 算术逻辑运算指令47 ADD 47 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 II 页常用 ARM 指令集及汇编 Ver:1010 SUB48 ADC 49 SBC 49 MUL50 AND 50 ORR50 EOR51 BIC 51 ASR51 LSL52 LSR 52 ROR53 比较指令53 CMP 53 CMN54 TST54 Thumb 跳转指令 55 B 55 BL55 BX 55 Thumb 杂项指令 56 SWI 56 Thumb 伪指令 57 ADR 57 LDR57 NOP58 伪指令59 符号定义伪指令59 GBLA、GBLL、GBLS 59 LCLA、LCLL、LCLS60 SETA、SETL、SETS 61 RLIST61 CN 62 CP62 DN、SN62 FN63 数据定义伪指令63 LTORG64 MAP64 FIELD 65 SPACE66 DCB 66 DCD 和 DCDU67 DCDO 67 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 III 页常用 ARM 指令集及汇编 Ver:1010 DCFD 和 DCFDU68 DCFS 和 DCFSU68 DCI69 DCQ 和 DCQU69 DCW 和 DCWU 70 报告伪指令70 ASSERT 70 INFO 71 OPT 71 TTL 和 SUBT 72 汇编控制伪指令73 IF、ELSE 和 ENDIF73 MACRO 和 MEND 74 WHIL 和 WEND 75 杂项伪指令76 ALIGN 77 AREA78 CODE16 和 CODE32 79 END 80 ENTRY80 EQU 81 EXPORT 和 GLOBAL 81 IMPORT 和 EXTERN 82 GET 和 INCLUDE 83 INCBIN83 KEEP83 NOFP 84 REQUIRE 84 PEQUIRE8 和 PRESERVE8 84 RN 84 ROUT85 ARM指令86 ADR 86 ADRL86 LDR86
x86和ARM指令集是两种常见的计算机体系结构的指令集架构。它们都用于指导计算机硬件执行特定的任务和操作。以下是关于x86和ARM指令集的一些简要信息: x86指令集:x86是一种基于CISC(复杂指令集计算)体系结构的指令集。该指令集最初由英特尔开发,并成为主要的个人计算机和服务器体系结构。x86指令集包含丰富的指令,可执行多种操作,包括算术运算、逻辑运算、数据传输和控制流等。它是一种复杂的指令集,并且具有较高的执行能力和灵活性。凭借广泛的软件支持和计算能力,x86成为桌面和服务器领域最流行的体系结构之一。 ARM指令集ARM是一种基于RISC(精简指令集计算)体系结构的指令集。它最初由英国公司ARM Holdings开发,并成为移动设备(如智能手机和平板电脑)和嵌入式系统的主要体系结构。ARM指令集设计简洁,指令数量较少,每条指令一般只执行一个简单的操作。与x86相比,ARM指令集执行效率更高,并具有更低的功耗和较小的芯片面积。因此,它成为便携式设备和嵌入式系统中的首选体系结构。 x86和ARM的比较:x86指令集适用于大型多任务处理、复杂的图形操作和计算密集型任务。它具有广泛的软件生态系统和令人称赞的性能。然而,由于复杂指令集的特性,x86架构的芯片更复杂、功耗较高,并且相对较贵。 相比之下,ARM指令集在低功耗设备方面表现出色。ARM芯片的功耗较低,性能较高,并且在移动设备和嵌入式系统中能够提供高度集成的解决方案。此外,由于ARM芯片广泛采用,其生态系统和软件支持也非常庞大。 总结而言,x86和ARM指令集都有各自的优势和适用场景。x86适用于高性能和复杂任务的计算机系统,而ARM则适用于低功耗和便携设备的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值