您的位置 首页 FPGA

ARM汇编伪指令详解(3)

汇编控制(AssemblyControl)伪指令汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:—IF、ELS

汇编操控( Assembly Control )伪指令
汇编操控伪指令用于操控汇编程序的履行流程,常用的汇编操控伪指令包括以下几条:
— IF 、 ELSE 、 ENDIF
— WHILE 、 WEND
— MACRO 、 MEND
— MEXIT

1、 IF、ELSE、ENDIF
语法格局:
IF 逻辑表达式
指令序列 1
ELSE
指令序列 2
ENDIF
IF 、 ELSE 、 ENDIF 伪指令能依据条件的建立与否决议是否履行某个指令序列。当 IF 后边的逻辑表

达式为真,则履行指令序列 1 ,不然履行指令序列 2 。其间, ELSE 及指令序列 2 能够没有,此刻,当

IF 后边的逻辑表达式为真,则履行指令序列 1 ,不然持续履行后边的指令。
IF 、 ELSE 、 ENDIF 伪指令能够嵌套运用。
运用示例:
GBLL Test ;声明一个大局的逻辑变量,变量名为 Test……
IF Test = TRUE
指令序列 1
ELSE
指令序列 2
ENDIF

2、 WHILE、WEND
语法格局:
WHILE 逻辑表达式
指令序列
WEND
WHILE 、 WEND 伪指令能依据条件的建立与否决议是否循环履行某个指令序列。当 WHILE 后边的逻辑

表达式为真,则履行指令序列,该指令序列履行完毕后,再判别逻辑表达式的值,若为真则持续履行,一向

到逻辑表达式的值为假。
WHILE 、 WEND 伪指令能够嵌套运用。
运用示例:
GBLA Counter ;声明一个大局的数学变量,变量名为 Counter
Counter SETA 3 ;由变量Counter 操控循环次数
……
WHILE Counter < 10
指令序列
WEND

3、 MACRO、MEND
语法格局:
$ 标号 宏名 $ 参数 1 , $ 参数 2 ,……
指令序列
MEND
MACRO 、 MEND 伪指令能够将一段代码界说为一个全体,称为宏指令,然后就能够在程序中经过宏指令

屡次调用该段代码。其间, $ 标号在宏指令被打开时,标号会被替换为用户界说的符号,宏指令能够运用

一个或多个参数,当宏指令被打开时,这些参数被相应的值替换。
宏指令的运用办法和功用与子程序有些类似,子程序能够供给模块化的程序设计、节约存储空间并进步

运转速度。但在运用子程序结构时需求维护现场,然后增加了体系的开支,因而,在代码较短且需求传递的

参数较多时,能够运用宏指令替代子程序。
包括在 MACRO 和 MEND 之间的指令序列称为宏界说体,在宏界说体的榜首行应声明宏的原型(包括宏

名、所需的参数),然后就能够在汇编程序中经过宏名来调用该指令序列。在源程序被编译时,汇编器将宏

调用打开,用宏界说中的指令序列替代程序中的宏调用,并将实践参数的值传递给宏界说中的形式参数。


MACRO 、 MEND 伪指令能够嵌套运用。

4、 MEXIT
语法格局:
MEXIT
MEXIT 用于从宏界说中跳转出去。

其他常用的伪指令
还有一些其他的伪指令,在汇编程序中经常会被运用,包括以下几条:
— AREA
— ALIGN
— CODE16 、 CODE32
— ENTRY
— END
— EQU
— EXPORT (或 GLOBAL )
— IMPORT
— EXTERN
— GET (或 INCLUDE )
— INCBIN
— RN
— ROUT


1、 AREA
语法格局:
AREA 段名特点 1 ,特点 2 ,……
AREA 伪指令用于界说一个代码段或数据段。其间,段名若以数字最初,则该段名需用 “ | ” 括起来

,如 |1_test| 。
特点字段表明该代码段(或数据段)的相关特点,多个特点用逗号分隔。常用的特点如下:
— CODE 特点:用于界说代码段,默以为 READONLY 。
— DATA 特点:用于界说数据段,默以为 READWRITE 。
— READONLY 特点:指定本段为只读,代码段默以为 READONLY 。
— READWRITE 特点:指定本段为可读可写,数据段的默许特点为 READWRITE 。
— ALIGN 特点:运用办法为 ALIGN 表达式。在默许时, ELF (可履行衔接文件)的代码段和数据段

是按字对齐的,表达式的取值规模为 0 ~ 31 ,相应的对齐办法为 2 表达式次方。
— COMMON 特点:该特点界说一个通用的段,不包括任何的用户代码和数据。各源文件中同名的

COMMON 段同享同一段存储单元。
一个汇编语言程序至少要包括一个段,当程序太长时,也能够将程序分为多个代码段和数据段。
运用示例:
AREA Init , CODE , READONLY
该伪指令界说了一个代码段,段名为 Init ,特点为只读

2、 ALIGN
语法格局:
ALIGN { 表达式 { ,偏移量 }}
ALIGN 伪指令可经过增加填充字节的办法,使当时方位满意必定的对其办法 | 。其间,表达式的值用

于指定对齐办法,或许的取值为 2 的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当时位

置对齐到下一个字的方位。偏移量也为一个数字表达式,若运用该字段,则当时方位的对齐办法为: 2 的

表达式次幂+偏移量。
运用示例:
AREA Init , CODE , READONLY , ALIEN = 3 ;指定后边的指令为 8 字节对齐。
指令序列
END

3、 CODE16、CODE32
语法格局:
CODE16 (或 CODE32 )
CODE16 伪指令告诉编译器,这以后的指令序列为 16 位的 Thumb 指令。
CODE32 伪指令告诉编译器,这以后的指令序列为 32 位的 ARM 指令。
若在汇编源程序中一起包括 ARM 指令和 Thumb 指令时,可用 CODE16 伪指令告诉编译器这以后的指令序

列为 16 位的 Thumb 指令, CODE32 伪指令告诉编译器这以后的指令序列为 32 位的 ARM 指令。因而,在使

用 ARM 指令和 Thumb 指令混合编程的代码里,可用这两条伪指令进行切换,但留意他们只告诉编译器这以后

指令的类型,并不能对处理器进行状况的切换。
运用示例:
AREA Init , CODE , READONLY
……
CODE32 ;告诉编译器这以后的指令为 32 位的 ARM 指令
LDR R0 ,= NEXT + 1 ;将跳转地址放入寄存器 R0
BX R0 ;程序跳转到新的方位履行,并将处理器切换到 Thumb 作业状况
……
CODE16 ;告诉编译器这以后的指令为 16 位的 Thumb 指令
NEXT LDR R3,=0x3FF
……
END ;程序完毕

4、 ENTRY
语法格局:
ENTRY
ENTRY 伪指令用于指定汇编程序的进口点。在一个完好的汇编程序中至少要有一个 ENTRY (也能够有

多个,当有多个 ENTRY 时,程序的真实进口点由链接器指定),但在一个源文件里最多只能有一个 ENTRY

(能够没有)。
运用示例:
AREA Init , CODE , READONLY
ENTRY ;指定应用程序的进口点
……

5、 END
语法格局:
END
END 伪指令用于告诉编译器现已到了源程序的结束。
运用示例:
AREA Init , CODE , READONLY
……
END ;指定应用程序的结束

6、 EQU
语法格局:
称号 EQU 表达式 { ,类型 }
EQU 伪指令用于为程序中的常量、标号等界说一个等效的字符称号,类似于 C 语言中的# define 。


其间 EQU 可用 “ * ” 替代。
称号为 EQU 伪指令界说的字符称号,当表达式为 32 位的常量时,能够指定表达式的数据类型,能够

有以下三种类型:
CODE16 、 CODE32 和 DATA
运用示例:
Test EQU 50 ;界说标号 Test 的值为 50
Addr EQU 0x55 , CODE32 ;界说 Addr 的值为 0x55 ,且该处为 32 位的 ARM 指令。

7、 EXPORT(或GLOBAL)
语法格局:
EXPORT 标号 {[WEAK]}
EXPORT 伪指令用于在程序中声明一个大局的标号,该标号可在其他的文件中引证。 EXPORT可用

GLOBAL 替代。标号在程序中区别大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引证。
运用示例:
AREA Init , CODE , READONLY
EXPORT Stest ;声明一个可大局引证的标号Stest……
END

8、 IMPORT
语法格局:
IMPORT 标号 {[WEAK]}
IMPORT 伪指令用于告诉编译器要运用的标号在其他的源文件中界说,但要在当时源文件中引证,并且

不管当时源文件是否引证该标号,该标号均会被加入到当时源文件的符号表中。
标号在程序中区别大小写, [WEAK] 选项表明当一切的源文件都没有界说这样一个标号时,编译器也不

给出错误信息,在大都情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引证,则将 B 或 BL指令置为

NOP 操作。
运用示例:
AREA Init , CODE , READONLY
IMPORT Main ;告诉编译器当时文件要引证标号Main,但Main 在其他源文件中界说……
END

9、 EXTERN
语法格局:
EXTERN 标号 {[WEAK]}
EXTERN 伪指令用于告诉编译器要运用的标号在其他的源文件中界说,但要在当时源文件中引证,假如

当时源文件实践并未引证该标号,该标号就不会被加入到当时源文件的符号表中。标号在程序中区别大小写

, [WEAK] 选项表明当一切的源文件都没有界说这样一个标号时,编译器也不给出错误信息,在大都情况下

将该标号置为 0 ,若该标号为 B 或 BL 指令引证,则将 B 或 BL指令置为 NOP 操作。
运用示例:
AREA Init , CODE , READONLY
EXTERN Main ;告诉编译器当时文件要引证标号Main,但Main 在其他源文件中界说……
END

10、 GET(或INCLUDE)
语法格局:
GET 文件名
GET 伪指令用于将一个源文件包括到当时的源文件中,并将被包括的源文件在当时方位进行汇编处理。

能够运用 INCLUDE 替代 GET 。
汇编程序中常用的办法是在某源文件中界说一些宏指令,用 EQU 界说常量的符号称号,用 MAP和

FIELD 界说结构化的数据类型,然后用 GET 伪指令将这个源文件包括到其他的源文件中。运用办法与 C 语

言中的 “ include ” 类似。
GET 伪指令只能用于包括源文件,包括方针文件需求运用 INCBIN 伪指令
运用示例:
AREA Init , CODE , READONLY
GET a1.s ;告诉编译器当时源文件包括源文件a1.s
GE T C:\a2.s ;告诉编译器当时源文件包括源文件C:\ a2.s ……
END

11、 INCBIN
语法格局:
INCBIN 文件名
INCBIN 伪指令用于将一个方针文件或数据文件包括到当时的源文件中,被包括的文件不作任何变化的

存放在当时文件中,编译器从这以后开端持续处理。
运用示例:
AREA Init , CODE , READONLY
INCBIN a1.dat ;告诉编译器当时源文件包括文件a1.dat
INCBIN C:\a2.txt ;告诉编译器当时源文件包括文件C:\a2.txt……
END

12、 RN
语法格局:
称号 RN 表达式
RN 伪指令用于给一个寄存器界说一个别号。选用这种办法能够便利程序员回忆该寄存器的功用。其间

,称号为给寄存器界说的别号,表达式为寄存器的编码。
运用示例:
Temp RN R0 ;将R0 界说一个别号Temp

13、 ROUT
语法格局:
{ 称号 } ROUT
ROUT 伪指令用于给一个部分变量界说效果规模。在程序中未运用该伪指令时,部分变量的效果规模为

地点的 AREA ,而运用 ROUT 后,部分变量的作为规模为当时 ROUT 和下一个 ROUT 之间。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/263171.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部