6. 0x17&0x11的运算结果是_______。
7. BLX指令的功能是_______。
8. LDR R0,[R1,#6]的寻址方式是_______。
9. &运算符作为单目运算符时表示的是______运算;作为双目运算符时表示的是_____运算 。
10. 当发生异常中断时,_______保存的是异常处理程序的返回地址。
11. 中断向量是指中断处理程序 _______。
12. ARM系列微处理器支持的边界对齐格式有:_________________、______________和字对 齐。
13. ARM C/C++编译器支持和产生以下几种格式的文件:_____、____、____、______、_____ _。
14. 与ARM指令的LDR相比,伪指令的LDR的参数有_______符号。
15. _______指令在进行跳转的同时可以实现处理器状态的转换。
16. B和BL分支指令的跳转范围_______地址范围。
17. CMP指令与SUBS指令的区别在于_______。
18. 若使用LDR指令加载数据到PC寄存器,则实现_______功能。
19. ARM内核在中断异常位置时_______中断禁止控制位,这样可以防止不受控制的异常嵌套 。
20. Thumb指令集带有传统的_______和_______指令用于堆栈操作处理,他们以_______的方
式来实现。
21. 堆栈操作通常发生在_______、_______或者_______时。
22. ARM指令的长度刚好是_______,Thumb指令的长度刚好是_______。
23. 在PC上编译ARM运行的程序,需要______编译器。
24. 建立ARM编译环境的主要开发工具有______、______和______。
25. 嵌入式操作系统的调试一般包括:_________调试和_________调试。
26. 汇编语言与C/C++的混合编程通常有以下几种方式:_____、______、______。
27. 在ARM的汇编程序中,有如下几种伪指令:_____、______、______、______、______。
28. ARM指令集可以分为6类,分别是:______、______、______、______、_____、______。
29. ARM系统中,按照ATPCS的规定,子程序调用时可以利用_______等四个寄存器来传递参数
,更多的参数可以利用_______来传递。
30. ARM指令的长度是_______个字节,Thumb指令的长度是_______个字节。
三.简答题
1. 请比较ARM指令和Thumb指令的边界对齐方式有何不同?
2. 请试述ARM处理器对SWI异常中断的执行与返回过程。
3. 请比较内嵌汇编器与armasm汇编器的区别
4. 请比较参数宏与子程序的区别
5. 请解释可重入函数的概念,举例说明具有可重入性的程序的特点。RM7TDMIJ-S处理器的
名字的含义。
6. 解释volatile限制符在程序中的作用,并举例说明。
7. 请解释A请解释ARM9TDMIJ-S处理器的名字的含义。
8. 简述ARM处理器对状态寄存器进行赋值的方法。
9. ARM指令集中,转移指令十分重要,请举例说明ARM转移指令的用法。
10. 请比较参数宏与子程序的区别。
四.应用题
1. 试编写一段完整的ARM汇编程序,实现将内存地址0xB000开始的100个字的内存单元填入0
x1000001~0x10000064的字数据,然后将每个字单元进行64位累加操作,结果保存在[R9,R8]
(R9中保存高32位)
2. 试编写一段完整的ARM汇编程序,实现将内存区中连续的32个字的数据所构成的8*4矩阵
实现转置操作。
3. 试编写一段完整的汇编程序,实现将一个存放在[R1,R0]中的64位数据的高位与低位对称 的换位,例如第0位与第63位调换,。。。。第31位与第32位调换。
4. 试编写一段完整C语言与汇编语言的混合编程代码,用C语言程序调用汇编子程序子,程
序实现计算30的阶乘,并将64位的结果保存到0xFFFFF000开始的内存地址单元中,按照小端
格式进行存放。
5. 试编写一段完整C语言与汇编语言的混合编程代码,实现在汇编程序中调用C语言子程序
子程序实现计算20的阶乘,并将64位结果保存在寄存器R0,R1中。其中R1存放高32位的结果 。
6. 试编写一段C语言与汇编语言的混合编程代码,实现在C语言程序中调用汇编子程序,子
程序实现计算i的阶乘。
7. 分析下面的程序,程序执行过程中寄存器R0、R1、R2的内容如何变化?试分析程序每一 步的结果,为每句指令添加必要的注释。 .equ x ,88 .equ y ,76 .equ z ,96 .equ stack_top ,0x1000 .global _start .text _start: MOV R0, #0xAB loop: MOV R0,R0,ASR #1 MOV R1,#y ADD R2 ,R0,R1,LSL#1 MOV SP ,#stack_top STR R2,[SP] MOV R0,#z AND R0,R0,#0XFF MOV R1,#y ADD R2,R0,R1,LSR#1 LDR R0,[SP] MOV R1,#0x01 ORR R0, R0, ,R1 MOV R1,R2
ADD R2,R0, R1 LSR #1 stop:
B stop .end
8. 试写一段C语言与汇编语言的混合代码,在C语言程序中调用汇编语言代码,汇编代码实
现以下逻辑: if((a==b)&&(c==d)) e++,并带有必要的注释。
9. 试写一段汇编语言的混合代码,在ARM语言程序中调用Thumb子程序,完成字符串STR1与
字符串STR2内容的互换。
10. 为以下程序添加注释,并注明状态的切换,和程序每一步的结果。 .global .text _start: .arm header: ADR R0 , Tstart+1 BX R0 NOP .THUMB Tstart: MOV R0 , #47 MOV R1 , #63 BL doadd stop: B stop doadd: ADD R0 , R0, R1 MOV PC , LR .end
11. 以下是ARM程序中的两处变量定义,请画出在两处变量在数据区中的布局。并编写完整代
码,以子程序实现两块空间的内容互换。 char a; char a; short b; char c char c; short b; int d; int d
12. 程序排错: int bad_sum(int x , int y) { int t=0; _asm
{ start ADD t , R0 ,t MOV t , R0 ADD R0 , R0 , #1 CMP R2 , R0 BG start } return t; } int main(void) { int a=5; int rs=bad_sum(1,5); }
13. 假设R1=0x56781234,使用将R1存储到0x4000的指令存到存储器中。若存储器为大端组织
,从存储器0x4000处加载一个字节到R2,写出两处的指令,并给出指令执行完毕后R2的值。
14. 下面一段程序完成了将一个寄存器的内容以十六进制符号在显示器上打印出来的功能。 请给程序加上详细的注释并写出运行结果。 AREA HexOu,CODE,READOULY
SWI_WriteC EQU &0 ; SWI_ Exit EQU &11 ; ENTRY ;
LDR R1,VALUE ; BL HexOut ; SWI SWI_ Exit ; VALUE DCD &12345678 ; HexOut MOV R2,# 8 ;
LOOP MOV R0,R1,LSR # 28 ; CMP R0,# 9 ; ADDGT R0,R0,# “A”-10 ; ADDLE R0,R0,# “0” ; SWI SWI_WriteC ;
MOV R1,R1,LSL # 4 ; SUBS R2,R2,# 1 ; BNE LOOP ; MOV PC,R14 ;