嵌入式系统·第4章练习题


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、请为如下程序指定语句的“功能:后面添加注释。(此题不用抄题)

Copy_Data.S
; (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