MOV R15,R14 ;返回 b
ADD R1,R1,#1 ;R1自加1
B START ;跳转到START
STOP
B STOP ;死循环
END
第四章
4.1什么是伪指令和伪操作?在ARM汇编中有哪几种伪 指令?
答:在ARM汇编语言程序中有些特殊助记符,这些助记符与一般指令的助记符的不同之处在于没有相对应的操作码或者机器码,通常称这些特殊指令助记符卫伪指令,他们多完成的操作成为伪操作;
在ARM汇编中,有如下几种伪指令:
(1)符号定义伪指令;
(2)数据定义伪指令;
(3)汇编控制伪指令;
(4)信息报告伪指令;
(5)宏指令及其他伪指令。
4.2如何定义寄存器列表,试举一个使用寄存器列表的例子,要求实现4个字的内存复制。
答: AREA EXAMPLE1,CODE,READONLY
ENTRY
LDR R0,=0XFF ;把地址0XFF赋给R0
LDR R5,=0X0F ;把地址0X0F赋给R5
START
PBLOCK RLIST {R1-R4} ;把R1-R4定义为PBLOCK
STMIA R0,PBLOCK ;把R1到R2的值依次赋给
;R0为首地址
;的内存单元中,每次赋完一次
;值自动加1
LDMIA R5,PBLOCK ;把R1到R4的值依次赋给以R5
;为首地址的内存单元中,R5每
;次自动加1
STOP
B STOP ;死循环
END
3.4参考CPSR寄存器中各标志位的含义,使处理器处于系统模式。
AREA EXAMPLE2,CODE,READONLY
ENTRY
START
MOV R0,#0x1F
MSR CPSR_c,R0
STOP
B STOP
END
4.3如何定义一个宏,宏与子程序的区别是什么?
答:宏的格式为:
MARCO和MEND
[$标号] 宏名 [$参数1,$参数2…..]
指令序列
MEND
MARCO表示一个宏定义的开始,MEND表示一个宏的结束,MARCO和MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后在程序中就可以在程序中通过宏的名称及参数调用该段代码。
宏指令可以重复使用,这一点的使用方式与子程序有些相似,子程序可以节省存储空间,提供模块化的程序设计。但使用子程序机构时需要保存/恢复现场,从而增加了系统的开销,因此,在代码传递的参数较多并且比较短时,可以使用宏代替子程序,宏在被调用的地方展开。
4.4ARM汇编中如何定义一个段,段有几种属性?
答:AREA用于定义一个代码段,数据段,或者特定属性的段。
段的几种属性如下:
READONLY表示只读属性;
READWRITE表示本段可读写;
CODE定义代码段;
DATA定义数据段;
ALIGN=表达式的对齐方式为2的表达式次方;;
COMMON:定义一个通用段,这个段不包含用户代码和数据。
4.5在一个汇编源文件中如何包含另一个文件中的内容?
答:通常可以使用GET/INCLUDE指令,在某源文件中定义一些宏指令,用MAP和FIELD定义结构化数据结构类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他源文件中。
4.6分别编写一个函数和一个宏,实现字符串的复制。
MACRO
COPY $P1,$P2 ;定义一个宏
$P1 DCB \ ;分配一个字节的空间,并初始化为一个
;字符串
$P2 DCB \ ;同上
LDR R0,=$P1 ;把P1的首地址加载到R0
LDR R6,=$P2 ;把P2的首地址加载到R1
LDRIA R0,[R1-R5] ;把R0每载一次,自加一次
;实现把P1加载到R0
STRIA R6,[R1-R5] ;同理(上)
MEND
AREA COPY,CODE,READONLY
ENTRY
START
MACRO STR1,STR2 ;调用宏
B START ;死循环
END
4.7解释归纳变量,同族的归纳变量及基本的归纳变量。
4.8试将下面这段C代码翻译为等效的汇编代码: int Factorial(int) //计算i阶乘
{ If(i==0)
{ Return 1;
}
Return i*Factorial(i-1);
} }
解:该段C代码等效汇编为:
i EQU R1
AREA EXAMPLE,CODE,READONLY
ENTRY
BL DATA ;跳到DATA取值
START
[ i=1 ;如果i=1
MOV R3,#1 ;R3用来存放阶乘的值,值为1
B EXIT ;跳到死循环
嵌入式系统原理与接口技术习题答案



