ARM体系结构与编程:第5章 ARM汇编语言程序设计

上传人:枫** 文档编号:569928243 上传时间:2024-07-31 格式:PPT 页数:65 大小:1.96MB
返回 下载 相关 举报
ARM体系结构与编程:第5章 ARM汇编语言程序设计_第1页
第1页 / 共65页
ARM体系结构与编程:第5章 ARM汇编语言程序设计_第2页
第2页 / 共65页
ARM体系结构与编程:第5章 ARM汇编语言程序设计_第3页
第3页 / 共65页
ARM体系结构与编程:第5章 ARM汇编语言程序设计_第4页
第4页 / 共65页
ARM体系结构与编程:第5章 ARM汇编语言程序设计_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《ARM体系结构与编程:第5章 ARM汇编语言程序设计》由会员分享,可在线阅读,更多相关《ARM体系结构与编程:第5章 ARM汇编语言程序设计(65页珍藏版)》请在金锄头文库上搜索。

1、第5章 ARM汇编语言程序设计目标学员:嵌入式初级开发者课程时长:3学时,135分钟 ARMARM微处理器指令系统微处理器指令系统本章目录本章目录1 1 1 13 3 3 32 2 2 24 4 4 4ARM汇编器所支持的伪操作汇编器所支持的伪操作 ARM汇编器所支持的伪指令汇编器所支持的伪指令 汇编语言文件格式汇编语言文件格式 ARM汇编语言与汇编语言与C混合编程混合编程 课程目标课程目标掌握ARM汇编器常见的伪操作;掌握ARM汇编语言文件格式;深入理解C和汇编相互调用的过程重点难点重点难点 ARM汇编器常见的伪操作汇编器常见的伪操作ARM汇编语言文件格式汇编语言文件格式汇编与汇编与C语言混

2、合编程语言混合编程课程目录课程目录1 1 1 13 3 3 32 2 2 24 4 4 4ARM汇编器所支持的伪操作汇编器所支持的伪操作 ARM汇编器所支持的伪指令汇编器所支持的伪指令 汇编语言文件格式汇编语言文件格式 ARM汇编语言与汇编语言与C混合编程混合编程 伪伪操操作作 : 在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码 .伪伪操操作作的的作作用用:伪操作在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,标识符的使命就完成。伪操作伪操作 符号定义伪操作符号定义伪操作 数据定义伪操作数据定义

3、伪操作 汇编控制伪操作汇编控制伪操作 信息报告伪操作信息报告伪操作 宏指令以及其他伪操作。宏指令以及其他伪操作。符号定义伪指令符号定义伪指令 用用于于定定义义ARMARM汇汇编编程程序序中中的的变变量量、对对变变量量赋赋值以及定义寄存器的别名等。值以及定义寄存器的别名等。用于定义全局变量的GBLA、GBLL、GBLS ;用于定义局部变量的LCLA、LCLL、LCLS; 用于对变量赋值的SETA、SETL、SETS ;为通用寄存器列表定义名称的RLIST。 符号定义伪指令符号定义伪指令 GBLAGBLA、GBLLGBLL、GBLSGBLS格式:格式:GBLA/GBLL/GBLS GBLA/GBL

4、L/GBLS 变量名量名说明明:GBLAGBLA、GBLLGBLL、GBLSGBLS伪操操作作定定义一一个个汇编程程序序中中的全局的全局变量,并初始化,其中:量,并初始化,其中:GBLAGBLA定定义一个全局数字一个全局数字变量,并初始化量,并初始化为0 0;GBLLGBLL定定义一个全局一个全局逻辑变量,并初始化量,并初始化为“F F”GBLSGBLS定定义一个全局字符串一个全局字符串变量,并初始化量,并初始化为空串空串这三三条条伪指指令令用用于于定定义全全局局变量量,因因此此在在整整个个程程序序范范围内内变量名必量名必须唯一。唯一。 GBLATest1 ;定义一个全局的数字变量,变量名为T

5、est1Test1 SETA 0xaa ;将该变量赋值为0xaaGBLLTest2 ;定义一个全局的逻辑变量,变量名为Test2Test2 SETLTRUE ;将该变量赋值为真符号定义伪指令符号定义伪指令 LCLALCLA、LCLLLCLL、LCLSLCLS格式:格式:LCLA/LCLL/LCLSLCLA/LCLL/LCLS局部变量名局部变量名说说明明:LCLALCLA、LCLLLCLL、LCLSLCLS伪伪指指令令用用于于定定义义一一个个汇汇编编程程序中的局部变量,并初始化,其中:序中的局部变量,并初始化,其中:LCLALCLA定义一个局部的数字变量,初始化为定义一个局部的数字变量,初始化为

6、0 0;LCLLLCLL定义一个局部的逻辑变量,初始化为定义一个局部的逻辑变量,初始化为F F;LCLSLCLS定义一个局部的字符串变量,初始化为空串;定义一个局部的字符串变量,初始化为空串;这这三三条条伪伪指指令令用用于于声声明明局局部部变变量量,在在其其局局部部作作用用范范围围内变量名必须唯一。内变量名必须唯一。 LCLSTest6 ;定义一个局部的字符串变量,变量名为Test6Test6SETS “Testing” ;将该变量赋值为“Testing”符号定义伪指令符号定义伪指令SETASETA、SETLSETL、SETSSETS格式:格式:变量名量名SETA/SETL/SETSSETA/

7、SETL/SETS表达式表达式说明:明:SETASETA:给一个数字一个数字变量量赋值;SETLSETL:给一个一个逻辑变量量赋值;SETSSETS:给一个字符串一个字符串变量量赋值;格格式式中中的的变量量名名必必须为已已经定定义过的的全全局局或或局局部部变量,表达式量,表达式为将要将要赋给变量的量的值。 LCLATest3;声明一个局部的数字变量,变量名为Test3Test3SETA0xaa;将该变量赋值为0xaaLCLLTest4;声明一个局部的逻辑变量,变量名为Test4Test4 SETLTRUE ;将该变量赋值为真LCLSTest6 ;定义一个局部的字符串变量,变量名为Test6Te

8、st6SETS “Testing” ;将该变量赋值为“Testing”符号定义伪指令符号定义伪指令RLISTRLIST格式:名称格式:名称 RLISTRLIST 寄存器列表寄存器列表 说说明明:RLISTRLIST可可用用于于对对一一个个通通用用寄寄存存器器列列表表定定义义名名称称,该该名名称称可可在在ARMARM指指令令LDM/STMLDM/STM中中使使用用。在在LDM/STMLDM/STM指指令令中中,列列表表中中的的寄寄存存器器为为根根据据寄寄存存器器的的编编号号由由低低到到高高访问次序,与列表中的寄存器排列次序无关。访问次序,与列表中的寄存器排列次序无关。 RegListRLIST

9、R0-R5,R8,R10; 将寄存器列表名称定义为 RegList,可在ARM指令LDM/STM中通过该名称访问寄存器 列表 数据定义伪指令数据定义伪指令 用于为数据分配存储单元,同时也可用于为数据分配存储单元,同时也可完成已分配存储单元的初始化。完成已分配存储单元的初始化。 DCBDCBDCW/DCWUDCW/DCWUDCD/DCDU DCD/DCDU SPACE SPACE FIELD FIELD MAPMAP数据定义伪指令数据定义伪指令DCB:DCB: 标号标号 DCB DCB 表达式表达式 说说明明:DCBDCB用用于于分分配配一一块块字字节节单单元元并并用用伪伪指指令令中中指指定定的

10、的表表达达式式进进行行初初始始化化。其其中中,表表达达式式可可以以为为使使用用双双引引号号的的字字符符串串或或0 0255255的的数数字字,DCB,DCB可可用用“= =”代替。代替。StrDCB “This is a test!” ;分配一片连续的字节存储单元并 初始化为指定字符串 C_stringDCB “C_string”,0 ;用于C中的字符串不同,ARM汇编中 的字符串不以null结尾,下面指令以 ARM汇编形成一个C语言风格的字符串。 数据定义伪指令数据定义伪指令DCW/DCWU:DCW/DCWU: 标号标号 DCW/DCWU DCW/DCWU 表达式表达式 说说明明:DCWDC

11、W分分配配一一段段半半字字存存储储单单元元并并用用表表达达式式值值初始化,它定义的存储空间是半字对齐的。初始化,它定义的存储空间是半字对齐的。DataTestDCW 1,2,3; ;分配一片连续的半字存储单元并初始化 DataDCW-255,2*number; DCWU number+4 ; 在指定内存单元初始值时可以使用已 定义的变量 数据定义伪指令数据定义伪指令DCD/DCDUDCD/DCDU: 标号号 DCD/DCDU DCD/DCDU 表达式表达式 说明:明:DCDDCD伪指令用于分配一指令用于分配一块字字存存储单元并用元并用伪指令中指定的表达式初始化,它定指令中指定的表达式初始化,它

12、定义的存的存储空空间是字是字对齐的。的。DCDDCD也可用也可用“& &”代替。代替。DataTestDCD4,5,6 ;AREAMydata,DATA,READWRITE DCB255;字节定义使内存单元不能字对齐 Data3DCDU 1,5,20;SPACE:SPACE: 标号标号 SPACESPACE表达式表达式 说明:说明:SPACESPACE用于分配一片连续的存储区域并用于分配一片连续的存储区域并初始化为初始化为0,0,表达式为要分配的字节数表达式为要分配的字节数,SPACE,SPACE也可也可用用“”代替。代替。 DataSpace SPACE 100 ; 分配连续100字节的存储

13、单元并初始化为0 AREAMydata,DATA,READWRITE data1SPACE 255; 在Mydata段的开始255个初始化为0的字节单元 数据定义伪指令数据定义伪指令MAP:MAP: MAP MAP 表达式表达式 ,基址寄存器,基址寄存器 说说明明:MAPMAP定定义义一一个个结结构构化化的的内内存存表表的的首首地地址址, “”可以用来代替可以用来代替MAPMAP。MAP 0x100,R0; 定义结构化内存表首地址的值为0x100R0。 MAP 0 ;不存在基地址寄存器,结构化内存表的首地址直接有表 达式定义 数据定义伪指令数据定义伪指令FILED:FILED: 标号标号 FI

14、ELDFIELD字节数字节数 说明:说明:FIELDFIELD用于定义一个结构化内存表中的数用于定义一个结构化内存表中的数据域,据域,“# #” 可用来代替可用来代替FILEDFILED。 MAP0x100 ;定义结构化内存表首地址的值为0x100。AFIELD16;定义A的长度为16字节,位置为0x100BFIELD32;定义B的长度为32字节,位置为0x110SFIELD256;定义S的长度为256字节,位置为0x130数据定义伪指令数据定义伪指令汇编控制伪指令汇编控制伪指令汇编控制伪操作用于指引汇编程序汇编控制伪操作用于指引汇编程序的执行流程:的执行流程:IFIF、ELSEELSE、EN

15、DIFENDIFWHILEWHILE、WENDWEND MACROMACRO、MENDMEND 汇编控制伪指令汇编控制伪指令IFIF、ELSEELSE、ENDIFENDIF IF IF逻辑表达式逻辑表达式 代码段代码段1 1 ELSE ELSE 代码段代码段2 2 ENDIF ENDIF 说说明明:IFIF、ELSEELSE、ENDIFENDIF伪伪操操作作能能根根据据逻逻辑辑表表达达式式的的成成立立与与否否决决定定是是否否在在编编译译时时加加入入某某个个指指令令序序列列。IFIF、ELSEELSE、ENDIFENDIF可可以以分分别别用用“ ”、“| |”、“ ”代代替替。IFIF、ELSE

16、ELSE、ENDIFENDIF伪伪指指令令可可以嵌套使用。以嵌套使用。IF CONFIG=16BNE_rt_udiv_1;LDRr0,=_rt_div0;BXr0;ELSEBEQ_rt_div();ENDIFWHILEWHILE、WEND:WEND: WHILE WHILE 逻辑表达式逻辑表达式 代码段代码段 WENDWEND 说说明明:WHILEWHILE和和WENDWEND伪伪指指令令能能根根据据逻逻辑辑表表达达式式的的成成立立与与否否决决定定是是否否循循环环执执行行这这个个代代码码段段。WHILEWHILE、WENDWEND伪指令可以嵌套使用。伪指令可以嵌套使用。CountSETA1;W

17、HILEcount5 ;CountSETAcount+1;.WEND 汇编控制伪指令汇编控制伪指令MACROMACRO、MENDMEND MACRO MACRO $ $标号标号 宏名宏名$参参数数1 1,$ $参参数数2 2, 指令序列指令序列 MENDMEND 说明:说明:MACRO MACRO 表明一个宏定义的开始,表明一个宏定义的开始,MENDMEND则表示一个宏的则表示一个宏的结束,结束,MACROMACRO、MENDMEND前呼后应可以将一段代码定义为一个整体,前呼后应可以将一段代码定义为一个整体,又称宏,然后就可以在程序中通过宏的名称及参数调用该段代又称宏,然后就可以在程序中通过宏

18、的名称及参数调用该段代码。码。 MACROMACRO和和MENDMEND之间的代码称为宏定义体,在宏定义体的第一之间的代码称为宏定义体,在宏定义体的第一行声明宏的原型,宏的原型包含宏名、所需的参数。在源程序行声明宏的原型,宏的原型包含宏名、所需的参数。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参数的值传递给宏定义中的参数。程序中的宏调用,并将实际参数的值传递给宏定义中的参数。注意宏操作可以嵌套使用,并可以在编译时用选项加以控制。注意宏操作可以嵌套使用,并可以在编译时用选项加以控制。 汇编控制伪指令

19、汇编控制伪指令综合示例综合示例;宏定义 MACRO;开始宏定义$label mymacro$p1,$p2;code$label.loop1 ;code;codeBGE $label.loop1$label.loop2 ;codeBL $p1BGT$label.loop2;codeADR$p2;codeMEND综合示例综合示例;程序汇编后,宏展开结果abcmymacrosubr1,de;使用宏;codeabcloop1;code;codeBGEabcloop1abcloop2;codeBL subr1BGTabcloop2;codeADRde;code信息报告(信息报告(Reporting)伪操

20、作)伪操作 信息报告伪操作用于汇编报告指示。信息报告伪操作用于汇编报告指示。该类伪操作如下。该类伪操作如下。 ASSERT用于断言错误伪操作用于断言错误伪操作 INFO用于汇编诊断信息显示伪操作用于汇编诊断信息显示伪操作信息报告(信息报告(Reporting)伪操作)伪操作 ASSERT:ASSERT: ASSERT ASSERT 逻辑表达式逻辑表达式 说明:说明:ASSERTASSERT用来表示程序的编译必须满足一用来表示程序的编译必须满足一定的条件,如果逻辑表达式不满足,则编译器会报定的条件,如果逻辑表达式不满足,则编译器会报错。错。ASSERTlabel1cont2;如果cont1con

21、t2INFO1,“cont1cont2”;则在第一遍扫描时报告“cont1cont2”ENDIF指令集选择伪操作指令集选择伪操作 指示汇编器将代码编译成指示汇编器将代码编译成32位的位的ARM代码还是代码还是16位的位的Thumb代码。这类伪操作包括以下几种。代码。这类伪操作包括以下几种。ARM或CODE32用于告诉汇编器后面的指令序列为32位的ARM指令。THUMB用于告诉汇编器后面的指令是32位的Thumb2指令还是16位的Thumb指令。CODE16用于告诉汇编器后面的指令序列为16位的Thumb指令。其他伪指令其他伪指令- - AREAAREAAREA:AREA: AREA AREA

22、段名段名 属性,属性, 说说明明:AREAAREA用用于于定定义义一一个个代代码码段段、数数据据段段或或者者特特定定属属性性的的段段。如如果果段段名名以以数数字字开开头头,那那么么该该段段名名需需用用“| |”字字符符括括起起来来,如如|7wolf|7wolf|,用用C C的的编编译译器器产产生生的的代代码码一一般般也也用用“| |”括括起起来来。属属性性部部分分表表示示该该代代码段码段/ /数据段的相关属性,多个属性可以用数据段的相关属性,多个属性可以用“,”分隔。分隔。 常见属性如下:常见属性如下:DATADATA:定义数据段。:定义数据段。CODECODE:定义代码段。:定义代码段。 R

23、EADONLYREADONLY:表示本段为只读。:表示本段为只读。 READWRITEREADWRITE:表示本段可读写。:表示本段可读写。ALIGN=ALIGN=表表达达式式:对对齐齐方方式式为为2 2表表达达式式次次方方,例例如如:表表达达式式=3=3,则则对对齐齐方式为方式为8 8字节对齐。表达式的取值范围为字节对齐。表达式的取值范围为0 03131。COMMONCOMMON属性:定义一个通用段,这个段不包含用户代码和数据。属性:定义一个通用段,这个段不包含用户代码和数据。编程时使用AREA伪操作将程序分成多个ELF格式的段。一般情况下,数据段和代码段是分离的。大的程序应该分成多个不同的

24、代码段和数据段。一个汇编程序至少包含一个段。AREAInit,CODE,READONLY ;伪操作定义了一个代码段,段名为Init, 属性为只读 其他伪指令其他伪指令- - AREAAREAENDEND 说明:明:“ENDEND”告告诉编译器已器已经到了源程序的到了源程序的结尾。尾。每一个汇编源文件必须以每一个汇编源文件必须以END结束。结束。如果汇编文件通过伪操作如果汇编文件通过伪操作GET指定了一个指定了一个“父文件父文件(parent file)”,当汇编器遇到,当汇编器遇到END伪操作时将返回到伪操作时将返回到“父文件父文件”继续汇编。继续汇编。 AREAInit,CODE,READO

25、NLYEND ;使用END伪操作指定应用程序的结尾。其他伪指令其他伪指令- ENDENTRYENTRY 说明明:ENTRYENTRY用用于于指指定定汇编程程序序的的入入口口。在在一一个个完完整整的的汇编程程序序中中至至少少要要有有一一个个ENTRYENTRY,程程序序中中也也可可以以有有多多个个,此此时,程程序序的的真真正正入入口口点点可可在在链接接时指指定定,但但在在一一个个源源文文件件里里最最多多只只能能有有一一个个ENTRYENTRY或或者者没没有有ENTRYENTRY。AREAInit,CODE,READONLYENTRY;指定应用程序的入口点其他伪指令其他伪指令- ENTRY 其他伪

26、指令其他伪指令EQUEQUEQUEQU: 名称名称 EQUEQU 表达式表达式 ,类型型 说明明:EQUEQU用用于于将将程程序序中中的的数数字字常常量量、标号号、基基于于寄寄存存器器的的值赋予予一一个个等等效效的的名名称称,这一一点点类似似于于C C语言中的言中的definedefine,可用,可用“* *”代替代替EQUEQU。 如如果果表表达达式式为3232位位的的常常量量,我我们可可以以指指定定表表达达式式的的 数数 据据 类 型型 , 类 型型 域域 可可 以以 有有 以以 下下 三三 种种 :CODE16/CODE32/DATACODE16/CODE32/DATATestEQU50

27、 ;定义标号Test的值为50AddrEQU0x55,CODE32 ;定义Addr的值为0x55,且该处为32位 的ARM指令。 其他伪指令其他伪指令-EXPORT-EXPORTEXPORT:EXPORT: EXPORT EXPORT 标号标号,WEAK,WEAK 说说明明:EXPORT EXPORT 在在程程序序中中声声明明一一个个全全局局标标号号,该该标标号号可可以以被被其其他他的的文文件件中中的的代代码码引引用用。用用户户也也可可以以用用GLOBALGLOBAL代代替替EXPORTEXPORT。,WEAK,WEAK可可选选项项声声明明其其他他文文件件有有同同名名的的标标号号,则该同名标号

28、优先于该标号被引用。则该同名标号优先于该标号被引用。AREAInit,CODE,READONLYEXPORTStest ;声明一个可全局引用的标号StestEND 其他伪指令其他伪指令-EXTERN-EXTERNEXTERN: EXTERN: EXTERN EXTERN 标号标号 ,WEAK,WEAK 说说明明:EXTERNEXTERN告告诉诉编编译译器器所所使使用用的的标标号号要要在在当当前前源源文文件件中中引引用用, ,但但该该标标号号是是在在其其他他的的源源文文件件中中定定义义的的。与与IMPORTIMPORT不不同同的的是是,如如果果当当前前源源文文件件实实际际上上没没有有引引用用该该

29、标标号,该标号就不会被加入到当前文件的符号表中。号,该标号就不会被加入到当前文件的符号表中。 ,WEAKWEAK选项意义同选项意义同IMPORTIMPORT。AREAInit,CODE,READONLYEXTERNMain;通知编译器当前文件要引用标号Main, 但Main在其他源文件中定义END 其他伪指令其他伪指令-GET/INCLUDE-GET/INCLUDEGET/INCLUDEGET/INCLUDE: GETGET 文件名文件名 说说明明:GETGET将将一一个个源源文文件件包包含含到到当当前前的的源源文文件件中中,并并将将被被包包含含的的源源文文件件在在当当前前位位置置展展开开进进

30、行行汇汇编编处处理理。INCLUDEINCLUDE和和GETGET作作用用等等效效的的。我我们们通通常常这这样样使使用用这这个个伪伪指指令令:在在某某源源文文件件中中定定义义一一些些宏宏指指令令,用用MAPMAP和和FIELDFIELD定定义义结结构构化化的的数数据据类类型型,用用EQUEQU定定义义常常量量的的符符号号名名称称,然然后后用用GET/INCLUDEGET/INCLUDE将将这这个个源源文文件件包包含含到到其其他他的的源源文文件件中中。GET/INCLUDEGET/INCLUDE只只能用于包含源文件,包含其他文件则需要使用能用于包含源文件,包含其他文件则需要使用INCBININC

31、BIN伪指令。伪指令。AREAInit,CODE,READONLYGETa1.s;通知编译器当前源文件包含源文件a1.sGETC:a2.s;通知编译器当前源文件包含源文件C: a2.sEND 其他伪指令其他伪指令-IMPORT-IMPORTIMPORT:IMPORT: IMPORT IMPORT 标号标号 ,WEAKWEAK 说说明明:IMPORTIMPORT告告诉诉编编译译器器这这个个标标号号要要在在当当前前源源文文件件中中使使用用,但但标标号号是是在在其其他他的的源源文文件件中中定定义义的的。不不管管当当前前源源文文件件是是否否使使用用过过该该标标号号,这这个个标标号号都都会会加加入入到到

32、当当前前源源文文件件的的符符号号表表中中。 ,WEAKWEAK选选项项表表示示如如果果所所有有的的源源文文件件都都没没有有找找到到这这个个标标号号的的定定义义,编编译译器器也也不不会会提提示示错错误误信信息息。编编译译器器在在多多数数情情况况下下将将该该标标号号置置为为0 0,如如果果这这个个标标号号被被B B或或BLBL指令引用,则将指令引用,则将B B或或BLBL指令替换为指令替换为NOPNOP操作操作。其他伪指令其他伪指令-INCBIN-INCBININCBIN:INCBIN: INCBIN INCBIN 文件名文件名 说说明明:INCBININCBIN将将一一个个数数据据文文件件或或者

33、者目目标标文文件件包包含含到到当当前前的的源源文文件件中中,编编译译时时被被包包含含的的文文件件不不作作任任何何变变动动的的存存放在当前文件中,编译器从后面开始继续处理。放在当前文件中,编译器从后面开始继续处理。AREAInit,CODE,READONLYINCBINa1.dat;通知编译器当前源文件包含文件a1.datINCBIN C:a2.txt ;通知编译器当前源文件包含文件C:a2.txtEND其他伪指令其他伪指令-RN-RNRN:RN: 名称名称RN RN 表达式表达式 说说明明:RNRN用用于于给给一一个个寄寄存存器器定定义义一一个个别别名名, ,以以便便程程序序员员记记忆忆该该寄

34、寄存存器器的的功功能能。其其中中,名名称称为为给给寄寄存存器器定义的别名,表达式为寄存器的编码。定义的别名,表达式为寄存器的编码。regname RN 11 ; 将寄存器11命名为regnamesqr4 RN r6 ; 将寄存器6定义为spr4本节学习了伪操作在源程序中为完成汇编程序作本节学习了伪操作在源程序中为完成汇编程序作各种准备工作各种准备工作,常见的伪操作:符号定义伪操作、常见的伪操作:符号定义伪操作、数据定义伪操作、汇编控制伪操作、宏指令以及数据定义伪操作、汇编控制伪操作、宏指令以及其他伪指令等进行了阐述,并举例说明了其用法。其他伪指令等进行了阐述,并举例说明了其用法。课程目录课程目

35、录1 1 1 13 3 3 32 2 2 24 4 4 4ARM汇编器所支持的伪操作汇编器所支持的伪操作 ARM汇编器所支持的伪指令汇编器所支持的伪指令 汇编语言文件格式汇编语言文件格式 ARM汇编语言与汇编语言与C混合编程混合编程 ARMARM伪指令伪指令 ARM伪指令不是伪指令不是ARM指令集中的指令,只是为了编程方指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其它便编译器定义了伪指令,使用时可以像其它ARM指令一样指令一样使用,但在编译时这些指令将被等效的使用,但在编译时这些指令将被等效的ARM指令代替。指令代替。ARM伪指令包含ADR、ADRL、MOV32、和LDR。

36、ADR伪指令装载程序相关(programrelative)或寄存器相关(registerrelative)地址(小范围地址)到寄存器。MOV32装载32位常数或地址到寄存器(ARMv6T2体系结构及以上版本支持)。LDR装载32位常数或地址到寄存器(所有ARM版本均支持) ADR伪指令伪指令 ADR为小范围地址读取伪指令。ADR伪指令将基于PC相对偏移的地址或基于寄存器相对偏移的地址值读取到寄存器中.ADR被汇编器编译成一条指令。汇编器通常使用ADD或SUB指令来实现伪操作的地址装载功能。 ldr r0, _start ;从内存地址 _start 的地方把值读入。 执行这个后,r0 = 0xe

37、1a00000adr r0, _start ;取得 _start 的地址到 r0,但是请看反编译的结果, 它是与位置无关的。其实取得的时相对的位置。 例如这段代码在 0x0c008000 运行,那么adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 运行,就是 0x00000014 了。即当前PC值加上_start的偏移量注意: ARM汇编中ldr与adr的区别,LDR伪指令伪指令 LDR LDR伪指令装载一个伪指令装载一个32-bit32-bit常数和一个地址到常数和一个地址到寄存器。寄存器。LDR r3,=0xff0 ;将常数0xff0读到r1中,相当于下面

38、的ARM指令MOV r3,#0xff0LDR r2,=place ;将place标号地址读入r1中,相当于下面的ARM指令 LDR r2,pc,offset_to_litpool . litpool DCD place 本节学习了本节学习了ARM伪指令包含伪指令包含ADR、ADRL、MOV32、和、和LDR的主要作用的主要作用(装载常数或地址到装载常数或地址到寄存器寄存器)课程目录课程目录1 1 1 13 3 3 32 2 2 24 4 4 4ARM汇编器所支持的伪操作汇编器所支持的伪操作 ARM汇编器所支持的伪指令汇编器所支持的伪指令 汇编语言文件格式汇编语言文件格式 ARM汇编语言与汇编语

39、言与C混合编程混合编程 ARM汇编语言语句格式汇编语言语句格式 ARM(Thumb)汇编语法语句格式如下所示)汇编语法语句格式如下所示 symbolinstruction|directive|pseudo-instruction;commentARM汇编语言中的符号汇编语言中的符号 在汇编语言程序设计中,经常使用各种符号代替地址在汇编语言程序设计中,经常使用各种符号代替地址(addressesaddresses)、变量()、变量(variablesvariables)和常量()和常量(constantsconstants)等,以增加程序的灵活性和可读性。尽管符号的命名由编程等,以增加程序的灵活

40、性和可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定者决定,但并不是任意的,必须遵循以下的约定 : :(1)符号区分大小写,同名的大、小写符号会被编译器认为是两个不同 的符号。(2)符号在其作用范围内必须唯一。(3)自定义的符号名不能与系统的保留字相同。其中保留字包括系统内 部变量(builtin variable)和系统预定义(predefined symbol) 的符号。(4)符号名不应与指令或伪指令同名。如果要使用和指令或伪指令同名 的符号要用双斜杠“|”将其括起来,如“|ASSERT|”。(5)局部标号以数字开头,其他的符号都不能以数字开头。汇编语言程序中的表达式

41、和运算符汇编语言程序中的表达式和运算符 字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。 字符串由包含在双引号内的一系列字符组成字符串由包含在双引号内的一系列字符组成abc SETS one double quotedef SETS one $ dollar symbol“ ; 分别将字符串abc和def赋值为“one double quote”和 “one $ dollar symbol” 整数表达式一般由数字常量、数字变量、数字运算符和括号构成整数表达式一般由数字常量、数字变量、数字运算符和括号构成 a SETA 25

42、6*256 ;将数字变量赋值为 256*256 MOV r1,#(a*22) ; 将数字表达式(a*22) 的值放入r1 汇编语言预定义寄存器汇编语言预定义寄存器 ARM汇编器对汇编器对ARM的寄存器和协处理器进行了预定义(包的寄存器和协处理器进行了预定义(包括括APCS对对r0r15寄存器的定义),所有的寄存器和协处理寄存器的定义),所有的寄存器和协处理器名都是大小写敏感的器名都是大小写敏感的 .r0r15和R0R15(15个通用寄存器)a1a4(参数、结果或临时寄存器,同r0r3)v1v8(变量寄存器,同r4r11)sb和SB(静态基址寄存器,同r9)sl和SL(栈顶指针寄存器,同r10)

43、fp和FP(帧指针寄存器,同r11)ip和IP(过程调用中间临时寄存器,同r12)sp和SP(栈指针寄存器,同r13)lr和LR(连接寄存器,同r14)pc和PC(程序计数器,同r15)汇编语言的程序结构汇编语言的程序结构 在在ARM(Thumb)汇编语言程序中,以程序段为单位组织代码。段是)汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段相对独立的指令或数据序列,具有特定的名称。段可以分为代码段(Code Section)和数据段()和数据段(Data Section),代码段的内容为执行代),代码段的内容为执行代码,数据段存放代码运行时

44、需要用到的数据。码,数据段存放代码运行时需要用到的数据。 可执行映象文件通常由以下几部分构成可执行映象文件通常由以下几部分构成:一个或多个代码段,代码段的属性为只读。零个或多个数据段,数据段的属性为可读写。数据段可是被初始化的数据段或没有别初始化的数据段(ZI,zero initialized)。综合示例综合示例AREAInit,CODE,READONLYENTRYStartLDRR0,=0x3FF5000LDRR1,0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,0x01STRR1,R0END 以下是一个汇编语言源程序的基本结构: 汇编语言子程序调用汇编语言子程序调用 在

45、在ARM汇编语言程序中,子程序的调用一般是通过汇编语言程序中,子程序的调用一般是通过BL指令来实现的。指令来实现的。在程序中,使用指令:在程序中,使用指令:BL+子程序名子程序名,即可完成子程序的调用。即可完成子程序的调用。该指令在执行时完成如下操作:该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器LR中,同时将程序计数器PC 指向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新拷贝给程序计数器PC即可。在调用子程序的同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器R0R3完成。综合示例综合示例AREAInit,CODE,

46、READONLYENTRYStartLDRR0,=0x3FF5000LDRR1,0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,0x01STRR1,R0BLPRINT_TEXTPRINT_TEXT MOVPC,BLEND以下是使用以下是使用BL指令调用子程序的汇编语言源程序指令调用子程序的汇编语言源程序的基本结构的基本结构 : 本环节主要学习本环节主要学习对对ARM汇编语言语句格式,汇编语言语句格式,ARM汇编语言中的符号汇编语言中的符号(变量变量,常量常量,程序标号程序标号,程序程序中的表达式和运算符中的表达式和运算符,寄存器的名称等寄存器的名称等),汇编语言汇编语言的程

47、序结构进行了定义和格式上的说明。的程序结构进行了定义和格式上的说明。课程目录课程目录1 1 1 13 3 3 32 2 2 24 4 4 4ARM汇编器所支持的伪操作汇编器所支持的伪操作 ARM汇编器所支持的伪指令汇编器所支持的伪指令 汇编语言文件格式汇编语言文件格式 ARM汇编语言与汇编语言与C混合编程混合编程 ARM汇编语言与汇编语言与C混合编程混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编 。 大部分的代码都是用C编写的 汇编的地方就是一些对性能非常敏感的代码块 在在C语言中内嵌汇编语言中内嵌汇编 内嵌汇编使用的标记是 _asm或者asm关键字 const char *s

48、rc=Hello world!;char a20;char *dst = a;int ch;_asmloop:LDRB ch,src,#1STRB ch,dst,#1CMP ch,#0BNE loop在在C C程序中调用汇编程序中调用汇编在汇编程序中用export name来定义在C程序中直接调用,用EXTERN声明正常链接extern void asm_strcpy(const char *src, char *dest); int main(void) const char *src = “welcome to zhuoyue ”; char dest10; char d32; asm_s

49、trcpy(s, d); return 0; AREA asmfile , CODE, READONLY EXPORT asm_strcpy asm_strcpy loop ldrb r4, r0, #1 cmp r4, #0 beq over strb r4, r1, #1 b loopover mov pc, lr ENDCALL在汇编中调用在汇编中调用C的函数的函数 在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理 EXPORT mainAREA main, CODE, READONLYIMPORT c

50、FunENTRYmov r0, #11mov r1, #22mov r2, #33BL cFunEND /*C file, called by asmfile */ int cFun(int a, int b, int c) return a + b + c;CALL本环节主要学习本环节主要学习ARM在嵌入式系统开发中主要编在嵌入式系统开发中主要编程语言是程语言是C和汇编之间混合编程的几种样式:在和汇编之间混合编程的几种样式:在C语言中内嵌汇编,在语言中内嵌汇编,在C中调用汇编的函数,在中调用汇编的函数,在汇编中调用汇编中调用C的函数的函数 本章小节本章小节本章系统的介绍了常见的伪操作如符号定

51、义伪操作、数据定义伪本章系统的介绍了常见的伪操作如符号定义伪操作、数据定义伪操作、汇编控制伪操作、宏指令以及其他伪指令等进行了阐述,操作、汇编控制伪操作、宏指令以及其他伪指令等进行了阐述,并举例说明了其用法。然后对常见的几个并举例说明了其用法。然后对常见的几个ARM伪指令进行了讲解。伪指令进行了讲解。对对ARM汇编语言语句格式,汇编语言语句格式,ARM汇编语言中的符号汇编语言中的符号(变量变量,常量常量,程程序标号序标号,程序中的表达式和运算符程序中的表达式和运算符,寄存器的名称等寄存器的名称等),汇编语言的程汇编语言的程序结构进行了定义和格式上的说明。序结构进行了定义和格式上的说明。嵌入式主

52、要编程语言是嵌入式主要编程语言是C和汇编之间混合编程的几种样式:在和汇编之间混合编程的几种样式:在C语语言中内嵌汇编,在言中内嵌汇编,在C中调用汇编的函数,在汇编中调用中调用汇编的函数,在汇编中调用C的函数的函数课后练习课后练习练习一:练习一:AREAAREA伪指令的作用伪指令的作用? ? 练习二:汇编程序的入口点是练习二:汇编程序的入口点是mainmain吗吗, ,为什么为什么? ?练习三:练习三:ARM汇编中汇编中ldr与与adr的区别的区别 ?练习四:列举练习四:列举ARM汇编语言与汇编语言与C语言混合编程常见的语言混合编程常见的 几种方式几种方式?练习五:试写一程序,在练习五:试写一程序,在C中调用汇编函数中调用汇编函数, 汇编函数汇编函数 实现字符串的拷贝?实现字符串的拷贝?

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号