




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM嵌入式系统
第5章 ARM汇编程序设计
ARM嵌入式系统
第5章 ARM汇编程序设计
15.1汇编语言源程序助记符伪指令宏指令5.1汇编语言源程序助记符2汇编指令和机器指令是“一一对应”的汇编语言程序需由汇编程序将其汇编为机器语言程序,才能被计算机执行。汇编语言大体上包括了汇编指令、系统调用和中断、伪指令和宏指令,汇编语言是强烈依赖硬件和汇编环境的。
学习和使用汇编语言程序设计的原因汇编指令和机器指令是“一一对应”的3指令语句(instructions)
完成一定操作功能,能够翻译成机器代码的语句。伪指令语句(directives,指示性语句)
为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。宏指令语句(marcos) 可看成是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能。指令语句(instructions)4ARM程序设计基础
伪指令宏与宏指令ARM汇编语言规范(语句、表达式和运算符)ARM汇编语言的程序格式ARM程序设计基础伪指令55.2伪指令段定义标号符号定义伪指令数据定义伪指令汇编控制伪指令其他伪操作5.2伪指令段定义6汇编语言程序示例AREA Block, CODE, READONLY num EQU 10 ENTRY
start
LDR R0, =src LDR R1, =dst MOV R2, #numblockcopy LDR R3, [R0], #4 STR R3, [R1], #4 SUBS R2, R2, #1 BNE blockcopy B . AREA BlockData, DATA, READWRITEsrc DCD 0,1,2,3,4,5,6,7,8,9dst SPACE 10*4 END汇编语言程序示例AREA Block, CODE, REA7符号定义伪指令定义全局变量: GBLA、GBLL和GBLS定义局部变量: LCLA、LCLL和LCLS变量赋值: SETA、SETL、SETS通用寄存器列表定义名称:RLIST
符号定义伪指令定义全局变量: GBLA、GBLL和GBLS8GBLA、GBLL和GBLSGBLA、GBLL和GBLS 语法格式:
GBLA(GBLL或GBLS) 全局变量名
GBLAobjectsize;全局的数字变量objectsize,为0ObjectsizeSETA0xff
;将该变量赋值为0xff
SPACEobjectsize;引用该变量
GBLLstatusB
;全局的逻辑变量statusB,为{False}statusBSETL{TRUE} ;将该变量赋值为真
全局:作用范围为包含该变量的源程序GBLA、GBLL和GBLSGBLA、GBLL和GBLS9LCLA、LCLL和LCLSLCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS) 局部变量名 MACRO ;声明一个宏$labelmessage$a;宏的原型LCLSerr;声明一个局部变量err,为空串errSETS“errorno:”;向该变量赋值$label
;代码INFO0,err:CC::STR:$a;使用该串变量MEND ;宏定义结束
局部:作用范围为包含该局部变量的宏代码的一个实例LCLA、LCLL和LCLSLCLA、LCLL和LCLS10SETA、SETL、SETSSETA、SETL和SETS 语法格式: 变量名 SETA(SETL或SETS) 表达式 在向变量赋值前,必须先声明该变量
SETA、SETL、SETSSETA、SETL和SETS11RLISTRLIST 语法格式:
名称 RLIST {寄存器列表}
ContextRLIST{r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context,可在ARM指令LDM/STM中通过该名称访问寄存器列表。排列顺序无关
RLISTRLIST12数据定义伪指令
DCB
DCW(DCWU)DCD(DCDU)DCFD(DCFDU)DCFS(DCFSU)SPACEMAPFIELD数据定义伪指令DCB 13DCB
语法格式:
{标号} DCB 表达式
表达式取值范围:-128~127;0~255的数字或字符串。 DCB:“=”
Nullstring DCB “Nullstring”,0
;构造一个以0结尾的字符串DCB 语法格式:14DCW(或DCWU)
语法格式:
{标号} DCW(或DCWU) 表达式
DCW:半字对齐 DCWU:不严格半字对齐。 表达式取值范围:-32768~32767;0~65535
data1 DCW -128,num1+8
;num1必须是已经定义过的
DCW(或DCWU) 语法格式:15DCD(或DCDU)
语法格式:
{标号} DCD(或DCDU) 表达式
DCD:“&” DCD:字对齐 DCDU:不严格字对齐。
data1 DCD 1,5,20 ;其值为1,5,20
data2 DCD memaddr+4
;分配一个字单元,其值为程序中标号memaddr加4个字节DCD(或DCDU) 语法格式:16DCFD(或DCFDU)
语法格式:
{标号} DCFD(或DCFDU) 表达式 每个双精度的浮点数占据两个字单元。 DCFD:字对齐 DCFDU:不严格字对齐
DCFD 1E308,-4E-100 DCFDU 100000,-.1,3.1E26
DCFD(或DCFDU) 语法格式:17DCFS(或DCFSU)
语法格式:
{标号}DCFS(或DCFSU)表达式 每个单精度的浮点数占据一个字单元。 DCFS:字对齐 DCFSU:不严格字对齐
DCFS 1E3,-4E-9
DCFSU 1.0,-.1,3.1E6
DCFS(或DCFSU) 语法格式:18SPACE
语法格式:
{标号} SPACE 表达式 分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。 SPACE:“%”
DatastrucSPACE280
;分配连续280字节的存储单元并初始化为0SPACE 语法格式:19LTORG 语法格式:
{标号} LTORG 说明某个存储区域是用来暂存数据的数据缓冲区——文字池或数据缓冲池。大的代码段也可以使用多个数据缓冲池。当程序中使用LDR之类的指令访问数据缓冲池时,为防止越界产生,通常把数据缓冲池放在代码段的后面,或者放在无条件跳转指令或子程序返回指令之后,使得处理器不会错误的将数据缓冲池中的数据当做指令来执行。
AREAExample,CODE,READONLYStartBLFunc1…Func1LDRR1,=0x800
MOVPC,LR
LRORGDataSPACE40
ENDLTORG 语法格式:20MAP
语法格式:
MAP表达式{,基址寄存器} 用于定义一个结构化的内存表的首地址。 MAP:“^” 通常与FIELD伪指令配合使用来定义结构化的内存表。
MAP fun
;定义结构化内存表,fun就是内存表的首地址
MAP 0x80,R9
;定义结构化内存表首地址的值为0x80+R9MAP 语法格式:21FILED 语法格式:
{标号}FIELD表达式 定义一个结构化内存表中的数据域。FILED也可用“#”代替。
MAP 0
;定义结构化内存表首地址为0
consta FIELD 4
;consta的长度为4字节,相对位置为0x0
constb FIELD 4
;constb的长度为4字节,相对位置为0x4
x FIELD 8
;x的长度为8字节,相对位置为0x8
y FIELD 8
;y的长度为8字节,相对位置为0x10
string FIELD 256
;y的长度为256字节,相对位置为0x18
MOV R9,#4096
LDR R5,[R9,constb]
;将内存表中数据域constb读取到R5中FILED 语法格式:22汇编控制伪指令
汇编控制(AssemblyControl)伪指令用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:IF、ELSE、ENDIFWHILE、WEND汇编控制伪指令 汇编控制(AssemblyControl23IF、ELSE、ENDIF语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF示例: IFVersion=“1.0”
;指令
;伪指令
ELSE
;指令
;伪指令
ENDIFIF、ELSE、ENDIF语法格式:24WHILE、WEND
语法格式: WHILE 逻辑表达式 指令序列 WEND示例:
count SETA 1 WHILE count<=4
count SETA count+1
;code
WEND
WHILE、WEND语法格式:25其他常用的伪操作
AREACODE16、CODE32ENTRYENDEQUIMPORTGET(或INCLUDE)其他常用的伪操作AREA26AREA语法格式: AREA 段名属性1,属性2,……
定义一个代码段或数据段。 常用的属性如下:
CODE:用于定义代码段,默认为READONLY。
DATA:用于定义数据段,默认为READWRITE。
READONLY:指定本段为只读,代码段默认为READONLY。
READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。示例: AREA Example,CODE,READONLY ;codeAREA语法格式:27CODE16、CODE32语法格式: CODE16(或CODE32) CODE16:其后的指令序列为16位的Thumb指令。 CODE32:其后的指令序列为32位的ARM指令。
示例: AREA ChangeState,CODE,READONLY CODE32 ;指示下面的指令为ARM指令 LDR r0,=start+1 BX r0 ;切换到Thumb状态,并跳转到start处执行 CODE16 ;指示下面的指令为Thumb指令startMOVr1,#10
CODE16、CODE32语法格式:28ENTRY语法格式:
ENTRY ENTRY伪操作用于指定汇编程序的入口点。在一个源文件里最多只能有一个ENTRY(可以没有)。在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定)。示例:
AREAexample,CODE,READONLY ENTRY ;应用程序的入口点
ENTRY语法格式:29END
语法格式:
END END伪指令用于通知编译器已经到了源程序的结尾。示例: AREAexample,CODE,READONLY …… END
END语法格式:30EQU语法格式:
名称 EQU 表达式{,类型} EQU:“*”示例:
abcdEQU2;定义abcd符号的值为2
abcdEQUlabel1+16;定义abcd符号的值(label1+16)EQU语法格式:31IMPORT
语法格式:
IMPORT 标号{[WEAK]}
用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。示例:
AREAInit,CODE,READONLYIMPORT Main
;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义……ENDIMPORT语法格式:32GET(或INCLUDE)
语法格式: GET 文件名 用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。使用方法与C语言中的“include”相似。示例: AREAexample,CODE,READONLY GETfile1.s ;包含源文件file1.s GETC:\project\file2.s ;包含源文件file2.s GETC:\Programfiles\file3.s ;包含源文件file3.sGET(或INCLUDE)语法格式:335.3宏和宏指令
宏:在汇编程序中可以用伪指令MACRO、MEND为一个程序段定义一个名称,在往后的程序中就可以通过这个名称来使用它所代表的程序段。在源程序被汇编时,该名称将被替换为它所代表的程序段。
宏指令:在ARM中,还有一种汇编器内置的无参数和标号宏,我们把其称为宏指令。在汇编的时候,这些宏指令也是被替换成一条或两条真正的ARM或Thumb指令。
ADR、ADRL、LDR5.3宏和宏指令 宏:在汇编程序中可以用伪指令MACRO34MACRO、MEND
语法格式: MACRO
$标号宏名$参数1,$参数2,……;宏名为宏的名称,为宏在程序中引用名。;$参数1,$参数2,……为宏中可以使用的参数。
指令序列;宏定义体 MEND规定:$标号为主标号,宏内的所有其他的标号必须由主标号组成。宏中的所有标号必须在前面冠以符号$。宏中的参数在汇编时被相应的值替换。示例:在ARM中完成测试-跳转操作需要两条指令,定义一条宏指令完成测试-跳转操作 MACRO
$label TestAndBranch $dest,$reg,$cc
$label.A1 CMP $reg, #0 B$cc $dest MENDMACRO、MEND语法格式:35MACRO、MEND
;在程序中调用该宏
testTestAndBranchNonZero,r0,NE … …
NonZero;程序被汇编后,宏展开的结果
testCMPr0,#0 BNENonZero … …
NonZeroMACRO、MEND;在程序中调用该宏36MEXIT语法格式:
MEXIT MEXIT用于从宏定义中跳转出去。
MEXIT语法格式:37宏指令ADRADRLLDRNOP宏指令ADR38ADR-小范围的地址读取伪指令语法格式 ADR{cond}register,expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围:地址非字对齐,-255~255地址字对齐,-1020~1020
将基于PC或寄存器的地址值读取到寄存器中。 ADR伪指令被替换成一条合适的指令(ADD指令或SUB指令)。如果不能用一条来实现ADR伪指令的功能,编译器将报告错误。ADR-小范围的地址读取伪指令语法格式39ADR-小范围的地址读取伪指令示例:
start MOVr0,#10;PC值为当前指令地址值加8字节 ADRr4,start
;本ADR伪指令将被编译器替换成 ;SUBr4,pc,#0xcADR-小范围的地址读取伪指令示例:40ADRL-中等范围的地址读取伪指令语法格式 ADRL{cond}register,expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围:地址非字对齐,-64KB~64KB地址字对齐,-256KB~256KB
将基于PC或寄存器的地址值读取到寄存器中。 ADRL伪指令被替换成两条合适的指令。如果不能用两条来实现ADRL伪指令的功能,编译器将报告错误。ADRL-中等范围的地址读取伪指令语法格式41ADRL-中等范围的地址读取伪指令示例:
start MOVr0,#10;PC值为当前指令地址值加8字节 ADRLr4,start+60000
;本ADRL伪指令将被编译器替换成下面两条指令 ;ADDr4,pc,#0xe800 ;ADDr4,r4,#0x254 ;60000=0xEA60ADRL-中等范围的地址读取伪指令示例:42LDR-大范围的地址读取伪指令语法格式 LDR{cond}register,=[expr|label-expr] cond:可选的指令执行条件 register:目标寄存器 expr:32位常数当expr没有超过MOV或MVN指令中的地址取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令反之,编译器将该常数放在数据缓冲池中,同时用一条基于PC的LDR指令读取该常数。LDR伪指令处的PC值到数据缓冲池中目标数据所在地址的偏移量要小于4KB。
将32位常数或者地址值读取到寄存器中。LDR-大范围的地址读取伪指令语法格式43LDR-大范围的地址读取伪指令示例1:将0xff0读取到R1中
LDR R1,=0xFF0
;汇编后将得到MOVR1,#0xFF0示例2:将0xfff读取到R1中
LDR R1,=0xFFF ;LDRR1,[PC,OFFSET_TO_LPOOL] ;… ;LPOOLDCD0xFFF示例3:将外部地址ADDR1读取到R1中
LDR R1,=ADDR1 ;LDRR1,[PC,OFFSET_TO_LPOOL] ;… ;LPOOLDCDADDR1
LDR-大范围的地址读取伪指令示例1:将0xff0读取到R144NOP-空操作伪指令语法格式 NOPNOP-空操作伪指令语法格式455.4汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为:
{标号} {指令或伪指令} {;注释}
标号:从一行的行头开始,不能包含空格
指令或伪指令:指令的前面必须有空格或符号
注释:以“;”开头 每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。 语句之间可以插入空行。 如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。5.4汇编语言的语句格式 ARM(Thumb)汇编语言的46ARM汇编语言中的符号
命名规则:
符号由大小写字母、数字以及下划线组成符号是区分大小写的符号中的所有字符都是有意义的符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号程序中的符号不能与系统内部变量或者系统预定义的符号同名程序中的符号通常不要与指令助记符或者伪操作同名。当同名时,用双竖线将符号括起来ARM汇编语言中的符号命名规则: 47数字常量
数字常量是32位的整数 无符号数:0~232-1 有符号数时:-231~231-1。
EQU:定义数字常量数字常量 数字常量是32位的整数48变量
变量有数字变量、逻辑变量和字符串变量数字变量的大小不应超出数字变量所能表示的范围逻辑变量只有两种取值情况:真{true}或假{false}字符串变量的长度不应超出字符串变量所能表示的范围GBLA、GBLL、GBLS:声明全局变量LCLA、LCLL、LCLS:声明局部变量SETA、SETL和SETS:赋值变量变量有数字变量、逻辑变量和字符串变量49标号
表示程序中的指令或着数据地址的符号。目标地址标号:基于PC的标号 位于目标指令前或者程序中数据定义伪操作前的标号。汇编时将被处理成PC值加上或减去一个数字常量。常用于表示跳转指令的目标地址,或者代码段中的少量数据。
数据或数据区首地址标号:基于寄存器的标号 写在数据或数据区定义伪指令前面的标号。这种标号常在寄存器间接寻址方式中作为地址寄存器的首地址,在偏移量的配合下对数据表中的数据进行读/写操作。
绝对地址: 32位数字量
标号 表示程序中的指令或着数据地址的符号。50LDRR0,=0x3FF5000target1LDRR1,0xFFSTRR1,[R0]LDRR0,=0x3FF5008LDRR1,0x01STRR1,[R0]Btarget1LDRR0,=0x3FF500051ARM汇编语言中的表达式
表达式由符号、数值、单目或多目操作符以及括号组成。在一个表达式内各种元素的优先级:括号内的表达式优先级最高各种操作符有一定的优先级相邻的单目操作符的执行顺序为由右到左,单目操作符优先级高于其他操作符优先级相同的双目操作符执行顺序为由左到右ARM汇编语言中的表达式 表达式由符号、数值、单目或多目操作52数字逻辑字符串表达式常量变量运算符括号数字表达式常量53数字表达式
整数数字量示例:a SETA 34906Addr DCD 0xA10E DCD 2_11001010c3 SETA 8_74007 DCQ 0x123456789abcdef数字表达式整数数字量54数字表达式
浮点数字量 单精度浮点数表示范围:3.4e+38~1.18e-38
双精度浮点数表示范围:1.8e+308~2.23e-308示例: DCFD 1E308,-4E100 DCFS 1.0 DCFD 3.725e15 DCFS 0x7FC00000 DCFD &FFF0000000000000数字表达式浮点数字量55数字表达式操作符NOT按位取反
:NOT:A+、-、×、/及MOD算术操作符
A+B,A-B,A×B,A/B,A:MOD:BROL、ROR、SHL及SHR移位(循环移位)操作
A:ROL:B,A:ROR:B,A:SHL:B,A:SHR:BAND、OR、EOR按位逻辑操作符
A:AND:B,A:OR:B,A:EOR:B数字表达式操作符56逻辑表达式关系操作符A=B A>BA<BA>=BA<=BX/=BA<>B逻辑表达式关系操作符57逻辑表达式逻辑操作符:LNOT:A A:LAND:BA:LOR:BA:LEOR:B逻辑表达式逻辑操作符58字符串表达式
字符串 双引号“”;$$->$;““->“ 示例:
abcSETS“thisstringcontainsonly““doublequote”
defSETS“thisstringcontainsonly$$doublequote”字符串表达式字符串59字符串表达式
操作符LEN:LEN:ACHR:CHR:ASTR:STR:ALEFTA:LEFT:BRIGHTA:RIGHT:BCCA:CC:B字符串表达式操作符60字符串表达式
示例 GBLSSTRING1 GBLSSTRING2STRING1SETS“AAACCC”STRING2SETS“BB”:CC:(STRING1:LEFT:3);STRING2:“BBAAA”字符串表达式示例61其他常用操作符
?操作符
?操作符返回某代码行所生成的可执行代码的长度,例如:
?X 返回定义符号X的代码行所生成的可执行代码的字节数。DEF操作符
DEF操作符判断是否定义某个符号,例如:
:DEF:X 如果符号X已经定义,则结果为真,否则为假。其他常用操作符?操作符62其他常用操作符
?操作符
?操作符返回某代码行所生成的可执行代码的长度,例如:
?X 返回定义符号X的代码行所生成的可执行代码的字节数。DEF操作符
DEF操作符判断是否定义某个符号,例如:
:DEF:X 如果符号X已经定义,则结果为真,否则为假。其他常用操作符?操作符63程序中的变量代换
$操作符
数字变量:编译器将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换$后的数字变量。逻辑变量:编译器将该逻辑变量代换为它的取值(真或假)字符串变量:编译器会将该字符串变量的值代换$后的字符串变量例子:LCLSS1LCLSS2S1SETS“TEST!”S2SETS“Thisisa$S1”;字符串变量S2的值为“ThisisaTEST!”程序中的变量代换$操作符64ARM汇编程序设计课件65ARM嵌入式系统
第5章 ARM汇编程序设计
ARM嵌入式系统
第5章 ARM汇编程序设计
665.1汇编语言源程序助记符伪指令宏指令5.1汇编语言源程序助记符67汇编指令和机器指令是“一一对应”的汇编语言程序需由汇编程序将其汇编为机器语言程序,才能被计算机执行。汇编语言大体上包括了汇编指令、系统调用和中断、伪指令和宏指令,汇编语言是强烈依赖硬件和汇编环境的。
学习和使用汇编语言程序设计的原因汇编指令和机器指令是“一一对应”的68指令语句(instructions)
完成一定操作功能,能够翻译成机器代码的语句。伪指令语句(directives,指示性语句)
为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。宏指令语句(marcos) 可看成是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能。指令语句(instructions)69ARM程序设计基础
伪指令宏与宏指令ARM汇编语言规范(语句、表达式和运算符)ARM汇编语言的程序格式ARM程序设计基础伪指令705.2伪指令段定义标号符号定义伪指令数据定义伪指令汇编控制伪指令其他伪操作5.2伪指令段定义71汇编语言程序示例AREA Block, CODE, READONLY num EQU 10 ENTRY
start
LDR R0, =src LDR R1, =dst MOV R2, #numblockcopy LDR R3, [R0], #4 STR R3, [R1], #4 SUBS R2, R2, #1 BNE blockcopy B . AREA BlockData, DATA, READWRITEsrc DCD 0,1,2,3,4,5,6,7,8,9dst SPACE 10*4 END汇编语言程序示例AREA Block, CODE, REA72符号定义伪指令定义全局变量: GBLA、GBLL和GBLS定义局部变量: LCLA、LCLL和LCLS变量赋值: SETA、SETL、SETS通用寄存器列表定义名称:RLIST
符号定义伪指令定义全局变量: GBLA、GBLL和GBLS73GBLA、GBLL和GBLSGBLA、GBLL和GBLS 语法格式:
GBLA(GBLL或GBLS) 全局变量名
GBLAobjectsize;全局的数字变量objectsize,为0ObjectsizeSETA0xff
;将该变量赋值为0xff
SPACEobjectsize;引用该变量
GBLLstatusB
;全局的逻辑变量statusB,为{False}statusBSETL{TRUE} ;将该变量赋值为真
全局:作用范围为包含该变量的源程序GBLA、GBLL和GBLSGBLA、GBLL和GBLS74LCLA、LCLL和LCLSLCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS) 局部变量名 MACRO ;声明一个宏$labelmessage$a;宏的原型LCLSerr;声明一个局部变量err,为空串errSETS“errorno:”;向该变量赋值$label
;代码INFO0,err:CC::STR:$a;使用该串变量MEND ;宏定义结束
局部:作用范围为包含该局部变量的宏代码的一个实例LCLA、LCLL和LCLSLCLA、LCLL和LCLS75SETA、SETL、SETSSETA、SETL和SETS 语法格式: 变量名 SETA(SETL或SETS) 表达式 在向变量赋值前,必须先声明该变量
SETA、SETL、SETSSETA、SETL和SETS76RLISTRLIST 语法格式:
名称 RLIST {寄存器列表}
ContextRLIST{r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context,可在ARM指令LDM/STM中通过该名称访问寄存器列表。排列顺序无关
RLISTRLIST77数据定义伪指令
DCB
DCW(DCWU)DCD(DCDU)DCFD(DCFDU)DCFS(DCFSU)SPACEMAPFIELD数据定义伪指令DCB 78DCB
语法格式:
{标号} DCB 表达式
表达式取值范围:-128~127;0~255的数字或字符串。 DCB:“=”
Nullstring DCB “Nullstring”,0
;构造一个以0结尾的字符串DCB 语法格式:79DCW(或DCWU)
语法格式:
{标号} DCW(或DCWU) 表达式
DCW:半字对齐 DCWU:不严格半字对齐。 表达式取值范围:-32768~32767;0~65535
data1 DCW -128,num1+8
;num1必须是已经定义过的
DCW(或DCWU) 语法格式:80DCD(或DCDU)
语法格式:
{标号} DCD(或DCDU) 表达式
DCD:“&” DCD:字对齐 DCDU:不严格字对齐。
data1 DCD 1,5,20 ;其值为1,5,20
data2 DCD memaddr+4
;分配一个字单元,其值为程序中标号memaddr加4个字节DCD(或DCDU) 语法格式:81DCFD(或DCFDU)
语法格式:
{标号} DCFD(或DCFDU) 表达式 每个双精度的浮点数占据两个字单元。 DCFD:字对齐 DCFDU:不严格字对齐
DCFD 1E308,-4E-100 DCFDU 100000,-.1,3.1E26
DCFD(或DCFDU) 语法格式:82DCFS(或DCFSU)
语法格式:
{标号}DCFS(或DCFSU)表达式 每个单精度的浮点数占据一个字单元。 DCFS:字对齐 DCFSU:不严格字对齐
DCFS 1E3,-4E-9
DCFSU 1.0,-.1,3.1E6
DCFS(或DCFSU) 语法格式:83SPACE
语法格式:
{标号} SPACE 表达式 分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。 SPACE:“%”
DatastrucSPACE280
;分配连续280字节的存储单元并初始化为0SPACE 语法格式:84LTORG 语法格式:
{标号} LTORG 说明某个存储区域是用来暂存数据的数据缓冲区——文字池或数据缓冲池。大的代码段也可以使用多个数据缓冲池。当程序中使用LDR之类的指令访问数据缓冲池时,为防止越界产生,通常把数据缓冲池放在代码段的后面,或者放在无条件跳转指令或子程序返回指令之后,使得处理器不会错误的将数据缓冲池中的数据当做指令来执行。
AREAExample,CODE,READONLYStartBLFunc1…Func1LDRR1,=0x800
MOVPC,LR
LRORGDataSPACE40
ENDLTORG 语法格式:85MAP
语法格式:
MAP表达式{,基址寄存器} 用于定义一个结构化的内存表的首地址。 MAP:“^” 通常与FIELD伪指令配合使用来定义结构化的内存表。
MAP fun
;定义结构化内存表,fun就是内存表的首地址
MAP 0x80,R9
;定义结构化内存表首地址的值为0x80+R9MAP 语法格式:86FILED 语法格式:
{标号}FIELD表达式 定义一个结构化内存表中的数据域。FILED也可用“#”代替。
MAP 0
;定义结构化内存表首地址为0
consta FIELD 4
;consta的长度为4字节,相对位置为0x0
constb FIELD 4
;constb的长度为4字节,相对位置为0x4
x FIELD 8
;x的长度为8字节,相对位置为0x8
y FIELD 8
;y的长度为8字节,相对位置为0x10
string FIELD 256
;y的长度为256字节,相对位置为0x18
MOV R9,#4096
LDR R5,[R9,constb]
;将内存表中数据域constb读取到R5中FILED 语法格式:87汇编控制伪指令
汇编控制(AssemblyControl)伪指令用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:IF、ELSE、ENDIFWHILE、WEND汇编控制伪指令 汇编控制(AssemblyControl88IF、ELSE、ENDIF语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF示例: IFVersion=“1.0”
;指令
;伪指令
ELSE
;指令
;伪指令
ENDIFIF、ELSE、ENDIF语法格式:89WHILE、WEND
语法格式: WHILE 逻辑表达式 指令序列 WEND示例:
count SETA 1 WHILE count<=4
count SETA count+1
;code
WEND
WHILE、WEND语法格式:90其他常用的伪操作
AREACODE16、CODE32ENTRYENDEQUIMPORTGET(或INCLUDE)其他常用的伪操作AREA91AREA语法格式: AREA 段名属性1,属性2,……
定义一个代码段或数据段。 常用的属性如下:
CODE:用于定义代码段,默认为READONLY。
DATA:用于定义数据段,默认为READWRITE。
READONLY:指定本段为只读,代码段默认为READONLY。
READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。示例: AREA Example,CODE,READONLY ;codeAREA语法格式:92CODE16、CODE32语法格式: CODE16(或CODE32) CODE16:其后的指令序列为16位的Thumb指令。 CODE32:其后的指令序列为32位的ARM指令。
示例: AREA ChangeState,CODE,READONLY CODE32 ;指示下面的指令为ARM指令 LDR r0,=start+1 BX r0 ;切换到Thumb状态,并跳转到start处执行 CODE16 ;指示下面的指令为Thumb指令startMOVr1,#10
CODE16、CODE32语法格式:93ENTRY语法格式:
ENTRY ENTRY伪操作用于指定汇编程序的入口点。在一个源文件里最多只能有一个ENTRY(可以没有)。在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定)。示例:
AREAexample,CODE,READONLY ENTRY ;应用程序的入口点
ENTRY语法格式:94END
语法格式:
END END伪指令用于通知编译器已经到了源程序的结尾。示例: AREAexample,CODE,READONLY …… END
END语法格式:95EQU语法格式:
名称 EQU 表达式{,类型} EQU:“*”示例:
abcdEQU2;定义abcd符号的值为2
abcdEQUlabel1+16;定义abcd符号的值(label1+16)EQU语法格式:96IMPORT
语法格式:
IMPORT 标号{[WEAK]}
用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。示例:
AREAInit,CODE,READONLYIMPORT Main
;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义……ENDIMPORT语法格式:97GET(或INCLUDE)
语法格式: GET 文件名 用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。使用方法与C语言中的“include”相似。示例: AREAexample,CODE,READONLY GETfile1.s ;包含源文件file1.s GETC:\project\file2.s ;包含源文件file2.s GETC:\Programfiles\file3.s ;包含源文件file3.sGET(或INCLUDE)语法格式:985.3宏和宏指令
宏:在汇编程序中可以用伪指令MACRO、MEND为一个程序段定义一个名称,在往后的程序中就可以通过这个名称来使用它所代表的程序段。在源程序被汇编时,该名称将被替换为它所代表的程序段。
宏指令:在ARM中,还有一种汇编器内置的无参数和标号宏,我们把其称为宏指令。在汇编的时候,这些宏指令也是被替换成一条或两条真正的ARM或Thumb指令。
ADR、ADRL、LDR5.3宏和宏指令 宏:在汇编程序中可以用伪指令MACRO99MACRO、MEND
语法格式: MACRO
$标号宏名$参数1,$参数2,……;宏名为宏的名称,为宏在程序中引用名。;$参数1,$参数2,……为宏中可以使用的参数。
指令序列;宏定义体 MEND规定:$标号为主标号,宏内的所有其他的标号必须由主标号组成。宏中的所有标号必须在前面冠以符号$。宏中的参数在汇编时被相应的值替换。示例:在ARM中完成测试-跳转操作需要两条指令,定义一条宏指令完成测试-跳转操作 MACRO
$label TestAndBranch $dest,$reg,$cc
$label.A1 CMP $reg, #0 B$cc $dest MENDMACRO、MEND语法格式:100MACRO、MEND
;在程序中调用该宏
testTestAndBranchNonZero,r0,NE … …
NonZero;程序被汇编后,宏展开的结果
testCMPr0,#0 BNENonZero … …
NonZeroMACRO、MEND;在程序中调用该宏101MEXIT语法格式:
MEXIT MEXIT用于从宏定义中跳转出去。
MEXIT语法格式:102宏指令ADRADRLLDRNOP宏指令ADR103ADR-小范围的地址读取伪指令语法格式 ADR{cond}register,expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围:地址非字对齐,-255~255地址字对齐,-1020~1020
将基于PC或寄存器的地址值读取到寄存器中。 ADR伪指令被替换成一条合适的指令(ADD指令或SUB指令)。如果不能用一条来实现ADR伪指令的功能,编译器将报告错误。ADR-小范围的地址读取伪指令语法格式104ADR-小范围的地址读取伪指令示例:
start MOVr0,#10;PC值为当前指令地址值加8字节 ADRr4,start
;本ADR伪指令将被编译器替换成 ;SUBr4,pc,#0xcADR-小范围的地址读取伪指令示例:105ADRL-中等范围的地址读取伪指令语法格式 ADRL{cond}register,expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围:地址非字对齐,-64KB~64KB地址字对齐,-256KB~256KB
将基于PC或寄存器的地址值读取到寄存器中。 ADRL伪指令被替换成两条合适的指令。如果不能用两条来实现ADRL伪指令的功能,编译器将报告错误。ADRL-中等范围的地址读取伪指令语法格式106ADRL-中等范围的地址读取伪指令示例:
start MOVr0,#10;PC值为当前指令地址值加8字节 ADRLr4,start+60000
;本ADRL伪指令将被编译器替换成下面两条指令 ;ADDr4,pc,#0xe800 ;ADDr4,r4,#0x254 ;60000=0xEA60ADRL-中等范围的地址读取伪指令示例:107LDR-大范围的地址读取伪指令语法格式 LDR{cond}register,=[expr|label-expr] cond:可选的指令执行条件 register:目标寄存器 expr:32位常数当expr没有超过MOV或MVN指令中的地址取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令反之,编译器将该常数放在数据缓冲池中,同时用一条基于PC的LDR指令读取该常数。LDR伪指令处的PC值到数据缓冲池中目标数据所在地址的偏移量要小于4KB。
将32位常数或者地址值读取到寄存器中。LDR-大范围的地址读取伪指令语法格式108LDR-大范围的地址读取伪指令示例1:将0xff0读取到R1中
LDR R1,=0xFF0
;汇编后将得到MOVR1,#0xFF0示例2:将0xfff读取到R1中
LDR R1,=0xFFF ;LDRR1,[PC,OFFSET_TO_LPOOL] ;… ;LPOOLDCD0xFFF示例3:将外部地址ADDR1读取到R1中
LDR R1,=ADDR1 ;LDRR1,[PC,OFFSET_TO_LPOOL] ;… ;LPOOLDCDADDR1
LDR-大范围的地址读取伪指令示例1:将0xff0读取到R1109NOP-空操作伪指令语法格式 NOPNOP-空操作伪指令语法格式1105.4汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为:
{标号} {指令或伪指令} {;注释}
标号:从一行的行头开始,不能包含空格
指令或伪指令:指令的前面必须有空格或符号
注释:以“;”开头 每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。 语句之间可以插入空行。 如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。5.4汇编语言的语句格式 ARM(Thumb)汇编语言的111ARM汇编语言中的符号
命名规则:
符号由大小写字母、数字以及下划线组成符号是区分大小写的符号中的所有字符都是有意义的符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号程序中的符号不能与系统内部变量或者系统预定义的符号同名程序中的符号通常不要与指令助记符或者伪操作同名。当同名时,用双竖线将符号括起来ARM汇编语言中的符号命名规则: 112数字常量
数字常量是32位的整数 无符号数:0~232-1 有符号数时:-231~231-1。
EQU:定义数字常量数字常量 数字常量是32位的整数113变量
变量有数字变量、逻辑变量和字符串变量数字变量的大小不应超出数字变量所能表示的范围逻辑变量只有两种取值情况:真{true}或假{false}字符串变量的长度不应超出字符串变量所能表示的范围GBLA、GBLL、GBLS:声明全局变量LCLA、LCLL、LCLS:声明局部变量SETA、SETL和SETS:赋值变量变量有数字变量、逻辑变量和字符串变量114标号
表示程序中的指令或着数据地址的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中西医结合内科学之循环系统疾病知到课后答案智慧树章节测试答案2025年春湖南中医药大学
- 广东省揭阳市普通高中2017-2018学年高一数学1月月考试题06
- 核心素养导向下的小学语文作业设计策略
- DB13-T2292-2015小型商务酒店服务质量规范
- MongoDB的存储与查询策略优化与应用
- 武育粳3号条纹叶枯病抗性和食味品质的定向改良研究
- DB11T-建筑垃圾再生回填材料应用技术规程编制说明
- 高中物理1.2质点和位移练习1含解析鲁科版必修第一册
- 活动板房拆除施工方案
- 2025版高中政治课时作业4民主决策:作出最佳选择含解析新人教版必修2
- (新湘科版)六年级下册科学知识点
- 文言文阅读训练:苏轼《刑赏忠厚之至论》(附答案解析与译文)
- 人际关系与沟通技巧-职场中的平行沟通与同事沟通
- 小学数学《年龄问题》ppt
- 教师系列高、中级职称申报人员民意测评表
- 文件定期审核记录
- 社会稳定风险评估报告-稳评报告
- 2024届高考英语作文:读后续写课件
- 小学班队工作原理与实践 全套课件
- 形式语言与自动机理论-蒋宗礼-第一章参考答案
- 注塑生产过程控制流程
评论
0/150
提交评论