Thumb伪指令
LDR (大范围的地址读取伪指令)
ARM汇编程序结构
AREA:用于定义一个代码段或数据段伪操作。
CODE16:用于告诉汇编器后面的指令序列为16位的Thumb指令。
ARM或CODE32:用于告诉汇编器后面的指令序列为32位的ARM指令。
GBLA伪操作用于定义一个全局的数字变量并初始化为0。
在汇编语言程序中,用AREA伪操作定义一个段,并说明所定义段的相关属性,本例定义一个名为Init的代码段,属性为只读。ENTRY伪操作标识程序的入口点,接下来为指令序列,程序的末尾为END伪指令,该伪操作告诉编译器源文件的结束,每一个汇编程序段都必须有一条END伪操作,指示代码段的结束。
注意
例题
1. AREA(段定义伪指令)
例题
2. CODE16、CODE32
3. ENTRY(程序入口指示伪指令)
4. END(程序结束伪指令)
5. EQU(等价伪指令)
6. EXPORT(全局标号声明伪指令)
EXPORT伪操作用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写。
7. IMPORT(标号引用并加入声明伪指令)
8. 数据定义伪操作(DCB、DCD、DCW)
汇编语言程序设计
编制一个汇编语言程序的步骤如下:
例题
C程序实现5个整数求和
数据块复制应用举例
AREA reset,CODE,READONLY
num EQU 20 ;设置复制的字数
ENTRY ;程序入口
start LDR r0,=src ;r0指向源数据块首地址
LDR r1,=dst ;r1指向目标数据块首地址
MOV r2,#num ;r2复制的字数
MOV sp,#0x400 ;设置堆栈指针,用于保存工作寄存器数值
blockcopy
MOVS r3,r2,LSR #3 ;需要进行的以8个字为单位的数据复制
BEQ copywords ;对剩余不足8个字数据,跳转到copywords
;以字为单位复制
STMFD sp!,{
r4-r11} ;保存工作寄存器
octcopy
LDMIA r0!,{
r4-r11} ;从数据源取出8个字数据放到寄存器,并更新R0
STMIA r1!,{
r4-r11} ;将数据写入目的地址,并更新R1
SUBS r3,r3,#1 ;将块复制次数减1
BNE octcopy ;循环直到完成以8个字为单位的复制
LDMFD sp!,{
r4-r11} ;恢复工作寄存器
copywords
ANDS r2,r2,#7 ;剩余不足8个字的数据的字数
BEQ stop ;数据复制完成则跳转到stop
wordcopy
LDR r3,[r0],#4 ;从数据源取出一个字数据到R3,并更新R0
STR r3,[r1],#4 ;将字数据存储到目标地址,并更新R1
SUBS r2,r2,#1 ;字复制次数减1
BNE wordcopy ;循环,直到字复制完毕
;定义数据区SRC和DST
stop
b stop
AREA reset,DATA,READWRITE
src DCD 1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1
dcb "abcd1234efgh5678"
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
END