第三章ARM 指令系统
1.ARM v7 架构使用的指令集有哪些特点?
在ARM v7 版本的处理器内核中,不再使用ARM 指令集,使用的是改进的Thumb指令集,称为Thumb-2 指令集。Thumb-2 指令集是一种兼容16 位和32 位指令的指令集。
①在书写指令时不需要分析这条指令是32 位指令还是16 位指令,汇编器会自动按照最简化的原则汇编。
①编译环境提供了一种方法,由编程人员指定是哪一种代码格式。如果在指令后面加后缀“.N”则指定是16 位代码格式(Narrow),如果在指令后面加后缀“.W”则指定是32 位代码格式(Wide)。
①代码密度以及速度都比现有的Thumb指令集更高。
arm嵌入式系统期末考试2. ARM 处理器支持几种基本寻址方式?举例并分别说明。
①立即寻址,也叫作立即数寻址,这是一种特殊的寻址方式。立即寻址方式的目的是将操作数紧跟在操作码后面,与操作码一起放在指令代码段中。例如:ADD R1,R0,#1;R0←R0+1即寄存器R0的内容加1,把结果放回到R1中MOV R0,#0xFF00;将立即数0xFF00放入寄存器R0
①寄存器寻址,寄存器寻址指的是操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,指令执行时直接取出寄存器值来操作。例如:ADD R0,R1,R2 ;将寄存器R1和R2的内容相加,结果存放在寄存器R0
中
MOV R1,R2 ;将R2的值存入R1
①寄存器移位寻址,寄存器移位寻址的操作数是由寄存器做相应移位而得到的,移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。例如:
MOV R0,R2,LSL#3; R2 的值左移3 位,结果放入R0,即R0=R2*8
①寄存器间接寻址,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在存储器指定地址的存储单元中,即寄存器是操作数的地址指针。例如:
LDR R1,[R2];将以R2 的值作为地址单元对应的数据传送到R1 中
①基址寻址,基址寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到操作数的有效地址。例如:LDR R0,[R1,#4] ;R0←[R1+4],把基址R1 的内容加上位移量4 后所指
;向的存储单元的内容送到寄存器R0 中
①相对寻址,相对寻址和基址变址寻址方式类似,以程序计数器PC 的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段中的跳转指令采用了相对寻址:
BEQ LOOP;条件跳转到LOOP 标号处
LOOP MOV R6,#1
①多寄存器寻址,多寄存器寻址可以实现一条指令完成多个寄存器值的传送,允许一条指令传送16个寄存器的任何子集或所有寄存器。
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0] R2←[R0+4] R3←[R0+8]
;R4←[R0+12]
①堆栈寻址,堆栈使用一个叫作堆栈指针的专用寄存器指示当前操作位置,堆栈指针总是指向栈顶,当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。
STMFD SP!,{R1 - R7,LR}; R1~R7.LR 入栈,满递减堆栈
LDMFD SP!,{R1 - R7,LR}; R1~R7.LR出栈,满递减堆栈
3.何谓ARM 指令的条件码?默认的条件码是什么?举例说明ARM 指令的条件码对指令执行的影响。
ARM 指令的基本格式为<opcode>{<cond>}{S} <Rd>,<Rn>,{<Op2>},其中{<cond>}表示一个可选的条件码,默认为1110,即无条件执行。例如,跳转指令B 可以加上后缀EQ (条件码0000的助记符为EQ)变为BEQ,表示“相等则跳转”,即当CPSR 中的Z 标志值位时发生跳转。
4.解释说明以下指令的含义。
① SUB R0,R1,#256
① MCR P3,3,R0,C4,C5,6
① MLAS R0,R1,R2,R3
① R0 = R1 - 256
①协处理器P3把C4和C5经过3操作(类型6)的结果赋给R0。
① R0 = R1×R2 + R3
5.试比较TST 与ANDS,CMP 与SUBS,MOV 与MVN 的区别。
①TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行
按位的“与”运算,不保存运算结果但会根据运算结果更新CPSR 中条件标志位的值;ANDS指令用于在两个操作数上进行逻辑与运算,结果放到目的寄存器中,更新CPSR 中条件标志位的值;区别是是否保存相与的结果。
①CMP 与SUBS的区别是是否保存相减的结果。
①MOV 与MVN的区别是是否对第二个操作对象取反。
6.解释B 指令、BL 指令与BX 指令的功能差别,并举例说明其使用方法。
B指令是分支指令,BL指令是带链接的分支指令,BX是带状态切换的分支指令。其中,
B指令的跳转范围为±32M,比如“B WAITA”指跳转至标号WAITA处开始执行;
BL指令,实现程序跳转,并保持PC到链寄存器LR中,跳转范围为±32M。比如“BL DELAY”实现跳转至标号DELAY处执行,并把PC-4存入LR;
BX指令,带状态切换的跳转,比如“BX R0”表示跳转至R0指定的地址开始执行,并查看R0[0]位的值。如果是1,对CPSR的T位置位,解释目标程序为Thumb指令;如果是0,对CPSR的T位清零,解释目标程序为ARM指令。
7.简述ARM 指令集中第2 个操作数(operand2)的三种形式。
第2个操作数可为#immed_8r、寄存器Rm 及任意移位的寄存器。
① #immed_8r常数表达式,该常数必须对应8 位位图,即一个8 位的常数通过循环右移偶数位得到的32 位常数。
① 循寄存器Rm,在寄存器方式下,操作数即为寄存器的数值。
① 寄存器Rm 移位,即将寄存器的移位结果作为操作数,Rm 值保持不变。
8.解释“满堆栈”“空堆栈”“递增堆栈”和“递减堆栈”。ARM 指令系统中是如何支持的?
满堆栈:堆栈指针指向最后压入堆栈的数据。
空堆栈:堆栈指针指向下一个将要放入数据的空位置。
递增堆栈:堆栈由低地址向高地址生成。
递减堆栈:堆栈由高地址向低地址生成。
在ARM 指令中,数据的进栈和出栈通过Load/Store 指令实现,指令STM 向堆栈写数据项,指令LDM 从堆栈读数据项。
9.指出下列指令是否正确,若不正确请说明原因。
① MOVS R1,101
① MVN R1,#0x10F
① STMDA R11,{R2-R8}!
① ADD R0!,R2,#4
① LDR R4,[R5]!
① MRS PC,CPSR
① LDMFDS R0!,{R5-R8,R2}
① ADD R3,[R3],R7
① LDR R11,[R15,R8]!
① MOVS R1,101不正确,立即寻址方式应该是#101
① MVN R1,#0x10F正确
① STMDA R11,{R2-R8}!不正确,不能同时存储在R2和R8中
① ADD R0!,R2,#4正确
① LDR R4,[R5]!不正确,LDR是存储到单个寄存器的加载指令,而该指令中两个存储器都进行存储,应该改为LDR R4, [R5]
① MRS PC,CPSR不正确,MRS是将CPSR传送到通用寄存器中,但这里的通用寄存器不包括R15,即PC
① LDMFDS R0!,{R5-R8,R2}正确
① ADD R3,[R3],R7不正确,ADD指令不能访问存储器
① LDR R11,[R15,R8]!正确
10.试根据以下要求写出相应的汇编语言指令。
1)把BX 寄存器和DX 寄存器的内容相加,结果存入DX 寄存器中。
2)用寄存器BX 和位移量0B2H 的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。
3)用位移量为0524H 的直接寻址方式把存储器中的一个字与数2A59H 相加,并把结果送回存储单元中。
4)把数0B5H 与(AL)相加,并把结果送回AL 中。
①ADD DX,BX
①ADD0B2H[BX],CX
①ADD DS:[0524H],WORD PTR 2A59H
①ADD AL,0B5H
11.已知RAM 内0x0300 处连续存放某班60 名学生成绩(百分制),试用汇编语言完成以下功能:
1)求出平均成绩,并存入0x400 处。
AREA Reset,DATA,READONLY
DCD 0X12345678
DCD Reset_Handler
AREA CODE_SEGMENT,CODE,READONLY
Reset_Handler proc
export Reset_Handler [weak]
;拷贝至SRAM
;MOV R0,#0X20000000 ;MSP432 SRAM开始地址
Start
MOV R0,#0X0300
LDR R1,=ARRAY
MOV R5,#99 ;数组最后一个元素的索引
MOV R2,#0
COPY
CMP R2,R5
BGT CALCU
LDR R3,[R1,R2] ;R1加R2的地址处的数据读出,保存到R3
STR R3,[R0,R2] ;R3的数据保存到R0+R2地址,即指定内存地址
ADD R2,#4 ;按字长大小拷贝,即4个字节
B COPY
CALCU
;float avg = 0;
VLDR S0,[PC,#0X50]
VMOV R6,S0
;int sum = 0;
MOVS R5,#0X00
;int i = 0;
MOVS R4,#0X00
NOP
B LOOP
;sum +=score[i];
BODY
ADD R0,SP,#0X04
LDR R0,[R0,R4,LSL #2]
ADD R5,R5,R0
ADDS R4,R4,#1
LOOP
CMP R4,#0X64
BLT BODY
MOVS R0,#0x64
SDIV R0,R5,R0
VMOV S0,R0
VCVT.F32.S32 S0,S0
VMOV R6,S0
MOV R0,#0x400
STR R6,[R0]
ARRAY DCB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,5 9,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86, 87,88,89,90,91,92,93,94,95,96,97,98,99,100
ENDP
END
2)将成绩分成A(>89)、B(80~89)、C(70~79)、D(60~69)和E(0~59)5个等级,并计算每一等级内的学生个数,并将其一次存放到0x0410~0x0414 处。
AREA Reset,DATA,READONLY
DCD 0X12345678
DCD Reset_Handler
AREA CODE_SEGMENT,CODE,READONLY
Reset_Handler proc
export Reset_Handler [weak]
MOV R0,#0X0300
LDR R1,=ARRAY
MOV R5,#99 ;数组最后一个元素的索引
MOV R2,#0
COPY
CMP R2,R5
BGT BEGIN
LDR R3,[R1,R2] ;R1加R2的地址处的数据读出,保存到R3
STR R3,[R0,R2] ;R3的数据保存到R0+R2地址,即指定内存地址
ADD R2,#4 ;按字长大小拷贝,即4个字节
B COPY
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论