中国矿业大学嵌入式课件9说课材料.ppt
《中国矿业大学嵌入式课件9说课材料.ppt》由会员分享,可在线阅读,更多相关《中国矿业大学嵌入式课件9说课材料.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中国矿业大学嵌入式课件中国矿业大学嵌入式课件9 9ARMARM汇编伪操作及程序结构汇编伪操作及程序结构汇编语言程序的结构CODE 32AREA codesec,CODE,READONLYmain PROCSTMFD SP!,LRADR R0,strhelloBL _printfBL welcomefunLDMFD SP!,LRstrhello;32位位ARM指令段指令段代码段属性只读;函数函数main;相关寄存器入栈相关寄存器入栈;strhello地址地址;调用库函数调用库函数;调用子函数调用子函数welcomefun;相关寄存器出栈相关寄存器出栈DCB“Hello world!n0”;定义定
2、义14字节的字节空间字节的字节空间ENDP;main PROC结束结束welcomefunSTMFD SP!,LR;子函数子函数welcomefun;相关寄存器入栈相关寄存器入栈ADR R0,adrstrarm;adrstrarm的地址的地址LDR R0,R0,#0;strarm的值存入的值存入r0BL _printf;调用库函数调用库函数LDMFD SP!,LR;相关寄存器出栈相关寄存器出栈adrstrarmDCD strarm;保存保存strarm的地址的地址AREA constdatasec,DATA,READONLY,ALIGN=0strarmDCB“Welcome to ARM wo
3、rld!n0”;存放字符串存放字符串EXPORT main;全局声明全局声明main,供外部调用,供外部调用.END;程序结束程序结束数据段指定数据段单字节对齐伪代码vARM汇编程序中每一行的通用格式为:v标号 指令|伪操作|伪指令 操作数;注解。v在ARM汇编语言源程序中,除了标号和注释外,指令、伪指令和指示符都必须有前导空格,而不能顶格书写。v如果每一行的代码太长,可以使用字符“”将其分行书写,并允许有空行。v指令、伪操作和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。v注释从“;”开始,到该行结束为止。v标号代表一个地址,段内标号的地址值在汇编时确定,段外标号的地址值在链接时确
4、定。ARM汇编程序设计ARM汇编语句格式;R0=0 x1123456ARM汇编语句格式;标号start没有顶格写;标号后不允许带:;命令不允许顶格书写;指令中大小写不可混合;标号Loop不存在STARTMOVR0,#1ABCMOVR1,#2MOVR2,#3LOOPMOVR2,#3BLOOP伪操作、宏指令及伪指令的概念伪伪操操作作是是ARMARM汇汇编编语语言言程程序序里里的的一一些些特特殊殊指指令令助助记记符符,主主要要是是为为完完成成汇汇编编程程序序做做各各种种准准备备工工作作,在在源源程程序序进进行行汇汇编编时时由由汇汇编编程程序序处处理理,而而不不是是在在处理器运行期间由机器执行。处理器
5、运行期间由机器执行。宏宏指指令令是是一一段段独独立立的的程程序序代代码码,它它通通过过伪伪操操作作来来定定义义。通通过过宏宏名名来来调调用用宏宏,并并可可以以设设置置相相应应的的参参数数。宏宏定定义义本本身身不不会会产产生生代代码码,只只是是在在调调用用它它时时把宏体插入到源程序中把宏体插入到源程序中。伪伪指指令令也也是是ARMARM汇汇编编语语言言程程序序里里的的特特殊殊指指令令助助记记符符,也也不不在在处处理理器器运运行行期期间间由由机机器器执执行行,它它们们在在汇汇编编时时将将被被合合适适的的机机器器指指令令代代替替成成ARMARM或或ThumbThumb指令指令从而实现真正指令操作。从
6、而实现真正指令操作。伪操作符号定义(符号定义(Symbol Definition)伪操作伪操作 内存分配(数据定义)(内存分配(数据定义)(Data Definition)伪操伪操作作 汇编控制(汇编控制(Assembly Control)伪操作伪操作 其他其他(Miscellaneous)伪操作伪操作 1 1、符号定义伪操作、符号定义伪操作 伪操作伪操作语法格式语法格式作作用用GBLAGBLAVariable声明一个全局的算术声明一个全局的算术“伪变量伪变量”,并将其初始化成,并将其初始化成0。GBLLGBLLVariable声明一个全局的逻辑变量,并将其初始化成声明一个全局的逻辑变量,并将
7、其初始化成FALSE。GBLSGBLSVariable声明一个全局的字符串变量,并将其初始化成空串声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLAVariable声明一个局部的算术变量,并将其初始化成声明一个局部的算术变量,并将其初始化成0。LCLLLCLLVariable声明一个局部的逻辑变量,并将其初始化成声明一个局部的逻辑变量,并将其初始化成FALSE。LCLSLCLSVariable声明一个局部的串变量,并将其初始化成空串声明一个局部的串变量,并将其初始化成空串“”。SETASETAVariableexpr给一个全局或局部算术变量赋值。给一个全局或局部算术变量赋值。S
8、ETLSETLVariableexpr给一个全局或局部逻辑变量赋值。给一个全局或局部逻辑变量赋值。SETSSETSVariableexpr给一个全局或局部字符串变量赋值。给一个全局或局部字符串变量赋值。RLISTnameLISTlistofregisters为一个通用寄存器列表定义名称。为一个通用寄存器列表定义名称。CNnameCNexpr为一个协处理器的寄存器定义名称。为一个协处理器的寄存器定义名称。CPnameCPexpr为一个协处理器定义名称。为一个协处理器定义名称。DN/SNnameDN/SNexprDN/SN为一个双精度为一个双精度/单精度的单精度的VFP寄存器定义名称。寄存器定义名
9、称。FNnameFNexpr为一个为一个FPA浮点寄存器定义名称。浮点寄存器定义名称。1 1、符号定义伪操作、符号定义伪操作 伪操作伪操作语法格式语法格式作作用用GBLAGBLAVariable声明一个全局的算术声明一个全局的算术“伪变量伪变量”,并将其初始化成并将其初始化成0。GBLLGBLLVariable声明一个全局的逻辑变量,并将其初始化成声明一个全局的逻辑变量,并将其初始化成FALSE。GBLSGBLSVariable声明一个全局的字符串变量,并将其初始化成空串声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLAVariable声明一个局部的算术变量,并将其初始化成声明
10、一个局部的算术变量,并将其初始化成0。LCLLLCLLVariable声明一个局部的逻辑变量,并将其初始化成声明一个局部的逻辑变量,并将其初始化成FALSE。LCLSLCLSVariable声明一个局部的串变量,并将其初始化成空串声明一个局部的串变量,并将其初始化成空串“”。SETASETAVariableexpr给一个全局或局部算术变量赋值。给一个全局或局部算术变量赋值。SETLSETLVariableexpr给一个全局或局部逻辑变量赋值。给一个全局或局部逻辑变量赋值。SETSSETSVariableexpr给一个全局或局部字符串变量赋值。给一个全局或局部字符串变量赋值。RLISTnameL
11、ISTlistofregisters为一个通用寄存器列表定义名称。为一个通用寄存器列表定义名称。CNnameCNexpr为一个协处理器的寄存器定义名称。为一个协处理器的寄存器定义名称。CPnameCPexpr为一个协处理器定义名称。为一个协处理器定义名称。DN/SNnameDN/SNexprDN/SN为一个双精度为一个双精度/单精度的单精度的VFP寄存器定义名称。寄存器定义名称。FNnameFNexpr为一个为一个FPA浮点寄存器定义名称。浮点寄存器定义名称。符号定义伪操作举例符号定义伪操作举例GBLAarithmetic;定义变量定义变量arithmitic SETA0 xEF;赋值赋值;a
12、rithmitic EQU0 xEFGBLLlogicallogicalSETLTRUE;GBLSstringstringSETS“haha”;”l成对出现:定义成对出现:定义+赋值赋值符号定义伪操作举例符号定义伪操作举例LCLAarithmeticarithmiticSETA0 xEFLCLLlogicallogicalSETLTRUELCLSstringstringSETS“haha”v程序中的变量代换程序中的变量代换 v程序中的变量可通过代换操作取得一个常量。程序中的变量可通过代换操作取得一个常量。代换操作代换操作符为符为“$”“$”。v如果在数字变量前面有一个代换操作符如果在数字变量前
13、面有一个代换操作符“$”“$”,编译器会,编译器会将该数字变量的值转换为十六进制的字符串,并将该十将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换六进制的字符串代换“$”“$”后的数字变量。后的数字变量。v如果在逻辑变量前面有一个代换操作符如果在逻辑变量前面有一个代换操作符“$”“$”,编译器会,编译器会将该逻辑变量代换为它的取值(真或假)。将该逻辑变量代换为它的取值(真或假)。v如果在字符串变量前面有一个代换操作符如果在字符串变量前面有一个代换操作符“$”“$”,编译器,编译器会将该字符串变量的值代换会将该字符串变量的值代换“$”“$”后的字符串变量。后的字符串变量。vLC
14、LS S1;定义局部字符串变量;定义局部字符串变量S1和和S2 vLCLS S2 vS1 SETS“Test!”vS2 SETS“This is a$S1”;字符串变量;字符串变量S2的值为的值为“This is a Test!”伪操作符号定义(符号定义(Symbol Definition)伪操作伪操作 内存分配(数据定义)(内存分配(数据定义)(Data Definition)伪操伪操作作 汇编控制(汇编控制(Assembly Control)伪操作伪操作 其他其他(Miscellaneous)伪操作伪操作 2 2 2 2、数据定义伪操作、数据定义伪操作、数据定义伪操作、数据定义伪操作-列表
15、列表列表列表 伪操作伪操作语法格式语法格式作作用用LTORGLTORG声明一个数据缓冲池(也称为文字池)声明一个数据缓冲池(也称为文字池)的开始的开始。MAPMAPexpr,base-register定义一个结构化的内存表定义一个结构化的内存表的首地址的首地址=expr+BRFIELDlabelFIELDexpr定义一个结构化内存表中定义一个结构化内存表中的数据域长度的数据域长度expr(B)。SPACElabelSPACEexpr分配一块连续内存单元分配一块连续内存单元expr(B),并用,并用0初始化。初始化。DCBlabelDCBexpr,expr分配一段字节内存单元,并用分配一段字节内
16、存单元,并用expr初始化。初始化。DCD/DCDUlabelDCDexpr,expr分配一段字内存单元。分配一段字内存单元。DCDOlabelDCDOexpr,expr分配一段字对齐的字内存单元。分配一段字对齐的字内存单元。DCFD/DCFDUlabelDCFDUfpliteral,fpliteral为双精度的浮点数分配字对齐的内存单元。为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSUlabelDCFSUfpliteral,fpliteral为单精度的浮点数分配字对齐的内存单元。为单精度的浮点数分配字对齐的内存单元。DCIlabelDCIexpr,expr在在ARM代代码码中中分分
17、配配一一段段字字对对齐齐的的内内存存单单元元;在在Thumb代码中,分配一段半字对齐的半字内存单元。代码中,分配一段半字对齐的半字内存单元。DCQ/DCQUlabelDCQUliteral,literal分配一段以双字(分配一段以双字(8个字节)为单位的内存个字节)为单位的内存DCW/DCWUlabelDCWUexpr,exprDCW用于分配一段半字对齐的半字内存单元。用于分配一段半字对齐的半字内存单元。2 2 2 2、数据定义伪操作、数据定义伪操作、数据定义伪操作、数据定义伪操作-列表列表列表列表 伪操作伪操作语法格式语法格式作作用用LTORGLTORG声明一个数据缓冲池(也称为文字池)声明
18、一个数据缓冲池(也称为文字池)的开始的开始。MAPMAPexpr,base-register定义一个结构化的内存表定义一个结构化的内存表的首地址的首地址=expr+BRFIELDlabelFIELDexpr定义一个结构化内存表中定义一个结构化内存表中的数据域长度的数据域长度expr(B)。SPACElabelSPACEexpr分配一块连续内存单元分配一块连续内存单元expr(B),并用,并用0初始化。初始化。DCBlabelDCBexpr,expr分配一段字节内存单元,并用分配一段字节内存单元,并用expr初始化。初始化。DCD/DCDUlabelDCDexpr,expr分配一段字内存单元。分
19、配一段字内存单元。DCDOlabelDCDOexpr,expr分配一段字对齐的字内存单元。分配一段字对齐的字内存单元。DCFD/DCFDUlabelDCFDUfpliteral,fpliteral为双精度的浮点数分配字对齐的内存单元。为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSUlabelDCFSUfpliteral,fpliteral为单精度的浮点数分配字对齐的内存单元。为单精度的浮点数分配字对齐的内存单元。DCIlabelDCIexpr,expr在在ARM代代码码中中分分配配一一段段字字对对齐齐的的内内存存单单元元;在在Thumb代码中,分配一段半字对齐的半字内存单元。代码中,
20、分配一段半字对齐的半字内存单元。DCQ/DCQUlabelDCQUliteral,literal分配一段以双字(分配一段以双字(8个字节)为单位的内存个字节)为单位的内存DCW/DCWUlabelDCWUexpr,exprDCW用于分配一段半字对齐的半字内存单元。用于分配一段半字对齐的半字内存单元。数据定义伪操作数据定义伪操作-数据缓冲池数据缓冲池AREA Example,CODE,READONLYStartBL func1func1 LDR R1,=0X8888MOV PC,LRLTORG;数据缓冲池数据缓冲池n LTORGLTORG语法格式语法格式LTORGLTORG;声明一个数据缓冲池(
21、也称为文字池)的开始。声明一个数据缓冲池(也称为文字池)的开始。LTORG LTORG伪操作通常放在无条件跳转指令之后,伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错或者子程序返回指令之后,这样处理器就不会错误地将数据缓冲池中的数据当作指令来执行。误地将数据缓冲池中的数据当作指令来执行。2 2 2 2、数据定义伪操作、数据定义伪操作、数据定义伪操作、数据定义伪操作-列表列表列表列表 伪操作伪操作语法格式语法格式作作用用LTORGLTORG声明一个数据缓冲池(也称为文字池)声明一个数据缓冲池(也称为文字池)的开始的开始。MAPMAPexpr,base-registe
22、r定义一个结构化的内存表定义一个结构化的内存表的首地址的首地址=expr+BRFIELDlabelFIELDexpr定义一个结构化内存表中定义一个结构化内存表中的数据域长度的数据域长度expr(B)。SPACElabelSPACEexpr分配一块连续内存单元分配一块连续内存单元expr(B),并用,并用0初始化。初始化。DCBlabelDCBexpr,expr分配一段字节内存单元,并用分配一段字节内存单元,并用expr初始化。初始化。DCD/DCDUlabelDCDexpr,expr分配一段字内存单元。分配一段字内存单元。DCDOlabelDCDOexpr,expr分配一段字对齐的字内存单元。
23、分配一段字对齐的字内存单元。DCFD/DCFDUlabelDCFDUfpliteral,fpliteral为双精度的浮点数分配字对齐的内存单元。为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSUlabelDCFSUfpliteral,fpliteral为单精度的浮点数分配字对齐的内存单元。为单精度的浮点数分配字对齐的内存单元。DCIlabelDCIexpr,expr在在ARM代代码码中中分分配配一一段段字字对对齐齐的的内内存存单单元元;在在Thumb代码中,分配一段半字对齐的半字内存单元。代码中,分配一段半字对齐的半字内存单元。DCQ/DCQUlabelDCQUliteral,lite
24、ral分配一段以双字(分配一段以双字(8个字节)为单位的内存个字节)为单位的内存DCW/DCWUlabelDCWUexpr,exprDCW用于分配一段半字对齐的半字内存单元。用于分配一段半字对齐的半字内存单元。2 2、数据定义伪操作、数据定义伪操作-数据内存表数据内存表MAP 8192constaFIELD4MAP 0,R9xFIELD8yFIELD8MAP DatastringFIELD16n MAPMAP、FIELDFIELD 语法格式语法格式 MAP MAP exprexpr,base-register,base-register;定义一个结构化的内存表的首地址定义一个结构化的内存表的首
25、地址=exprexpr+base-register+base-registerlabel FIELD label FIELD exprexpr;定义一个结构化内存表的数据域长度为定义一个结构化内存表的数据域长度为expr 字节。字节。2 2、数据定义伪操作、数据定义伪操作-数据内存表数据内存表MAP 8192consta FIELD 4constb FIELD 4x FIELD 8y FIELD 8string FIELD 16使用:LDR R0,consta;LDR R0,8192n MAPMAP、FIELDFIELD基于绝对地址的内存表举例基于绝对地址的内存表举例只能访问LDR指令前后4K
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 矿业大学 嵌入式 课件 材料
限制150内