




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM嵌入式系统
第5章 ARM汇编程序设计
5.1汇编语言源程序助记符伪指令宏指令汇编指令和机器指令是“一一对应”的汇编语言程序需由汇编程序将其汇编为机器语言程序,才能被计算机执行。汇编语言大体上包括了汇编指令、系统调用和中断、伪指令和宏指令,汇编语言是强烈依赖硬件和汇编环境的。
学习和使用汇编语言程序设计的原因指令语句(instructions)
完成一定操作功能,能够翻译成机器代码的语句。伪指令语句(directives,指示性语句)
为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。宏指令语句(marcos) 可看成是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能。ARM程序设计基础
伪指令宏与宏指令ARM汇编语言规范(语句、表达式和运算符)ARM汇编语言的程序格式5.2伪指令段定义标号符号定义伪指令数据定义伪指令汇编控制伪指令其他伪操作汇编语言程序示例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符号定义伪指令定义全局变量: GBLA、GBLL和GBLS定义局部变量: LCLA、LCLL和LCLS变量赋值: SETA、SETL、SETS通用寄存器列表定义名称:RLIST
GBLA、GBLL和GBLSGBLA、GBLL和GBLS 语法格式:
GBLA(GBLL或GBLS) 全局变量名
GBLAobjectsize;全局的数字变量objectsize,为0ObjectsizeSETA0xff
;将该变量赋值为0xff
SPACEobjectsize;引用该变量
GBLLstatusB
;全局的逻辑变量statusB,为{False}statusBSETL{TRUE} ;将该变量赋值为真
全局:作用范围为包含该变量的源程序LCLA、LCLL和LCLSLCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS) 局部变量名 MACRO ;声明一个宏$labelmessage$a;宏的原型LCLSerr;声明一个局部变量err,为空串errSETS“errorno:”;向该变量赋值$label
;代码INFO0,err:CC::STR:$a;使用该串变量MEND ;宏定义结束
局部:作用范围为包含该局部变量的宏代码的一个实例SETA、、SETL、SETSSETA、、SETL和SETS语法格式::变量名SETA((SETL或SETS)表表达式在向变量赋赋值前,必必须先声明明该变量RLISTRLIST语法格式::名称 RLIST{寄存存器列表}ContextRLIST{r0-r6,r8,,r10-r12,r15};将寄存器器列表名称称定义为Context,,可在ARM指令LDM/STM中通通过该名称称访问寄存存器列表。。排列顺序序无关数据定义伪伪指令DCBDCW(DCWU))DCD(DCDU))DCFD((DCFDU)DCFS((DCFSU)SPACEMAPFIELDDCB语法格式::{标号}DCB表表达式表达式取值值范围:-128~~127;0~255的数字或字字符串。DCB:““=”NullstringDCB““Nullstring””,0;构造一个个以0结尾尾的字符串串DCW(或或DCWU)语法格式::{标号}DCW((或DCWU)表表达式DCW:半半字对齐DCWU::不严格半半字对齐。。表达式取值值范围:-32768~32767;0~65535data1DCW--128,,num1+8;num1必须是已已经定义过过的DCD(或或DCDU)语法格式::{标号}DCD((或DCDU)表表达式DCD:““&”DCD:字字对齐DCDU::不严格字字对齐。data1DCD1,5,20;其值为1,5,20data2DCDmemaddr+4;分配一个个字单元,,其值为程程序中标号号memaddr加加4个字节节DCFD((或DCFDU)语法格式::{标号}DCFD(或DCFDU)) 表达式式每个双精度度的浮点数数占据两个个字单元。。DCFD::字对齐DCFDU:不严格格字对齐DCFD1E308,-4E-100DCFDU 100000,-.1,3.1E26DCFS((或DCFSU)语法格式::{标号}DCFS(或DCFSU)表达达式每个单精度度的浮点数数占据一个个字单元。。DCFS::字对齐DCFSU::不严格字对对齐DCFS1E3,-4E-9DCFSU1.0,-.1,3.1E6SPACE语法格式:{标号}SPACE表表达式分配一片连续续的存储区域域并初始化为为0。其中,,表达式为要要分配的字节节数。SPACE::“%”DatastrucSPACE280;分配连续280字节的的存储单元并并初始化为0LTORG语法格式:{标号}LTORG说明某个存储储区域是用来来暂存数据的的数据缓冲区区——文字池池或数据缓冲冲池。大的代代码段也可以以使用多个数数据缓冲池。。当程序中使用用LDR之类类的指令访问问数据缓冲池池时,为防止止越界产生,,通常把数据据缓冲池放在在代码段的后后面,或者放放在无条件跳跳转指令或子子程序返回指指令之后,使使得处理器不不会错误的将将数据缓冲池池中的数据当当做指令来执执行。AREAExample,CODE,READONLYStartBLFunc1…Func1LDRR1,=0x800MOVPC,LRLRORGDataSPACE40ENDMAP语法格式:MAP表表达式{,基址寄存存器}用于定义一个个结构化的内内存表的首地地址。MAP:“^”通常与FIELD伪指令令配合使用来来定义结构化化的内存表。。MAP fun;定义结构化化内存表,fun就是内内存表的首地地址MAP 0x80,R9;定义结构化化内存表首地地址的值为0x80+R9FILED语法格式:{标号}FIELD表达式式定义一个结构构化内存表中中的数据域。。FILED也可用“#”代替。MAP 0;定义结构化化内存表首地地址为0constaFIELD4;consta的长度为为4字节,相相对位置为0x0constbFIELD4;constb的长度为为4字节,相相对位置为0x4xFIELD8;x的长度为为8字节,相相对位置为0x8yFIELD8;y的长度为为8字节,相相对位置为0x10stringFIELD256;y的长度为为256字节节,相对位置置为0x18MOV R9,#4096LDR R5,[R9,constb];将内存表中中数据域constb读读取到R5中中汇编控制伪指指令汇编控制(AssemblyControl)伪指令用用于控制汇编编程序的执行行流程,常用用的汇编控制制伪操作包括括以下几条::IF、ELSE、ENDIFWHILE、、WENDIF、ELSE、ENDIF语法格式:IF 逻辑表表达式指令序列1ELSE指令序列2ENDIF示例:IFVersion=“1.0””;指令;伪指令ELSE;指令;伪指令ENDIFWHILE、、WEND语法格式:WHILE逻逻辑表达式式指令序列WEND示例:countSETA1WHILEcount<=4countSETAcount+1;codeWEND其他常常用的的伪操操作AREACODE16、、CODE32ENTRYENDEQUIMPORTGET(或或INCLUDE))AREA语法格格式::AREA段段名名属属性性1,,属性性2,,………定义一一个代代码段段或数数据段段。常用的的属性性如下下:CODE:用于于定义义代码码段,,默认认为READONLY。。DATA:用于于定义义数据据段,,默认认为READWRITE。READONLY:指定定本段段为只只读,,代码码段默默认为为READONLY。READWRITE:指定定本段段为可可读可可写,,数据据段的的默认认属性性为READWRITE。示例::AREAExample,,CODE,READONLY;codeCODE16、、CODE32语法格格式::CODE16((或CODE32))CODE16:其后后的指指令序序列为为16位的的Thumb指指令。。CODE32:其后后的指指令序序列为为32位的的ARM指指令。。示例::AREAChangeState,,CODE,READONLYCODE32;指示示下面面的指指令为为ARM指指令LDRr0,=start+1BXr0;切换换到Thumb状态态,并并跳转转到start处执执行CODE16;指示示下面面的指指令为为Thumb指指令startMOVr1,#10ENTRY语法格格式::ENTRYENTRY伪操操作用用于指指定汇汇编程程序的的入口口点。。在一一个源源文件件里最最多只只能有有一个个ENTRY((可以以没有有)。。在一一个完完整的的汇编编程序序中至至少要要有一一个ENTRY(当有多多个ENTRY时,,程序序的真真正入入口点点由链链接器器指定定)。示例::AREAexample,CODE,,READONLYENTRY;应应用用程程序序的的入入口口点点END语法法格格式式::ENDEND伪伪指指令令用用于于通通知知编编译译器器已已经经到到了了源源程程序序的的结结尾尾。。示例例::AREAexample,,CODE,,READONLY………ENDEQU语法法格格式式::名称称EQU表表达达式式{,,类类型型}EQU::““*”示例例::abcdEQU2;定定义义abcd符符号号的的值值为为2abcdEQUlabel1+16;定定义义abcd符符号号的的值值((label1+16)IMPORT语法法格格式式::IMPORT标标号号{[WEAK]}用于于通通知知编编译译器器要要使使用用的的标标号号在在其其他他的的源源文文件件中中定定义义,,但但要要在在当当前前源源文文件件中中引引用用。。示例例::AREAInit,,CODE,,READONLYIMPORTMain;通通知知编编译译器器当当前前文文件件要要引引用用标标号号Main,,但但Main在在其其他他源源文文件件中中定定义义………ENDGET((或或INCLUDE))语法法格格式式::GET文文件件名名用于于将将一一个个源源文文件件包包含含到到当当前前的的源源文文件件中中,,并并将将被被包包含含的的源源文文件件在在当当前前位位置置进进行行汇汇编编处处理理。。可可以以使使用用INCLUDE代代替替GET。。使使用用方方法法与与C语语言言中中的的““include””相相似似。。示例例::AREAexample,,CODE,,READONLYGETfile1.s;包包含含源源文文件件file1.sGETC::\project\file2.s;包包含含源源文文件件file2.sGETC:\Programfiles\file3.s;包包含含源源文文件件file3.s5.3宏宏和和宏宏指指令令宏:在在汇汇编编程程序序中中可可以以用用伪伪指指令令MACRO、、MEND为一一个个程程序序段段定定义义一一个个名名称称,,在在往往后后的的程程序序中中就就可可以以通通过过这这个个名名称称来来使使用用它它所所代代表表的的程程序序段段。。在在源源程程序序被被汇汇编编时时,,该该名名称称将将被被替替换换为为它它所所代代表表的的程程序序段段。。宏指指令令:在在ARM中中,,还还有有一一种种汇汇编编器器内内置置的的无参参数数和和标标号号宏,,我我们们把把其其称称为为宏宏指指令令。。在在汇汇编编的的时时候候,,这这些些宏宏指指令令也也是是被被替替换换成成一一条条或或两两条条真真正正的的ARM或或Thumb指指令令。。ADR、、ADRL、、LDRMACRO、、MEND语法法格格式式::MACRO$标标号号宏名名$参参数数1,,$参参数数2,,…………;;宏名名为为宏宏的的名名称称,,为为宏宏在在程程序序中中引引用用名名。。;$参参数数1,,$参参数数2,,…………为为宏宏中中可可以以使使用用的的参参数数。。指令令序序列列;;宏宏定定义义体体MEND规定定::$标标号号为为主主标标号号,,宏宏内内的的所所有有其其他他的的标标号号必必须须由由主主标标号号组组成成。。宏中中的的所所有有标标号号必必须须在在前前面面冠冠以以符符号号$。。宏中中的的参参数数在在汇汇编编时时被被相相应应的的值值替替换换。。示例例::在在ARM中中完完成成测测试试--跳跳转转操操作作需需要要两两条条指指令令,,定定义义一一条条宏宏指指令令完完成成测测试试--跳跳转转操操作作MACRO$labelTestAndBranch$dest,$reg,$cc$label.A1CMP$reg,#0B$cc$destMENDMACRO、、MEND;在在程程序序中中调调用用该该宏宏testTestAndBranchNonZero,r0,NE……NonZero;程程序序被被汇汇编编后后,,宏宏展展开开的的结结果果testCMPr0,#0BNENonZero……NonZeroMEXIT语法法格格式式::MEXITMEXIT用用于于从从宏宏定定义义中中跳跳转转出出去去。。宏指令ADRADRLLDRNOPADR--小范围围的地址址读取伪伪指令语法格式式ADR{cond}register,exprcond:可可选的指令执执行条件register:目标标寄存器expr:基基于PC或寄寄存器的地址址表达式,取取值范围:地址非字对齐齐,-255~255地址字对齐,-1020~1020将基于PC或或寄存器的地地址值读取到到寄存器中。。ADR伪指令令被替换成一一条合适的指指令(ADD指令或SUB指令))。如果不能能用一条来实实现ADR伪伪指令的功能能,编译器将将报告错误。。ADR-小范范围的地址读读取伪指令示例:startMOVr0,#10;PC值为当当前指令地址址值加8字节节ADRr4,start;本ADR伪伪指令将被编编译器替换成成;SUBr4,pc,#0xcADRL-中中等范围的地地址读取伪指指令语法格式ADRL{cond}register,exprcond:可可选的指令执执行条件register:目标标寄存器expr:基基于PC或寄寄存器的地址址表达式,取取值范围:地址非字对齐齐,-64KB~64KB地址字对齐,-256KB~256KB将基于PC或或寄存器的地地址值读取到到寄存器中。。ADRL伪指指令被替换成成两条合适的的指令。如果果不能用两条条来实现ADRL伪指令令的功能,编编译器将报告告错误。ADRL-中中等范围的地地址读取伪指指令示例:startMOVr0,#10;PC值为当当前指令地址址值加8字节节ADRLr4,start+60000;本ADRL伪指令将被被编译器替换换成下面两条条指令;ADDr4,pc,#0xe800;ADDr4,r4,#0x254;60000=0xEA60LDR-大范范围的地址读读取伪指令语法格式LDR{cond}register,==[expr|label-expr]cond:可可选的指令执执行条件register:目标标寄存器expr:32位常数当expr没没有超过MOV或MVN指令中的地地址取值范围围时,编译器器用合适的MOV或MVN指令代替替该LDR伪伪指令反之,编译器器将该常数放放在数据缓冲冲池中,同时时用一条基于于PC的LDR指令读取取该常数。LDR伪指令令处的PC值值到数据缓冲冲池中目标数数据所在地址址的偏移量要要小于4KB。将32位常数数或者地址值值读取到寄存存器中。LDR-大范范围的地址读读取伪指令示例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];…;LPOOLDCDADDR1NOP-空操操作伪指令语法格式NOP5.4汇编编语言的语句句格式ARM(Thumb)汇汇编语言的语语句格式为::{标号}{指令或伪指指令}{;注释}标号:从一行行的行头开始始,不能包含含空格指令或伪指令令:指令的前前面必须有空空格或符号注释:以“;;”开头每一条指令的的助记符可以以全部用大写写、或全部用用小写,但不允许在一条条指令中大、、小写混用。语句之间可以以插入空行。。如果一条语句句太长,可将将该长语句分分为若干行来来书写,在行行的末尾用““\”表示下下一行与本行行为同一条语语句。ARM汇编语语言中的符号号命名规则:符号由大小写写字母、数字字以及下划线线组成符号是区分大大小写的符号中的所有有字符都是有有意义的符号在其作用用范围内必须须唯一,即在在其作用范围围内不可有同同名的符号程序中的符号号不能与系统统内部变量或或者系统预定定义的符号同同名程序中的符号号通常不要与与指令助记符符或者伪操作作同名。当同同名时,用双双竖线将符号号括起来数字常量数字常量是32位的整数数无符号数:0~232-1有符号数时::-231~231-1。EQU:定义数字常常量变量变量有数字变变量、逻辑变变量和字符串串变量数字变量的大大小不应超出出数字变量所所能表示的范范围逻辑变量只有有两种取值情情况:真{true}或或假{false}字符串变量的的长度不应超超出字符串变变量所能表示示的范围GBLA、GBLL、GBLS:声明全局变量量LCLA、LCLL、LCLS:声明局部变量量SETA、SETL和SETS:赋值标号表示程序中的的指令或着数数据地址的符符号。目标地址标号号:基于PC的标号位于目标指令令前或者程序序中数据定义义伪操作前的的标号。汇编编时将被处理理成PC值加加上或减去一一个数字常量量。常用于表表示跳转指令令的目标地址址,或者代码码段中的少量量数据。数据或数据区区首地址标号号:基于寄存存器的标号写在数据或数数据区定义伪伪指令前面的的标号。这种种标号常在寄寄存器间接寻寻址方式中作作为地址寄存存器的首地址址,在偏移量量的配合下对对数据表中的的数据进行读读/写操作。。绝对地址::32位数字字量LDRR0,=0x3FF5000target1LDRR1,0xFFSTRR1,[R0]LDRR0,=0x3FF5008LDRR1,0x01STRR1,[R0]Btarget1ARM汇编编语言中的的表达式表达式由符符号、数值值、单目或或多目操作作符以及括括号组成。。在一个表表达式内各各种元素的的优先级::括号内的表表达式优先先级最高各种操作符符有一定的的优先级相邻的单目目操作符的的执行顺序序为由右到到左,单目目操作符优优先级高于于其他操作作符优先级相同同的双目操操作符执行行顺序为由由左到右数字逻辑字符串表达式常量变量运算符括号数字表达式式整数数字量量示例:aSETA34906AddrDCD0xA10EDCD2_11001010c3SETA8_74007DCQ0x123456789abcdef数字表达式式浮点数字量量单精度浮点点数表示范范围:3.4e+38~1.18e-38双精度浮点点数表示范范围:1.8e+308~2.23e-308示例:DCFD1E308,-4E100DCFS1.0DCFD3.725e15DCFS0x7FC00000DCFD&FFF0000000000000数字表达式式操作符NOT按位位取反:NOT:A+、-、××、/及及MOD算算术操作符符A+B,A-B,A×B,A/B,A:MOD:BROL、ROR、SHL及SHR移位位(循环移移位)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西玉林市博白县2024-2025学年八上物理期末综合测试模拟试题含解析
- 浙江省台州市台州市白云学校2024-2025学年九年级物理第一学期期末质量检测试题含解析
- 河南省南阳内乡县联考2026届中考数学五模试卷含解析
- 浙江杭州西湖区四校联考2026届中考数学最后冲刺模拟试卷含解析
- 供应链绿色金融科技-洞察及研究
- 压力激素影响机制-洞察及研究
- 贵州省兴仁县2026届中考语文模拟试题含解析
- 城市交通路径优化-洞察及研究
- 灾害应对认知行为干预-洞察及研究
- DB/T 100-2024区域性地震安全性评价
- 2025年施工员-土建方向-岗位技能(施工员)考试题库
- 2025年度跨境电商平台合作运营合同
- 物业相关法律知识培训
- 2025发展对象培训班考试试题及参考答案
- 呼吸内科专科建设
- 2025年中医执业助理医师考试备考试题及答案解析
- 炎症性肠病病人的护理
- 肿瘤护理安宁疗护
- 青少年心血管健康防护策略
- 仓管员笔试试题及答案
- 心境与焦虑症状问卷简式中文版在大学生群体中的信效度检验及应用价值探究
评论
0/150
提交评论