资源描述
2021/6/31第第3章章 ARM指令系统与汇编语言程序设计指令系统与汇编语言程序设计3.1 ARM指令系统概述指令系统概述3.1.1 ARM指令系统的特点指令系统的特点(1)所有的运算都在寄存器中进行)所有的运算都在寄存器中进行(2)多数指令可以有条件执行)多数指令可以有条件执行(3)具有批量寄存器数据传送指令)具有批量寄存器数据传送指令(4)支持)支持32位和位和16位双指令集位双指令集(5)提供一些数字信号处理指令)提供一些数字信号处理指令(6)具有协处理指令)具有协处理指令2021/6/323.1.2 ARM汇编指令的基本格式汇编指令的基本格式ARM指令指令的二进制代码的基本格式:的二进制代码的基本格式: ARM指令指令的汇编语言基本格式:的汇编语言基本格式: 操作码操作码 条件条件 S 目的寄存器目的寄存器 , 第一操作数第一操作数 , 第二操作数第二操作数 例:例: ADD R0,R4,R8ADDEQ R0,R2,#5ADDS R1,R5,R8MOV PC,R142021/6/333.1.3 ARM指令的条件域指令的条件域ARM指令可根据指令可根据CPRS中条件标志位的状态和指令的中条件标志位的状态和指令的条件域表示的条件有条件地执行条件域表示的条件有条件地执行 。CMP R0,#0ADDEQ R0,R2,#5MOVGT R1,#0 BGE NEXT例如:例如:条件域的条件用条件码的助记忆符表示(见表条件域的条件用条件码的助记忆符表示(见表3-13-1)2021/6/343.2 ARM指令的寻址方式指令的寻址方式 ARM指令常用有如下寻址方式指令常用有如下寻址方式1.立即寻址 立即寻址操作数就在指令中例:ADD R0,R0,#0 x3f立即数指令功能:R0R0+ 0 x3f16进制数2021/6/352. 寄存器寻址寄存器寻址 寄存器寻址操作数在寄存器中例:ADD R0,R1,R2指令功能:R0R1+ R23. 寄存器间接寻址寄存器间接寻址 寄存器间接寻址操作数在内存中,操作数 地址在寄存器中例:LDR R0,R1指令功能:R0 R12021/6/364. 变址寻址变址寻址 变址寻址操作数在内存中,操作数地址由寄存器中内容加偏移量获得LDR R0,R1,#8 指令功能:R0 R1,R1R1+8 后变址后变址例:LDR R2,R0,#8指令功能:R2 R0+#8 前变址前变址LDR R2,R0,#8! 指令功能:R2 R0+8,R0R0+8 自动变址自动变址2021/6/375. 寄存器移位寻址寄存器移位寻址 寄存器移位寻址操作数为第2操作数,在第2操作数与第1操作数操作前对第2操作数进行移位。例:例:ADD R3,R2,R1,LSL#3指令功能:R3 R2+R123 第第2操作数可以进行五种移位。操作数可以进行五种移位。(1)LSL:逻辑左移:逻辑左移(2)LSR:逻辑右移:逻辑右移(3)ASR:算术右移:算术右移(4)ROR:循环右移:循环右移(5)RRX:带扩展的循环右移:带扩展的循环右移2021/6/386. 多寄存器寻址多寄存器寻址 多寄存器寻址一条指令可完成一组寄存器 值的传送,连续寄存器之间 使用“-”,否则用“,”例: LDMIA R0, R1-R4指令功能:R1 R0,R2 R0+4, R3 R0+8,R4 R0+12, LDMIA R0, R1,R3指令功能:R1 R0,R3 R0+4, 2021/6/398. 相对寻址相对寻址 相对寻址以程序计数器(PC)的值为基 址加偏移量形成转移地址例: BL NEXT NEXT7. 堆栈寻址堆栈寻址 堆栈寻址实现堆栈中的数据与寄存器组间 传送数据例: STMFD SP!,R1-R2,PC 指令功能:R1,R2,PC内容进栈保存2021/6/3103.3 ARM指令的分类介绍指令的分类介绍ARM微处理器的指令分类:微处理器的指令分类:数据处理指令数据处理指令 加载加载/ /存储指令存储指令 转移指令转移指令 程序状态寄存器处理指令程序状态寄存器处理指令软件中断指令软件中断指令协处理器指令协处理器指令2021/6/3113.3.1 数据处理指令数据处理指令1. 数据传送指令数据传送指令MOV例:MOV R1,R0 ;将;将R0内容送内容送R1MOV R1,R0,LSL#2 ;将;将R0左移左移2位送位送R12. 数据按位取反传送指令数据按位取反传送指令MVN例:例:MVN R0,#0 ;将立即数;将立即数0按位取反送按位取反送R0执行后执行后R0=0 xFFFFFFFF= -12021/6/3123. 加法指令加法指令例:例:ADD R0,R1,R2 ;R0 R1+R2(2) 带进位加法指令带进位加法指令ADC 将两源操作数相加再加上进位标志位的值,结果送目的寄存器例:利用该指令可实现64位二进制加法ADDS R0,R4,R8 ; 后缀后缀S表示要改变进位位表示要改变进位位ADC R1,R5,R9 ; 带进位加结果在带进位加结果在R0与与R1中中(1) 不带进位加法指令不带进位加法指令ADC 2021/6/313(1)SUB 减法指令减法指令例:例:SUB R0,R1,R2 ; R0 R1-R2(2)SBC 带借位减法指令带借位减法指令例:例:SBC R0,R1,R2 ; R0 R1-R2-!C例:例:RSB R0,R1,R2 ; R0 R2-R1(3)RSB 逆向减法指令和逆向带借位减法指令逆向减法指令和逆向带借位减法指令4. 减法指令减法指令2021/6/314(1) 逻辑逻辑“与与”指令指令AND例:例:AND R0,R0,#0 x3ff ;将;将R0和和0 x3ff 相相 ; “与与” 即将即将R0中的高中的高6位清位清0 ;低;低10位不变位不变 5. 逻辑运算指令逻辑运算指令(2) 逻辑逻辑“或或”指令指令ORR 例:例:ORR R0,R0,#3 ;将;将R0的第的第0、1位置位置1其余不变其余不变2021/6/315(3) 逻辑异或指令逻辑异或指令EOR (4)BIC 位清除指令位清除指令将操作数某些位清零将操作数某些进行位进行异或运算2021/6/3166. 比较指令比较指令(1) 比较指令比较指令CMP 例:例:CMP R1,R0;两操作数比较,;两操作数比较,结果影响标志位结果影响标志位(2)取反值比较指令)取反值比较指令CMN 将一操作数取反后再比较对某位进行测试或测试两个数是否相等对某位进行测试或测试两个数是否相等7. 测试指令测试指令2021/6/3178. 乘法和乘加指令乘法和乘加指令(1) 32位乘法指令位乘法指令MUL例:例:MUL R0,R1,R2 ;R0 R1xR2(2) 32位乘加指令位乘加指令MLA 例:例:MULA R0,R1,R2 ,R3 ; R0 R1xR2+R3(3) 64位乘法指令和乘加指令位乘法指令和乘加指令 2021/6/3183.3.2 加载加载/存储指令存储指令该类指令用于寄存器与存储器(该类指令用于寄存器与存储器(I/O接口)之间接口)之间传送数据。传送数据。加载加载/存储指令存储指令单寄存器加载单寄存器加载/存储指令存储指令多寄存器加载多寄存器加载/存储指令存储指令数据交换指令数据交换指令加载:寄存器加载:寄存器 存储器(存储器(I/O接口)接口)存储:存储: 存储器(存储器(I/O接口)接口) 寄存器寄存器2021/6/319(1)字数据加载指令)字数据加载指令LDR 该类指令用于单个寄存器与存储器之间传送数据该类指令用于单个寄存器与存储器之间传送数据指令功能:把内存中的字数据传送到目标寄存指令功能:把内存中的字数据传送到目标寄存 器中去。器中去。 例:例:LDR R0,R1 ; 将将R1存放地址的内存字单存放地址的内存字单 元数据传送到元数据传送到R0中中(2)字节数据加载指令)字节数据加载指令LDRB 指令功能:把内存中的字节数据传送到目标寄存指令功能:把内存中的字节数据传送到目标寄存 器中去。器中去。 例:例:LDRB R0,R1;将;将R1存放地址的内存字节存放地址的内存字节 单元数据传送到单元数据传送到R0中中1. 单寄存器加载单寄存器加载/存储指令存储指令2021/6/320(3)半字数据加载)半字数据加载 指令指令功能:把内存中的半字数据传送到目标寄存指令功能:把内存中的半字数据传送到目标寄存 器中去器中去 。2021/6/321(4)字数据存储指令)字数据存储指令STR 指令功能:把寄存器中的指令功能:把寄存器中的32位字数据传送到存储位字数据传送到存储 器中。器中。 例:例:STR R0,R1 ; 将将R0中的数据存放到中的数据存放到R1 指定的内存字单元中。指定的内存字单元中。(5)字节数据存储指令)字节数据存储指令STRB 指令功能:把寄存器中的数据的低指令功能:把寄存器中的数据的低8位作为字节位作为字节 数据传送到存储器中。数据传送到存储器中。 (6)半字数据存储指令)半字数据存储指令STRH 指令功能:把寄存器中的数据的低指令功能:把寄存器中的数据的低16位作为半位作为半 字数据传送到存储器中。字数据传送到存储器中。 2021/6/322(1)多寄存器存储指令)多寄存器存储指令指令格式:指令格式:STM条件条件类型类型 基址寄存器基址寄存器!,寄存器列表寄存器列表例:例:STMFD SP!,!,R1-R2,LR ;将寄存器;将寄存器R1、R2、LR中保存的字数据存储到中保存的字数据存储到;堆栈中,同时将最后的地址写入;堆栈中,同时将最后的地址写入SP。2. 多寄存器加载多寄存器加载/存储指令存储指令可实现一片连续存储器单元和多个寄存器之间可实现一片连续存储器单元和多个寄存器之间传递数据,用于传递数据,用于多个寄存器进栈多个寄存器进栈/出栈操作出栈操作。2021/6/323例:例:LDMFD SP!,!,R1-R2,PC (2)多寄存器加载指令)多寄存器加载指令LDM条件条件类型类型 基址寄存器基址寄存器!, 寄存器列表寄存器列表指令格式:指令格式:;将堆栈中保存的;将堆栈中保存的3个字数据加载到寄存器个字数据加载到寄存器R1、;R2、PC中(出栈),同时将最后的地址写中(出栈),同时将最后的地址写;入;入SP, 及将及将SPSR复制到复制到CPSR中中2021/6/324ARM实现转移两种方法实现转移两种方法: 1)使用转移指令;)使用转移指令;2)直接向程序计数器写入转移的目的地址)直接向程序计数器写入转移的目的地址转移指令:转移指令:(1)转移指令)转移指令B (类似(类似MCS-51的的JMP)例:例:B NEXT ;无条件转移到;无条件转移到NEXT处执行处执行BEQ NEXT ;如果相等件转移到;如果相等件转移到NEXT处执行处执行转移条件3.3.3 转移指令转移指令2021/6/325(2) 带返回转移指令带返回转移指令BL执行转移同时将PC计数器内容保存在LR寄存器中,该指令一般用来调子程序例:BL SUB1子程序名(3)BX 带状态切换跳转指令带状态切换跳转指令执行跳转到目标地址处执行,目标地址处的指令可以是ARM指令也可以是Thumb指令。例例: BX R0 ;转到转到R0指定的地址处去执行指定的地址处去执行 ;如果如果R0最低位为最低位为1则切换到则切换到Thumb ;状态状态2021/6/326(3) 带返回和状态切换转移指令带返回和状态切换转移指令BLX 执行转移时,从执行转移时,从ARM指令切换为指令切换为Thumb指令状指令状态,同时将态,同时将PC的内容保存在的内容保存在LR中。中。例:BLX T16 CODE 16 T16 ;32位指令程序段位指令程序段;16位指令程序段位指令程序段2021/6/327 ARM汇编语言程序的基本结构汇编语言程序的基本结构例: AREA Add ,CODE, READONLY ;定义代码段定义代码段 ENTRY ;指明代码段入口指明代码段入口 CODE32 ;以下为以下为32位指令位指令Start MOV R0,#1 MOV R1,#2 ADD R2,R0,R1 END ; 汇编结束汇编结束实现功能的程序实现功能的程序伪指令伪指令3.5 ARM的伪指令的伪指令2021/6/3281. 段定义伪指令段定义伪指令AREA格式:格式: ARER 段名段名 , 属性属性1,属性,属性2,用处:用来定义一个代码段或数据段用处:用来定义一个代码段或数据段例1:AERA init, CODE, READONLY定义代码段代码段属性代码段名例2:AERA data , DATA,READWRITE定义代码段定义代码段数据段名定义数据段数据段属性定义数据段定义数据段2021/6/3292. ENTRY 汇编程序入口说明伪指令汇编程序入口说明伪指令用处:用来说明汇编程序的入口点,一个完整的 汇编程序至少有一个入口点例:AERA init, CODE, READONLY ENTRY ;程序的入口点;程序的入口点 2021/6/3303. CODE16与与CODE32 代码位数说明伪指令代码位数说明伪指令用处:用来说明后面的代码的位数例:CODE32 ;说明下面代码使用ARM 32位指令 LDR R0,=0X8500 BX R0 CODE 16 ;说明下面代码使用;说明下面代码使用Thumb 16位指令位指令 ADD R3,R3,R1 END2021/6/3314. END 汇编源程序结束说明伪指令汇编源程序结束说明伪指令用处:放在源程序的末尾,用来告诉编译器源程用处:放在源程序的末尾,用来告诉编译器源程 序结束序结束2021/6/3325. 数据定义伪指令数据定义伪指令用处:用于为数据分配存储单元及完成已分配单 元的初始化(1)DCB 字节存储单元分配伪指令例: ARRAY1 DCB 1,2,5 给数组ARRAY1分配连续3个字节单元,初 值分别为1,2,5 (2)DCD 字存储单元分配伪指令例: DATA2 DCD 1,2,5 给数组DATA2分配连续3个字单元,初值分 别为1,2,5 2021/6/333(3)SPACE 连续字节存储单元分配伪指令例: DATA3 SPACE 100 给数组DATA3分配连续100个字节单元, 这100个字节初值为0。 6. EQU 赋值说明伪指令赋值说明伪指令用处:用于将程序中的常数、标号赋予一个名称例:例:TEST EUQ 50 ;定义;定义TEST的值为的值为502021/6/3347. LDR 将地址加载或常数到寄存器伪指令将地址加载或常数到寄存器伪指令用处:用于将常数或地址加载到寄存器中用处:用于将常数或地址加载到寄存器中例:例: LDR R2, =0X40000000 LDR R4, = N;(常数);(常数)注意伪指令注意伪指令LDR与指令与指令LDR的区别的区别LDR R2, R1 ;指令LDRLDR R2,= 0X50000000 ;伪指令伪指令LDR注意事项:当数据的地址与伪指令注意事项:当数据的地址与伪指令LDR之间的之间的距离超过距离超过4KB时要使用伪指令时要使用伪指令LTORG在适当位在适当位置建立文字缓冲池置建立文字缓冲池。2021/6/335【例例1】寄存器R0和R1中有两个正整数(例如15和3),求这两个数的最大公约数,结果存储在R0中。解:由于程序所需条件判断很少,可以直接利用CPSR寄存器的标志位和ARM指令的条件执行特性实现程序的分支和转移。程序流程图如图所示。 3.6 ARM汇编语言编程举例:2021/6/336 AREA example1, CODE, READONLY ;程序代码段开始程序代码段开始 ENTRY ;程序的入口;程序的入口 CODE32 ;以下为;以下为32位指令位指令 MOV R0, #15 ;R0赋原始数据赋原始数据15 MOV R1, #9 ;R1赋原始数据赋原始数据9 START ;程序标号程序标号START CMP R0, R1 ;比较比较R0和和R1 SUBLT R1, R1, R0 ;如果如果R0R1, 则则R1=R0-R1 BNE START ;如果;如果R0不等于不等于R1,则跳转到,则跳转到 ; 标号标号SART处执行处执行 WAIT ;程序标号;程序标号WAIT B WAIT ; 跳转到标号跳转到标号WAIT,进入等待,进入等待 END ;程序结束;程序结束2021/6/337【例【例2】试编程实现计算整数的乘方(例如计算】试编程实现计算整数的乘方(例如计算210),结),结果存放在内存单元果存放在内存单元0 x40000000中。中。算法:算法:Xn=X*X*X*Xn-1次乘法解:解:2021/6/338X EQU 2 ;定义;定义X的值为的值为2N EQU 10 ;定义;定义N的值为的值为10 AREA EXAMPLE1, CODE, READONLY ENTRY ;标识程序入口;标识程序入口 CODE32 ;以下为;以下为32位指令位指令;* START LDR SP,=0X40003F00 ;设置堆栈;设置堆栈 LDR R2,=0X40000000 ;内存地址放入;内存地址放入R2 LDR R0,=X ;X放入放入R0 LDR R1,=N ;N放入放入R1 BL POW ;调子程序;调子程序POW STR R0,R2 ;存结果;存结果HALT B HALT ;等待;等待2021/6/339POW STMFD SP!,R1-R2,LR ;寄存器进栈保护;寄存器进栈保护 MOVS R2,R1 ;将;将N复制到复制到R2 MOVEQ R0,#1 ;如果;如果X为为1结果结果=1 BEQ POWEND ;跳转到;跳转到POWEND CMP R2,#1 ;X与与1比较比较 BEQ POWEND ;X为为1跳转到跳转到POWEND MOV R1,R0 ;设置乘数;设置乘数 SUB R2,R2,#1 ;计数器;计数器R2减减1,即,即N-1POWL1 BL DOMUL ;调乘法子程序;调乘法子程序 SUBS R2,R2,#1 每做一次乘法计数器减每做一次乘法计数器减1 BNE POWL1 ;循环跳转;循环跳转POWEND LDMFD SP!,R1-R2,PC ;寄存器出栈;寄存器出栈DOMUL MUL R0,R1,R0 ;做一次乘法;做一次乘法 MOV PC,LR ;子程序返回;子程序返回 END 2021/6/340作业:作业:P92 1、4、7、10、11部分资料从网络收集整理而来,供大家参考,感谢您的关注!
展开阅读全文