中国矿业大学嵌入式课件5复习过程.ppt
《中国矿业大学嵌入式课件5复习过程.ppt》由会员分享,可在线阅读,更多相关《中国矿业大学嵌入式课件5复习过程.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中国矿业大学嵌入式课件中国矿业大学嵌入式课件5 52.6.2 指令集介绍(序)lARM伪指令ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的一条或多条ARM指令所代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。ARM伪指令小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,
2、则产生错误,编译失败。ADRcond register,exprADR伪指令格式指令执行的条件码加载的目标寄存器地址表达式地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255255;当地址值是字对齐时,其取指范围为-10201020;ARM伪指令小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。.ADR R0,Delay .Delay MOV R0,
3、r14 .应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0 .0 x20 ADD R1,PC,#0 x3c .0 x64 MOV R0,R14 .ARM伪指令小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。.ADRL R1,Delay .Delay MOV R0,R14 .应用示例(源程序):编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入
4、R1地址程序代码ARM伪指令小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。.ADRL R1,Delay .Delay MOV R0,R14 .应用示例(源程序):.0 x20 ADD R1,PC,#0 x3c .0 x64 MOV R0,R14 .编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADR伪指令被汇编成一条指令ARM伪指令小范围的地址读取
5、ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。应用示例2(查表):ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为参数,进行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8ARM伪指令中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地
6、址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRL伪指令格式指令执行的条件码加载的目标寄存器地址表达式地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K64K;当地址值是字对齐时,其取指范围为-256K256K;ARM伪指令中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令
7、被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0ARM伪指令中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.ADRL R0,Delay .Delay MOV R0,R14 .应用示例(源程序):.0 x20 ADD R1,PC,#0
8、x400 x24 ADD R1,R1,#0 xFF00 .0 xFF68 MOV R0,R14 .编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码ARM伪指令中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.ADRL R0,Delay .Delay MOV R0,R14 .应用示例(源程序):.0 x20 ADD R1,PC,#0 x400 x24 ADD R1,
9、R1,#0 xFF00 .0 xFF68 MOV R0,R14 .编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADRL伪指令被汇编成两条指令ARM伪指令大范围的地址读取LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。LDRcond register,=expr|label_exprLDR伪指令格式指令执行的条件码加载的目标寄存器基于PC的地
10、址表达式或外部表达式注意:1.从指令位置到文字池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。ARM伪指令大范围的地址读取LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载常量):LDR R2,=0 xFF0 ;MOV R2,#0 xFF0LDR R0,=0 xFF000000 ;MOV R0,#0 xFF0
11、00000LDR R1,=0 xFFFFFFFE ;MVN R1,#0 x1ARM伪指令大范围的地址读取LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):.LDR R1,=InitStack .InitStack MOV R0,LR .使用伪指令将程序标号InitStack的地址存入R1ARM伪指令大范围的地址读取LDR伪指令用于加载32位
12、的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):编译后的反汇编代码:.LDR R1,=InitStack .InitStack MOV R0,LR .0 x60 LDR R1,0 xb4 .0 x64 MOV R0,LR .0 xb4 DCD 0 x64使用伪指令将程序标号InitStack的地址存入R1地址程序代码ARM伪指令大范围的地址读取LDR伪指令用于加载
13、32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):编译后的反汇编代码:.LDR R1,=InitStack .InitStack MOV R0,LR .0 x60 LDR R1,0 xb4 .0 x64 MOV R0,LR .0 xb4 DCD 0 x64使用伪指令将程序标号InitStack的地址存入R1LDR伪指令被汇编成一条LDR指令,并在文字池中定义了
14、一个常量,该常量为InitStack标号的地址ARM伪指令空操作伪指令NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延时操作。NOPNOP伪指令格式应用示例(延时子程序):MOV R1,#0 x1234Delay NOP;空操作 NOP NOP SUBS R1,R1,#1;循环次数减一 BNE Delay;如果循环没有结束,跳转Delay继续 MOV PC,LR;子程序返回ARM汇编程序设计l由于高级编程语言隐藏了CPU执行指令的许多细节,因此在只关心系统所具有功能的系统中,采用高级语言编写程序更为合适。但是,CPU执行指令的细节差异会反
15、应在系统的非功能特性上,例如系统程序的规模和运行速度。因此,掌握汇编语言程序设计对于嵌入式系统的设计者来说是非常必要的。lARM汇编程序中每一行的通用格式为:l标号 指令|指示符|伪指令;注解。l在ARM汇编语言源程序中,除了标号和注释外,指令、伪指令和指示符都必须有前导空格,而不能顶格书写。如果每一行的代码太长,可以使用字符“”将其分行书写,并允许有空行。指令助记符、指示符和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。注释从“;”开始,到该行结束为止。l标号代表一个地址,段内标号的地址值在汇编时确定,段外标号的地址值在链接时确定。ARM汇编程序设计 AREA Word,CODE,
16、READONLY ;name this block of codenum EQU 20 ;Set number of words to be copied ENTRY ;mark the first instruction to callstart LDR r0,=src ;r0=pointer to source block LDR r1,=dst ;r1=pointer to destination block MOV r2,#num ;r2=number of words to copywordcopy LDR r3,r0,#4 ;a word from the source STR r
17、3,r1,#4 ;store a word to the destination SUBS r2,r2,#1 ;decrement the counter BNE wordcopy ;.copy morestop MOV r0,#0 x18 ;angel_SWIreason_ReportException LDR r1,=0 x20026 ;ADP_Stopped_ApplicationExit SWI 0 x123456 ;ARM semihosting SWIAREA BlockData,DATA,READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 矿业大学 嵌入式 课件 复习 过程
限制150内