1、请用ARM伪操作定义全局的算术变量、字符串变量、逻辑变量各一个,并分别对这些变量进行初始化。
答:
(1) 全局算术变量 A_var:
GBLA A_var A_var SETA 0xAB
全局字符串变量 S_var:
GBLS S_var S_var SETS "0xAB"
全局逻辑变量 L_var:
GBLL L_var L_var SETL {TRUE}
2、ARM汇编程序中符号定义伪操作的作用是(定义变量)、(对变量赋值)以及(定义寄存器别名)等。
3、伪操作 RLIST 的作用是为一个通用寄存器列表定义名称,请给寄存器组R0,R3-R5定义别名为a_rlist,则汇编语句应写为:(a_rlist RLIST {R0, R3-R5})
4、伪操作 LTORG 的功能是什么?请举例说明在何处使用。
5、请以Scr为标号,写出分配一段由4个字组成的内存单元的汇编语句,其中分配的内存单元初始化为5、6、7、8。
答: 汇编语句为
Scr DCD 5, 6, 7, 8
6、分别支指出伪操作 AREA, END, ENTRY, EQU, EXPORT, IMPORT 的功能。
答:功能分别为
(1) AREA,定义一个代码或数据段;
(2) END,通知编译器已经到了源程序的结尾;
(3) ENTRY,指定汇编程序的入口点;
(4) EQU,为数字常量、基于寄存器的值或程序中的标号定义一个名称;
(5) EXPORT,在程序中声明一个全局标号,该标号可在其他文件中引用;
(6) IMPORT,声明要使用的标号或函数名在其他文件中的定义。
7、本课程介绍的3条伪指令分别是(ADR)、(ADRL)、(LDR)。
8、指令LDR和伪指令LDR有什么区别?
答:LDR指令是存储器访问指令,用于从存储器加载字数据到通用寄存器,指令格式举例“LDR R0, [R1]”。LDR伪指令是大范围地址访问指令,用于将任意一个32位常数或地址值加载到指定寄存器,伪指令格式举例“LDR R0, = 0xAABBCCDD”。
9、C语言程序中的函数是实现模块化设计的重要工具,其中函数名就是指向存储这个函数的第一条指令的内存地址。在汇编程序中,与函数名功能相似的是(程序标号)。
10、ATPS准则中规定用来传递参数和结果返回(仅考虑整数返回值)的是哪些通用寄存器?当传递的参数或者返回值较多时,怎么处理?
答: 传递的参数不超过4个时,使用R0-R4进行传递;返回值不超过4个整数时,也使用R0-R4进行返回。实际从R0开始按顺序使用这4个通用寄存器。当传递的参数或者返回值较多时,需要将多出的参数或者值进行入栈,并在数据栈中按先进后出的顺序进行存取。
11、ATPS准则中规定数据栈为(满递减)型,外部接口的数据栈必须(8)字节对齐。
12、在汇编程序中,声明可以被其他程序调用的程序时,应该使用(EXPORT)伪操作。
13、在C语言中,要声明调用的汇编程序时,应该使用(extern)关键字。
14、请编写汇编程序,实现从N个32位数中找到最大数,存放到R0中。
答:以N=10为例。
AREA MAX_of_N, CODE, READONLY ENTRY MOV R3, #9 LDR R2, = Scr LDR R0, [R2],#4 loop LDR R1, [R2],#4 CMP R1, R0 MOVGT R0, R1 SUBS R3, R3, #1 BNE loop stop B stop LTORG Scr DCD -10, 6, 7, 8, 10, -9, -2, -5, 6, -1 END
15、请为如下程序指定语句的“功能:”后面添加注释。(此题不用抄题)
; (1) 程序功能:________ num_of_words EQU 18 AREA CopyData, CODE, READONLY ENTRY start LDR R0, = Src LDR R1, = Dst MOV R2, #num_of_words LDR SP, =0x40001000 MOVS R3, R2, LSR #2 ; (2) 语句功能:________ BEQ Copy_Words STMFD SP!, {R5-R8} Copy_4Words LDMIA R0!, {R5-R8} ; (3) 语句功能:________ STMIA R1!, {R5-R8} ; (4) 语句功能:________ SUBS R3, R3, #1 BNE Copy_4Words ; (5) 语句功能:________ LDMFD SP!, {R5-R8} Copy_Words ANDS R2, R2, #3 ; (6) 语句功能:________ BEQ Stop Copy_Word LDR R3, [R0], #4 STR R3, [R1], #4 SUBS R2, R2, #1 BNE Copy_Word Stop B Stop LTORG ; (7) 语句功能:________ Src DCD 1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12 Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END
答:
(1) 以4个字为单位将18个字从源数据区Src复制到目标数据区Dst,不足4个字的部分以单字为单位复制;
(2) 获取总字数被4整除的部分存入R3,表示以4字为单位要复制R3次,并更新标志位;
(3) 将R0指向源数据区Src的连续4个字一次加载到R5-R8这4个寄存器,加载完之后R0+16;
(4) 将R5-R8这4个寄存器中的内容一次存储到R1指向的目标数据区Dst,存储完之后R1+16;
(5) 当R3不为0时,继续跳转到Copy_4words处执行;
(6) 获取总字数除以4的余数部分存入R2,表示以单字为单位要复制R2次,并更新标志位;
(7) 建立数据缓冲池,存放伪指令LDR用到的地址表达式。
16、请编写C语言和汇编互调程序实现求和式:n + 2n + 3n + 4n + 5n。(其中n可以自己设置,要求从C语言程序调用汇编程序进行参数赋值,并在汇编程序中调用C函数实现求和返回。)
答: 参考这里。
17、请编写汇编程序实现将“中断模式”和“管理模式”下的堆栈指针寄存器初始化。(假设初始化地址已定义为IRQStack和SVCStack)
答:
IRQMode EQU 0x12 SVCMode EQU 0x13 start MRS R0, CPSR BIC R0, 0x1F ; 设置中断模式的SP ORR R1, R0, #IRQMode MSR CPSR_c, R1 LDR SP, = IRQStack ; 设置管理模式的SP ORR R1, R0, #SVCMode MSR CPSR_c, R1 LDR SP, = SVCStack