ARM学习之ARM指令与汇编(二)

ARM汇编编译器支持的杂项伪操作

伪操作是ARM汇编语言源程序中的特殊指令助记符,其作用是为了完成汇编程序做各种准备工作的,指示汇编程序对汇编语言源程序的编译操作。是编译器执行的指令,而不是ARM处理器执行的指令。

符号定义伪操作

(1)用于定义全局变量的GBLA、GBLL和GBLS。
(2)用于定义局部变量的LCLA、LCLL和LCLS。
(3)用于对变量赋值的SETA、SETL和SETS。
(4)为通用寄存器列表定义名称的RLIST。


全局变量定义伪操作GBLA、GBLL和GBLS

GBLA   Test1	  ;定义一个全局的数字变量,变量名为Test1
Test1  SETA  0xaa	;将该变量赋值为0xaa
GBLL   Test2	  ;定义一个全局的逻辑变量,变量名为Test2
Test2  SETL  {TRUE}	;将该变量赋值为真
GBLS   Test3	  ;定义一个全局的字符串变量
Test3  SETS  "Testing" ;将该变量赋值为“Testing”

局部变量定义伪操作LCLA、LCLL和LCLS

LCLA   Test4	  ;声明一个局部的数字变量,变量名为Test4
Test3  SETA  0xaa	;将该变量赋值为0xaa
LCLL   Test5	  ;声明一个局部的逻辑变量,变量名为Test5
Test4  SETL  {TRUE}	;将该变量赋值为真
LCLS   Test6	  ;定义一个局部的字符串变量
Test6  SETS  "Testing" ;将该变量赋值为“Testing”

数据定义伪操作

数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。
(1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化
(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化
(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化
(7)SPACE用于分配一片连续的存储单元
(8)MAP用于定义一个结构化的内存表首地址
(9)FIELD用于定义一个结构化的内存表的数据域


DCB
DCB伪操作用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化

Str  DCB  "This is a test!"    ;分配一片连续的字节存储单元并初始化为指定字符串。

C_string  DCB  "C_string",0  ; 与C中的字符串不同,ARM汇编中的字符串不以null结尾,要想字符串以null结尾需要手动在后面添加0

DCW
DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用DC分配的字存储单元是半字对齐的,而用DCU分配的字存储单元并不严格半字对齐。

DataTest    DCW   1,2,3   ;分配一片连续的半字存储单元并初始化

DataDCF-255,2*number DCWU nunber+4   ;在指定内存单元初始值时可以使用已定义的变量   

DCD
DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。

DataTest DCD 4,5,6    ;分配一片连续的字存储单元并初始化

Datalest DCD nen06+4  ;用程序标号初始化内存单元

;在内存单元不能字对齐的情况下,使用DCDU伪操作
AREA  Mydata,DATA,READURTTE 
DCB   255:字节定义使内存单元不能字对齐
Data3 DCDU 1,5,20

SPACE
SPACE伪指令用于分配一片连续的存储区域并初始化为0。
SPACE伪操作常和ALIGN一起使用。

DataSpace SPACE   100   ;分配连续100字节的存储单元并初始化为0,存储单元的地址为DataSpace

;在Mydata段的开始可以是255个初始化为0的字节单元
AREA Mydata,DATA,READIRITE
data1   SPACE    255

汇编控制伪操作(了解)

IF、ELSE、ENDIF
WHILE、WEND
MACRO、MEND
MEXIT


杂项伪操作

ALIGN 用于使程序当前位置满足一定的对齐方式。

AREA 用于定义一个代码段或数据段

ENTRY 用于指定程序入囗点

END 用于指示源程序结束

EQU 跟C中的宏定义一致

EXPORT或GLOBAL 用于声明符号可以被其他文件引用,类比C中的extern

IMPORT 用于通知编译器当前符号不在本文件中,类比C中的extern


ARM汇编器支持的伪指令

ADR伪指令

ADR伪指令为小范围地址读取伪指令。ADR伪指令将基于PC相对偏移地址或基于寄存器相对偏移地址值读取到寄存器中,当地址值是字节对齐时,取值范围为-255-255,当地址值是字对齐时,取值范围为-1020~1020。当地址值是16字节对齐时其取值范围更大

LDR    R4,=data+4*n   ;n是汇编时产生的变量
;code 
MOV pc,1r 

data   DCD value0
       ...    ;n-1条DCD伪操作
       DCD  value7   ;  要装入R4的值
       ...  ;更多DCD伪操作

LDR伪指令

当要装载的常量超出了IOV指令或V指令的范围时,使用LDR指令由LDR指令装载的地址是绝对地址,即PC相关地址。

ldr r3,= 0xff0   ; r3 = 0xff0,相当于mov r3,#0xff0

ldr r2 ,= 0xfff    ;r2 = 0xfff ,相当于ldr r1,[PC,offset]

NOP伪指令

该指令让处理器完成一个空操作,且不会影响cpsr标志位。
可用于延时,相当于mov r0,r0

ldr r3,= 0xff0   ; r3 = 0xff0,相当于mov r3,#0xff0

;延时3个空操作时间
nop    
nop
nop

ldr r2 ,= 0xfff    ;r2 = 0xfff ,相当于ldr r1,[PC,offset]

你可能感兴趣的:(ARM)