ARM汇编伪指令与伪操作

上传人:夏** 文档编号:569330927 上传时间:2024-07-28 格式:PPT 页数:53 大小:999KB
返回 下载 相关 举报
ARM汇编伪指令与伪操作_第1页
第1页 / 共53页
ARM汇编伪指令与伪操作_第2页
第2页 / 共53页
ARM汇编伪指令与伪操作_第3页
第3页 / 共53页
ARM汇编伪指令与伪操作_第4页
第4页 / 共53页
ARM汇编伪指令与伪操作_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《ARM汇编伪指令与伪操作》由会员分享,可在线阅读,更多相关《ARM汇编伪指令与伪操作(53页珍藏版)》请在金锄头文库上搜索。

1、汇编指令伪指令汇编指令伪指令6.1ARMARM汇编汇编语言伪操作语言伪操作6.2ARMARM汇编伪汇编伪操作操作6.3GNU ARMGNU ARM伪操作伪操作6.46.1 6.1 汇编汇编语言语言伪指令伪指令 ARMARM汇编器支持汇编器支持ARMARM伪指令,伪指令可以伪指令,伪指令可以像其它像其它ARMARM指令一样使用,这些伪指令在汇编指令一样使用,这些伪指令在汇编阶段被翻译成阶段被翻译成ARMARM或者或者ThumbThumb指令(或指令序列)指令(或指令序列)。ARMARM伪指令包含伪指令包含LDRLDR、ADRLADRL、ADRADR、NOPNOP等。等。注意:注意:ARMARM伪

2、指令不属于伪指令不属于ARMARM指令集中的指令,指令集中的指令,是为了编程方便而定义的。是为了编程方便而定义的。 LDRLDR伪伪指指令令用用于于加加载载3232位位的的立立即即数数或或一一个个地地址址值到指定寄存器。值到指定寄存器。LDRcond register,=expr | label_expr常量或地址表达式常量或地址表达式注注意意:与与ARMARM指指令令的的LDRLDR相相比比,伪伪指指令令的的LDRLDR的的参参数数有有“= =”号。号。1. 1. 大范围地址读取伪指令大范围地址读取伪指令LDRLDR目标寄存器目标寄存器应用示例应用示例1 1(加载常量):(加载常量):LDR

3、 R2, =0xFF0 ;MOV R2, #0xFF0LDR R0, =0xFF000000 ;MOV R0, #0xFF000000应用示例应用示例2 2(加载地址):(加载地址): . LDR R1,=InitStack .InitStack MOV R0, LR .使用伪指令将程序标号使用伪指令将程序标号InitStackInitStack的地址存入的地址存入R1R12.2.中等范围地址读取伪指令中等范围地址读取伪指令ADRADRL L ADRLADRL伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于于寄寄存存器器相相对对偏偏移移的的地地址址值值读读取取到到寄寄

4、存存器器中中,比比ADRADR伪指令可以读取更大范围的地址伪指令可以读取更大范围的地址 。地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-64K-64K64K64K;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-256K-256K256K256K;ADRLcond register,expr目标寄存器目标寄存器地址表达式地址表达式3.3.小范围地址读取伪指令小范围地址读取伪指令ADRADR ADRADR伪伪指指令令将将基基于于PCPC相相对对偏偏移移的的地地址址值值或或基基于寄存器相对偏移的地

5、址值读取到寄存器中。于寄存器相对偏移的地址值读取到寄存器中。ADRcond register,expr目标寄存器目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-255-255255255;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-1020-102010201020; . ADR R0,Delay .Delay MOV R0,R14 .应用示例应用示例1 1:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0 ADR R0

6、,DISP_TAB; ; 加载转换表地址加载转换表地址 LDRB R1,R0,R2; ; 使用使用R2R2作为偏移量,进行查表作为偏移量,进行查表 DISP_TAB DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82应用示例应用示例2(2(查表程序查表程序) ):4.4.空操作伪指令空操作伪指令NOPNOP NOPNOP是是空空操操作作伪伪指指令令,在在汇汇编编时时将将会会被被替替代代成成ARMARM中的空操作中的空操作。NOP例例6-4用软件实现延时用软件实现延时5个时钟周期。个时钟周期。 .Delay5 NOP NOP NOP NOP NOP .6.2 ARM6

7、.2 ARM汇编汇编语言语言伪操作伪操作 伪操作伪操作是是ARMARM汇编语言程序里的一些特殊的汇编语言程序里的一些特殊的指令助记符指令助记符, ,其作用主要是为完成汇编程序做其作用主要是为完成汇编程序做各种准备工作各种准备工作, ,对源程序运行汇编程序处理对源程序运行汇编程序处理, ,而而不是在计算机运行期间由处理器执行。不是在计算机运行期间由处理器执行。伪操作只是汇编过程中起作用伪操作只是汇编过程中起作用, ,一旦汇编结束一旦汇编结束, ,伪操作也就随之消失。伪操作也就随之消失。 在在ARMARM的汇编程序中,伪操作主要有的汇编程序中,伪操作主要有符号定符号定义伪操作、数据定义伪操作、汇编

8、代码控制伪义伪操作、数据定义伪操作、汇编代码控制伪操作、汇编信息报告控制伪操作、指令集类型操作、汇编信息报告控制伪操作、指令集类型标识伪操作、文件包含伪操作和其他类型伪操标识伪操作、文件包含伪操作和其他类型伪操作作等。等。6.3.1 6.3.1 符号定义伪操作符号定义伪操作 符号定义伪操作用于定义符号定义伪操作用于定义ARMARM汇编程序中的变量、对汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。伪操作有如下几种。 (1 1)局部变量定义)局部变量定义LCLALCLA、LCLLLCLL及及LCLSLCLS (

9、2 2)全局变量定义)全局变量定义GBLAGBLA、GBLLGBLL及及GBLSGBLS (3 3)变量赋值伪操作)变量赋值伪操作SETASETA、SETLSETL及及SETSSETS (4 4)给通用寄存器列表定义名称)给通用寄存器列表定义名称RLISTRLIST (5 5) VFPVFP寄存器名称定义寄存器名称定义DNDN、SNSN (6 6)FPAFPA浮点寄存器名称定义浮点寄存器名称定义FNFN (7 7)协处理器名称定义)协处理器名称定义CPCP (8 8)协处理器寄存器名称定义)协处理器寄存器名称定义CNCN GBLA Test1 Test1 SETA 0xaa GBLL Test

10、2 Test2 SETL TRUE GBLS Test3 Test3 SETS “Testing”应用示例应用示例: :例例6-11将将寄寄存存器器列列表表R0、R1、R2、R5、R7、R10、R11、R12的名称定义为的名称定义为Reglist。 Reglist RLIST R0-R2,R5,R7,R10-R12 4.4.给给通通用用寄寄存存器器列列表表定定义义名名称称RLISTRLIST RLISTRLIST伪操作用于给一个通用寄存器列表定义名称,伪操作用于给一个通用寄存器列表定义名称,使用该伪操作定义的名称可以在使用该伪操作定义的名称可以在LDM/STMLDM/STM中使用。中使用。na

11、me RLIST registers_list6.3.2 6.3.2 数据定义伪操作数据定义伪操作 数据定义伪操作一般用于为特定的数据分数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种。始化。常见的数据定义伪操作有如下几种。 (1 1)DCB DCB 用于分配一片连续的字节存储单元并用于分配一片连续的字节存储单元并用指定的数据初始化。用指定的数据初始化。 (2 2)DCW /DCWU DCW /DCWU 用于分配一片连续的半字存储用于分配一片连续的半字存储单元并用指定的数据初始化。单元并用指

12、定的数据初始化。 (3 3)DCD DCD /DCDU/DCDU 用于分配一片连续的字存储单用于分配一片连续的字存储单元并用指定的数据初始化。元并用指定的数据初始化。 (4 4)DCFS /DCFSU DCFS /DCFSU 用于为单精度的浮点数分配用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。一片连续的字存储单元并用指定的数据初始化。 (5 5)DCFD/DCFDU DCFD/DCFDU 用于为双精度的浮点数分配一用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。片连续的字存储单元并用指定的数据初始化。 (6 6)DCQ/DCQUDCQ/DCQU用于分配一

13、片以用于分配一片以8 8字节为单位的连字节为单位的连续的存储单元并用指定的数据初始化。续的存储单元并用指定的数据初始化。 (7 7)LTORG LTORG 声明一个数据缓冲池。声明一个数据缓冲池。 (8 8)SPACESPACE用于分配一片连续的存储区域并将其用于分配一片连续的存储区域并将其初始化为初始化为0 0。 (9 9)MAPMAP用于定义一个结构化的内存表首地址。用于定义一个结构化的内存表首地址。 (1010)FIELDFIELD用于定义一个结构化的内存表的数据用于定义一个结构化的内存表的数据域。域。 (1111)DCDO DCDO 将内存单元的内容初始化为相对地址。将内存单元的内容初

14、始化为相对地址。 (1212)DCI DCI 分配用于存放代码的内存单元。分配用于存放代码的内存单元。DCBDCB:DISPTAB DCB 0x33,0x43,0x76,0x12 DCB -120,20,36,55ERRSTR DCB “Send,data is error!”,0DCD: AREA Word, CODE, READONLY num EQU 20 ENTRY start LDR R0, =src LDR R1, =dst MOV R2, #numwordcopy LDR R3, R0, #4 STR R3, R1, #4 SUBS R2, R2, #1 BNE wordcopy

15、stop B stop AREA BlockData, DATA, READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ENDLTORGLTORG: 例例6-226-22(1 1)声明一个数据缓冲池用来存储)声明一个数据缓冲池用来存储0xAABBCCDD0xAABBCCDD。 LDR R0, =0xAABBCCDD LDR R0, =0xAABBCCDD EOR R1,R1,R0 EOR R1,R1,R0 B SUB_pro B SUB_p

16、ro LTORG LTORG (2 2)用)用LTORGLTORG伪操作定义数据缓冲池。伪操作定义数据缓冲池。 AREA Example,CODE,READONLY AREA Example,CODE,READONLY_start BL fun_sub1_start BL fun_sub1 fun_sub1 fun_sub1 LDR R0,=0xAABBCCDD LDR R0,=0xAABBCCDD MOV PC,LR MOV PC,LR LTORG LTORG END ENDSPACESPACE: AREA Data,DATA,READWRITE DataBuf SPACE 1000 MAP

17、MAP、FIELDFIELD: 例例6-256-25(1 1)定定义义一一个个结结构构化化的的内内存存表表,其其首首地地址址固固定定为为0x3000x300,该该结结构构化化内内存存表表包包含含4 4个个域域,Fdata1Fdata1长长度度为为4 4字字节节,Fdata2Fdata2长长度度为为8 8字字节节, Fdata3Fdata3长度为长度为100100字节,字节,Fdata4Fdata4长度为长度为200200字节。字节。 MAP 0x300 Fdata1 FIELD 4 Fdata2 FIELD 8 Fdata3 FIELD 100 Fdata4 FIELD 200 MAPMAP、

18、FIELDFIELD:(2 2)分析下面)分析下面LDRLDR指令实现的功能。指令实现的功能。 MAP 4,R12 FIELD 4Fdata FIELD 4 LDR R0,FdataMAPMAP、FIELDFIELD:6.3.3 6.3.3 汇编汇编代码代码控制伪操作控制伪操作 汇编代码控制伪操作用于控制汇编程序的汇编代码控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几执行流程,常用的汇编控制伪操作包括以下几条:条: 1. IF1. IF条件编译伪操作;条件编译伪操作; 2. WHILE2. WHILE条件编译伪操作;条件编译伪操作; 宏定义伪操作宏定义伪操作 IF IF、

19、ELSEELSE、ENDIFENDIF伪操作能根据条件的成伪操作能根据条件的成立与否来决定是否对一段程序代码进行编译。立与否来决定是否对一段程序代码进行编译。语法格式:语法格式:IF IF logical-expression logical-expression 程序代码程序代码A A ELSEELSE 程序代码程序代码B B ENDIFENDIF1. IF1. IF条件编译伪操作条件编译伪操作 例例6-286-28IF UART0 = ONIF UART0 = ON BL UART0_init BL UART0_initELSEELSE BL UART1_initBL UART1_init

20、ENDIFENDIF WHILEWHILE、WENDWEND伪操作能根据条件的成立与否决定伪操作能根据条件的成立与否决定是否是否对一段程序代码进行重复编译,直到对一段程序代码进行重复编译,直到WHILEWHILE后面后面的逻辑表达式不成立为止的逻辑表达式不成立为止。语法格式:语法格式:WHILEWHILE logical-expression logical-expression 程序代码程序代码WENDWEND条件编译伪操作条件编译伪操作 例例6-296-29 counter SETA 100counter SETA 100 WHILEWHILE counter0 counter0 . .

21、. . counter SETA counter - 1 counter SETA counter - 1WENDWEND MACROMACRO、MENDMEND伪操作可以将一段代码定义为一个伪操作可以将一段代码定义为一个整体,称为宏,然后就可以在程序中通过宏指令多整体,称为宏,然后就可以在程序中通过宏指令多次调用该段代码。次调用该段代码。MACROMACRO标志宏定义的开始,标志宏定义的开始,MENDMEND标标志宏定义的结束。志宏定义的结束。语法格式:语法格式:MACROMACRO$label macroname $label macroname $parameter,$parameter

22、$parameter,$parameter程序代码段程序代码段MENDMEND 3. MACRO3. MACRO宏定义伪操作宏定义伪操作 #define S(r) PI*r*r #define S(r) PI*r*r main() main() float a,area; float a,area; a=3.6; a=3.6; area=S(a); area=S(a); printf( printf(“r=%fnarea=%fnr=%fnarea=%fn”,a,area);,a,area);C C语言宏定义和使用语言宏定义和使用与与C C语言中的语言中的definedefine相似,仅在源程序

23、中做字符替相似,仅在源程序中做字符替换以换以MACROMACRO指示符开始,以指示符开始,以MENDMEND结束。结束。例例6-30MACRO$label TestAndBranch $dest, $reg, $cc$label CMP $reg, #0B$cc $destMENDTestTestAndBranch NonZero, R0, NENonZeroTestCMP R0, #0BNE NonZeroNonZero6.3.5 6.3.5 指令集类型标识指令集类型标识伪操作伪操作 指令集指令集类型型标识伪操作用来告操作用来告诉编译器所器所处理的理的是是32位的位的ARM指令指令还是是16

24、位的位的Thumb指令,指令,实现这一操作的操作符有一操作的操作符有ARM、CODE32、THUMB、CODE16。 例例6-356-35 AREA ToThumb,CODE,READONLY AREA ToThumb,CODE,READONLY ENTRY ENTRY ARMARMstartstart ADR R0,into_thumb+1 ADR R0,into_thumb+1 BX R0 BX R0 THUMBTHUMBinto_thumbinto_thumb MOVS R0,#10 MOVS R0,#10 6.3.6 6.3.6 文件包含文件包含伪操作伪操作文件包含伪操作包括两类:文件

25、包含伪操作包括两类:一类是将一个源文件包含到当前源文件中,并将被包一类是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理;含的文件在其当前位置进行汇编处理;另一类是也将一个源文件包含到当前源文件中,但被另一类是也将一个源文件包含到当前源文件中,但被包含文件不进行汇编处理。包含文件不进行汇编处理。 GETGET伪操作用于将一个源文件包含到当前伪操作用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用进行汇编处理。可以使用INCLUDEINCLUDE代替代替GETGET。1 1文件包含文件包含GET

26、GET或或INCLUDEINCLUDE 例例6-366-36: AREA Example,CODE,READONLYAREA Example,CODE,READONLY INCBININCBIN伪操作将一个文件包含到当前源文伪操作将一个文件包含到当前源文件中,该文件按原样包含,不进行汇编处理。件中,该文件按原样包含,不进行汇编处理。可以使用可以使用INCBININCBIN来包含可执行文件、文字或其来包含可执行文件、文字或其他数据。他数据。2 2文件原样包含文件原样包含INCBININCBIN 例例6-376-37: AREA Example,CODE,READONLYAREA Example,

27、CODE,READONLY6.3.7 6.3.7 其他类型其他类型伪操作伪操作n对齐方式设置对齐方式设置ALIGNn段属性定义伪操作段属性定义伪操作AREA n源程序结尾标识源程序结尾标识END n声明程序的入口点声明程序的入口点ENTRY n定义常量或标号名称定义常量或标号名称EQU n声明全局标号声明全局标号EXPORT或或GLOBAL n将符号导出到目标文件将符号导出到目标文件EXPORTAS n外部符号声明外部符号声明IMPORT 和和 EXTERN n保留局部符号保留局部符号KEEP n禁止使用浮点指令禁止使用浮点指令NOFP n指定段的相关性指定段的相关性REQUIRE n堆栈八字

28、节对齐堆栈八字节对齐REQUIRE8 和和 PRESERVE8 n局部变量范围定义局部变量范围定义ROUT ALIGN ALIGN伪操作通过用零或伪操作通过用零或NOPNOP指令进行指令进行填充来使当前位置与指定的边界对齐。填充来使当前位置与指定的边界对齐。应用示例:应用示例: AREA Example,CODE,READONLYAREA Example,CODE,READONLY START LDR R0,=sdfjk START LDR R0,=sdfjk . . MOV PC,LR MOV PC,LR sdfjk DCB 0X56 sdfjk DCB 0X56 ALIGN ALIGN S

29、UBI MOV R1,R3 SUBI MOV R1,R3 . . MOV PC,LR MOV PC,LR 1.1.对齐方式设置对齐方式设置ALIGNALIGN 段属性定义伪操作段属性定义伪操作AREAAREA用于定义一用于定义一个代码段或数据段,个代码段或数据段,AREA AREA 伪操作指示汇编器伪操作指示汇编器汇编新的代码段或数据段。汇编新的代码段或数据段。 ARMARM程序采用分段式设计,一个程序采用分段式设计,一个ARMARM源源程序至少需要一个代码段,大的程序可以包含程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。多个代码段和数据段。2 2段属性定义伪操作段属性定义伪操作

30、AREAAREAAREA ThumbSub,CODE,READONLYENTRY CODE32header ADR R0,start+1 BX R0 CODE16start MOV R0,#10 MOV R1,#3 BL doaddstop B stopdoadd ADD R0,R0,R1 MOV PC,LR END ENDEND伪操作用于通知编译器已经到了源程伪操作用于通知编译器已经到了源程序的结尾。序的结尾。 3 3源程序结尾标识源程序结尾标识ENDEND ENTRY ENTRY伪操作用于指定汇编程序的入口伪操作用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个点。在一个完整的汇

31、编程序中至少要有一个ENTRY,ENTRY,但在一个源文件里不能使用多个但在一个源文件里不能使用多个ENTRYENTRY。重释:重释:一个程序(可以包含多个源文件)中至少要一个程序(可以包含多个源文件)中至少要有一个有一个ENTRYENTRY,可以有多个,可以有多个ENTRYENTRY,但一个源文件中,但一个源文件中最多只有一个最多只有一个ENTRYENTRY。 4 4声明程序的入口点声明程序的入口点ENTRYENTRY EQUEQU伪操作用于为程序中的常量、标号等伪操作用于为程序中的常量、标号等定义一个等效的字符名称。定义一个等效的字符名称。应用示例:应用示例: Test EQU 50Tes

32、t EQU 50Addr EQU 0x55Addr EQU 0x555 5定义常量或标号名称定义常量或标号名称EQUEQU EXPORTEXPORT伪操作用于在程序中声明一个全局伪操作用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。的标号,该标号可在其他的文件中引用。应用示例:应用示例: AREA Init,CODE,READONLYAREA Init,CODE,READONLYEXPORT StestEXPORT StestENDEND6 6EXPORTEXPORT(注:汇编源程序中用)注:汇编源程序中用) EXTERNEXTERN伪操作用于通知编译器要使用的标伪操作用于通知编译

33、器要使用的标号在其他的源文件中定义,但要在当前源文件号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。该标号就不会被加入到当前源文件的符号表中。8 8EXTERNEXTERN(注:注:C C源程序中用)源程序中用)C C源程序源程序:# include extern void strcopy(char *d,const char *s); int main(void) const char *srcstr =“First stringsource”;const char * ds

34、tstr =“Second stringdestination”;strcopy(dststr,srcstr););return(0););汇编源程序:汇编源程序: AREA SCopy,CODE,READONLY ENTRY EXPORT strcopy strcopy LDRB R2,R1,#1 STRB R2,R0,#1 CMP R2,#0 BNE strcopy MOV PC,LR END IMPORTIMPORT伪操作用于通知编译器要使用的标伪操作用于通知编译器要使用的标号在其他的源文件中定义。号在其他的源文件中定义。IMPORTIMPORT(注:汇编源程序中用)注:汇编源程序中用)

35、C函数原型:函数原型:int g(int a,int b,int c,int d)return a+b+c+d;汇编源程序:汇编源程序:AREA fAREA f,CODECODE,READONLYREADONLYIMPORT gIMPORT gSTR LRSTR LR,SPSP,#- 4#- 4! ADD R1ADD R1,R0R0,R0R0ADD R2ADD R2,R1R1,R0R0ADD R3ADD R3,R1R1,R2R2STR R4STR R4,SPSP,#- 4#- 4!ADD R3ADD R3,R1R1,R1R1BL gBL gADD SPADD SP,SPSP,#4#4 LDR PCLDR PC,SPSP,#4#4 ENDEND

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

最新文档


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

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