1.ARM指令的寻址方式有几种?试分别举例说明。
答:
立即数寻址:MOV R0,#15
寄存器寻址:ADD R0,R1,R2
寄存器间接寻址:LDR R0,[R4]
寄存器移位寻址:ADD R0,R1,R2,LSL #1
基址变址寻址:LDR R0,[R1,#4]
多寄存器寻址:LDMIA R0!,{R1-R4}
相对寻址:BL proc ;跳转到子程序proc处执行
…
proc MOV R0,#1
堆栈寻址:STMFD R13!,{R0-R4};
LDMFD R13!,{R0-R4};
2.ARM指令系统对字节、半字、字的存取是如何实现的?
LDR/STR 字数据加载/存储指令
LDRB/STRB 字节数据加载/存储指令
LDRH/STRH 半字数据加载/存储指令
LDRSB/LDRSH 有符号数字节/半字加载指令
3.如何从ARM指令集跳转到Thumb指令集?
BX指令跳转到指令中所指定的目标地址,并实现状态的切换。
Rm是一个表达目标地址的寄存器。当Rm中的最低位Rm[0]为1时,强制程
序从ARM指令状态跳到Thumb指令状态;当Rm中的最低位Rm[0]为0时,
强制程序从Thumb指令状态跳到ARM指令状态。
4.ARM指令集支持哪几种协处理器指令?
CDP LDC STC MCR MRC
5.ARM指令的条件码有多少个?默认条件码是什么?
15个 默认条件码是AL
6.ARM指令中的第二操作数有哪几种形式?试举例说明。
寄存器形式 MOV R1,R0 ;将寄存器R0的值传送到寄存器R1
立即数形式 MOV R0,#5 ;将立即数5传送到寄存器R0
被移位的寄存器形式 MOV R1,R0,LSL#3
7.MOV指令与LDR指令有何区别?
LDR 指令用于在存储器和处理器的寄存器之间传送数据
MOV 主要用于将一个寄存器中的数据传送到另一个寄存器,或者将一个立即数传送到寄存器,
8.判断下列指令正误,并说明理由?
(1)LDR R3,[R4]! (2)ADD R6,R5,#4!
(3)LDMIA R6,{R3-R7}! (4)LDMFD R13!,{R2,R4}
(5)ADD R1,R2,#0x104 (6)ADD R1,R2,#0x101
(7)MOV R0,R0 (8)MVN R7,#0x2F100
(9)MVN R0,R3,#2_01110000 (10)SBC R15,R6,LSR R5
(11)AND R5,[R6],R7 (12)MRS R15,CPSR
(13)MSR CPSR,#0x001 (14)MUL R3,R3,R6
(15)MUL R4,R6,#0x80 (16)STRB SP![R0,R4]
(17)LDRB R1,[R6,R4],R6 (18)STRB R0,[R15,#0x04]!
(19)LDRB PC,[R5] (20)LDRSB R5,[R4,#0x101]
(21)STRSH R6,[R5]
9.下列指令在什么条件下被执行
SUBMI R3,R3,#0x08 负数
ADDNE R0,R0,R4 不等
10.下列两段代码是用来实现打开中断和关闭中断,请补齐空白处内容
MRS R1,CPSR
BIC R0,R1,____ #0x80
MSR CPSR_c,R0
MRS R1,CPSR
ORR R1,_____
MSR CPSR_c,R1
11.举例说明B和BL指令的区别、BX和BLX的区别?
B指令示例:
backword SUB Rl,R1,#1
CMP R1,#0 ;比较R1和0
BEQ forward ;如果R1=0 则跳转到forward处执行
SUB R1,R2,#3
SUB R1,R1,#1
forward ADD R1,R2,#4
ADD R2,R3,#2
B backword ;程序无条件跳转到标号backword处执行
BL指令示例
…
BL func ;跳转到子程序
ADD R1,R2,#2 ;子程序调用完返回后执行的语句,返回地址
…
func ;子程序
… ;子程序代码
MOV R15,R14 ;复制返回地址到PC,实现子程序的返回
BX指令示例
CODE32 ;ARM程序段,32位编码
arm1 ADR R0,thumb1+1 ;伪指令,把语句标号thumb1所在的地址赋
;给R0,末位R0[0]置1,要跳转到THUMB指令集
MOV LR,PC ;设置返回地址
BX R0 ;跳转
ADD R1,R2,#2 ;返回地址处,第4条指令
CODE16 ;THUMB程序段,16位编码
thumb1 ADD R1,R3,#1 ;THUMB程序
…
BX LR ;跳转到返回地址处,执行第4条指令
BLX指令示例
CODE32 ;ARM程序段,32位编码
arm1 ADR R0,thumb1+1 ;伪指令,把语句标号thumb1所在的地址赋
;给R0,末位R0[0]置1,要跳转到THUMB指令集
;MOV LR,PC ;该指令注销 ,比较BL指令
BLX R0 ;跳转,同时设置返回地址 即PC?LR
ADD R1,R2,#2 ;返回地址处,第4条指令
CODE16 ;THUMB程序段,16位编码
thumb1 ADD R1,R3,#1 ;THUMB程序
…
BX LR ;跳转到返回地址处,执行第4条指令
分析:使用BLX指令代替BX指令简化了Thumb例程的调用,因为BLX指令在
连接寄存器LR中自动设置了返回地址。比较上例,该例中不需要使用MOV
LR,PC指令来保存PC的值了。