1、College of Computer Science & Technology,第三章 ARM汇编编程,鲁东大学 LUDONG UNIVERSITY,ARM汇编语言伪指令(Directives),什么是伪指令:由汇编器提供的指令,指导汇编程序对代码进行汇编,辅助编程人员进行汇编编程机器指令(Instructions)运行期间由机器执行伪指令(Directives,Pseudo)-由汇编器处理汇编语言指示符-指示汇编器进行相应的操作 操作伪指令-汇编器汇编成对应机器指令,鲁东大学 LUDONG UNIVERSITY,伪指令举例,AREA ThumbSub, CODE, READONLY ENT
2、RY CODE32 ;ARM header ADR r0, start + 1 CODE16 ;Thumb. start MOV r0, #10 doadd MOV pc, lr END,汇编控制伪指令,鲁东大学 LUDONG UNIVERSITY,ARM汇编语言伪指令,杂项伪指令,报告伪指令,操作伪指令,数据定义伪指令,符号定义伪指令,鲁东大学 LUDONG UNIVERSITY,符号定义伪指令,符号定义指令(Symbol definition directives):用于定义ARM汇编程序中的变量(实为常量),可进行重新赋值。GBLA, GBLL, GBLSLCLA, LCLL, LCLS
3、 SETA, SETL,SETS,鲁东大学 LUDONG UNIVERSITY,全局变量声明,GBLA, GBLL, GBLS- 声明一个全局的算术、逻辑和串变量 有效作用范围:The scope of the variable is limited to the source file that contains it.,鲁东大学 LUDONG UNIVERSITY,变量赋值,SETA, SETL, SETS-给一个算术、逻辑、串变量赋值Example:GLBA aGLBS abcGLBS defa SETA 256*256abc SETS this string contains only
4、 one double quotedef SETS this string contains only one $ dollar symbol,鲁东大学 LUDONG UNIVERSITY,Example,GBLA VersionNumberVersionNumber SETA 21 GBLL DebugDebug SETL TRUE GBLS VersionStringVersionString SETS Version 1.0,鲁东大学 LUDONG UNIVERSITY,局部变量声明,LCLA, LCLL, LCLS-声明一个局部的算术、逻辑、串变量有效作用范围:The scope of
5、 the variable is limited to a particular macro that contains it.,鲁东大学 LUDONG UNIVERSITY,Example,MACRO ; Declare a macro $label message $a ;Macro prototype line LCLS err ; Declare local string variable err SETS error no: ; Set value of err MEND,鲁东大学 LUDONG UNIVERSITY,数据定义伪指令,数据定义指令(Data definition di
6、rectives):用于进行数据空间分配。SPACEDCB DCD, DCDU MAP, FIELD,鲁东大学 LUDONG UNIVERSITY,SPACE,The SPACE directive reserves a zeroed block of memory.分配一块内存单元,并用0初始化。ExampleAREA MyData, DATA, READWRITEdata1 SPACE 255 ; defines 255 bytes of zeroed store,鲁东大学 LUDONG UNIVERSITY,DCB,The DCB directive allocates one or m
7、ore bytes of memory, and defines the initial values of the memory.分配一段字节内存单元,并用伪指令中的expr初始化。 Syntax:label DCB expr ,expr.ExampleDISPTAB DCB 0x33,0x43,0x76ERRSTR DCB “Send data is error!”,0,鲁东大学 LUDONG UNIVERSITY,DCD,DCDU,The DCD directive allocates one or more words of memory, aligned on 4-byte boun
8、daries.DCDU is the same, except that the memory alignment is arbitrary.分配一段字内存单元,并用伪指令中的expr初始化。DCD分配的内存单元需要字对齐,而DCDU则不需要Syntax:label DCDU expr ,expr.,鲁东大学 LUDONG UNIVERSITY,Example for DCD,DCDU,鲁东大学 LUDONG UNIVERSITY,字对齐和非字对齐,DCB 255 ; Now misaligned .data3 DCDU 20,data3 DCD 20,鲁东大学 LUDONG UNIVERSI
9、TY,MAP,FIELD,MAP directive sets the origin of a storage map to a specified address. 将内存区(表)的首地址映射到一个指定地址 is a synonym (同义词)for MAP.Syntax MAP expr,base-registerExample MAP 0,r9 MAP 0xff,r9 0,r9,鲁东大学 LUDONG UNIVERSITY,MAP,FIELD,FIELDdirective describes space within a storage map that has been defined
10、 using the MAP directive. # is a synonym for FIELD. Syntaxlabel FIELD exprExample MAP 0,r9 Integer FIELD 4 Lab FIELD 4 LDR r0,Lab,鲁东大学 LUDONG UNIVERSITY,MAP,FIELD-EXAMPLE,StartOfMyTable EQU 0x1000 MAP 0x1000Integer FIELD 4Integer2 FIELD 4String FIELD 100Array FIELD 128BitMask FIELD 4,对于结构化表结构的存,取操作M
11、OV r1,#1LDR r0,=IntegerSTR r1,r0LDR r2,r0,鲁东大学 LUDONG UNIVERSITY,操作伪指令-pseudoinstruction,Pseudo Instruction-编译器将编译为ARM机器指令,与Directive Instuction不同。 ADR ADRL LDR NOP,鲁东大学 LUDONG UNIVERSITY,ADR,ADR-小范围地址读取指令SYNAX ADR 寄存器号,表达式 地址相对于PC的偏移量,在-511B512B的范围内。 使用的标号必须是本段内定义的,不能使用导入的全局标号。EXAMPLE: ADR r0,GotoT
12、humb+1 BX r0 CODE16 GotoThumb ADD r0,r1,鲁东大学 LUDONG UNIVERSITY,ADRL,ADRL-中范围地址读取指令 可以加载的最大地址范围在128KB的范围 与ADR相同,只能加载本段定义的标号地址ADRL与ADR的区别ADR伪指令通常会被汇编器翻译成一条语句 向前-sub rn,pc,#xxx 向后-add rn,pc,#xxxADRL会翻译成两条。,鲁东大学 LUDONG UNIVERSITY,ADR-ADRL区别说明,8位补码,加边界对齐,鲁东大学 LUDONG UNIVERSITY,ARM伪指令-操作伪指令(2),LDR-用于加载32位的立即数/地址到目的寄存器SYNTAX LDR 寄存器号,=立即数/地址标号表达式 EXAMPLE LDR r0,=0x12345678 LDR r0,=GotoThumb+10区别:LDR r0,r1NOP-空操作,用于延时和预留存储空间,