|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、 AREA
8 G% N9 T5 \( b' \! J- I3 t' CAREA 伪指令用于定义一个代码段或数据段。
2 z G: n, `2 O' z 语法格式: . a7 E$ C$ w- w% H
AREA 段名 属性 1 ,属性 2 ,…… # c6 z, Y! B: y& H9 l% f
其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。
% E$ n N' s+ w4 t. ` 属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下: 9 v8 l, a+ ]9 [/ m6 s0 _3 `& l0 B B
— CODE 属性:用于定义代码段,默认为 READONLY 。
9 `- n _4 s( x/ c1 t- |— DATA 属性:用于定义数据段,默认为 READWRITE 。 2 x( Q$ O) w1 T% g% j5 d4 d, P
— READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 2 |$ |# a# _7 X; K1 T
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。 - ~! Y( i+ B. m! b m4 X% Z
— ALIGN 属性:使用方式为ALIGN表达式。在默认时, ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~ 31 ,相应的对齐方式为表达式2次方。 9 I7 S" ^3 A' M
— COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。
% L0 C' K( x0 M9 W! v 一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。 9 l$ Z/ d# H) k0 p3 N* U
使用示例:
; J/ P7 e+ ^, S7 V' x; ?) DAREA Init , CODE , READONLY y% |6 A( o, R
该伪指令定义了一个代码段,段名为 Init ,属性为只读7 ?1 a+ a) |5 j0 {8 K ~: h
4 l3 [# x- ]- t/ a% v( [7 I6 X: J$ n0 D6 H
2、 ALIGN
: [7 C: D( F2 D- HALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式 。
* x- z0 C" w- T! q4 l2 g. ~) ^ 语法格式:
/ h' ^- h) T! h% Z; d: i ALIGN { 表达式 { ,偏移量 }}
" ?7 g o7 n; [3 u' n1 ` 其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为: 2 的表达式次幂+偏移量。
8 b: b4 m7 t: S2 v l+ v4 O( L6 i使用示例:
; s4 H- K! f4 Z+ }2 o# M1 q- n AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令为8字节对齐。 指令序列
) {5 c1 K5 E" S. B E7 L0 R END 7 m) R9 X5 J' Q- X& o" T6 {7 q+ Q
0 n# A+ ]0 H! f8 p* X
3、 ENTRY
8 {* s5 }' G, HENTRY 伪指令用于指定汇编程序的入口点。
% m8 c- o9 F, n& z 语法格式:
a7 P6 \3 t" I ENTRY 3 J( _$ V3 s ^8 b
在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
$ f$ [% p* }9 r/ o- g5 u 使用示例:
9 x1 x- U/ l% c6 q4 u. j) m. k AREA Init , CODE , READONLY
# `+ `: i; C& I9 ]* w1 U! G ENTRY ;指定应用程序的入口点 / D4 n( g7 E! a3 r/ `8 \1 a
…… $ H% f/ A: ^0 u. u/ F
4、 END, M& I7 b' `( ^- \9 R: V
END 伪指令用于通知编译器已经到了源程序的结尾。 . L/ ^* e5 e/ P3 H
语法格式:
7 N/ ~+ i) p4 |/ ? END
' Y- h; Z4 D9 m2 k" @9 c2 j 使用示例: 3 V9 m: q: t# j0 W0 @3 X4 h0 b
AREA Init , CODE , READONLY
. s" S' ~9 |) @; v …… / `, i- A* W+ U9 y
END ;指定应用程序的结尾 , x5 ~; F! D2 c8 ]& o( |( k
% [" t5 D$ U- L* y: n" h1 X% _/ }& _0 c! U0 N+ ^7 N& E7 Z
5、 EQU
2 Z# W/ e# Y4 PEQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define 。
2 ?" Z% c# K: |- b: C 语法格式:
" O4 T6 ^* }$ | 名称 EQU 表达式 { ,类型 }
4 {. C0 I4 f' C) ?% X 其中 EQU 可用 “ * ” 代替。 6 k" n3 _; M/ w
名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型:
7 F; T, O; Z0 q- ?7 Y6 r CODE16 、 CODE32 和 DATA ' Z+ D% a$ _% R# K2 _
( c# w1 H' q8 Y4 q6、 EXPORT(或GLOBAL) % U4 i1 F5 X; E2 ?
语法格式:
$ O6 ?) A& |7 m EXPORT 标号 {[WEAK]} : m, P' r& e# B- q
EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用GLOBAL代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。 % m( H: b* o2 F9 k( |6 [+ B+ B
使用示例: 0 n9 B3 T% `! r1 ?% ~ o
AREA Init , CODE , READONLY 0 Z, P% N5 T$ r$ E L. G
EXPORT Stest ;声明一个可全局引用的标号Stest…… ' L% b0 V6 J; e8 t" D+ l
END
0 H9 ]+ z0 ?4 a) ]) Z+ O5 Z4 i8 y8 K1 c9 L }+ {
7、 IMPORT 3 w; M9 m- g3 m/ c
语法格式: ! y9 ?/ p& z5 U3 D( z
IMPORT 标号 {[WEAK]} 2 b7 T% e# X& F8 }( ?, X1 `
IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
9 A, i! v7 v* S# s9 ~- F* N 标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B 或BL指令引用,则将B或BL指令置为 NOP 操作。
% T( B6 d3 A/ F! B$ L+ j( p 使用示例: # a: D3 w4 S" G- R8 G
AREA Init , CODE , READONLY 4 S, ^& s2 ^/ D( K5 S9 S
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义
6 ^; p( ^1 l/ | …… 0 e, p% f5 w' w) Z$ L
END
# S+ g- U3 ^! W1 I3 }2 w2 N) u6 S$ `3 U0 M. k8 [0 |, n; W5 d2 L
5 v5 p. g, s6 X. n/ H
8、 EXTERN
$ `3 W1 J+ I1 r 语法格式: 2 ?% T* ?. l" y5 N2 k- L: f- N
EXTERN 标号 {[WEAK]}
' w; T6 s2 R- ^& g; Y/ C, Q EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。
# _4 Z% D! S, D2 J5 H* {" t1 K& f$ _ 使用示例: % Q& D$ A- G; f6 i4 h& Y
AREA Init , CODE , READONLY . _) A: W. @+ r- ]) P5 {% v% Z
EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义……
: B9 D7 j. S: o2 O. p5 c: n END
+ a6 M8 v+ X4 K
2 V! f! n( O) E; x5 L+ S) z- U2 t# h% I
9、 GET(或INCLUDE) . P, I* y+ r; h( W2 L$ P
语法格式:
; F x9 {; i: ]" p: D3 R6 f/ v( S GET 文件名
' H+ k7 p5 |$ @, S2 |: q1 K GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。 2 d% K( g6 Q0 }+ a: w: M7 b5 f7 L
汇编程序中常用的方法是在某源文件中定义一些宏指令,用 EQU 定义常量的符号名称,用MAP和FIELD 定义结构化的数据类型,然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 “ include ” 相似。
: B6 n9 D" A. F; y0 } GET 伪指令只能用于包含源文件,包含目标文件需要使用 INCBIN 伪指令 + V' V1 m1 N! G7 }0 n% B
使用示例: 7 }$ }8 W5 K! h4 T. L0 o1 S+ W8 g
AREA Init , CODE , READONLY
) U q3 I# _1 m8 M# V GET a1.s ;通知编译器当前源文件包含源文件a1.s : w/ e6 W! j8 s/ k. @
GE T C:\a2.s ;通知编译器当前源文件包含源文件C:\ a2.s ……
! H. M! H1 R* m" O+ j5 x/ W" D: C, t END
0 f" Q1 M$ V) C4 G/ j. z$ f% F' ~5 `1 i8 M2 z ^+ r8 B1 A
, t) M, m S- g4 E- ?6 |# _* u3 V10、 INCBIN
. Q# f, m: s6 D' }1 E& J 语法格式: ) v2 V1 ?; |- v+ Z
INCBIN 文件名
- j+ |- v5 g9 @+ X' I+ k8 s INCBIN 伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。
/ ^, r$ B( `# X' C) } 使用示例: 2 F$ {8 h" n+ a! }, r: f
AREA Init , CODE , READONLY 2 z5 y7 c! F2 h9 M3 ]! ^; S
INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat ) o A7 h ~' W8 |" z' N
INCBIN C:\a2.txt ;通知编译器当前源文件包含文件C:\a2.txt…… 4 D6 _8 R5 z3 J6 v' ~6 B( P
END
8 Z. Z3 F& |0 h. E9 J. V% v
! W; c- c& g% W! y) @
; {# ?5 j! L1 t |% n4 q* s, h11、 RN . l6 ~7 G3 ~. n5 n+ v" y
语法格式:
- k2 F2 p7 |0 f$ e+ e 名称 RN 表达式 ) f+ B9 |1 ~2 b/ H2 R
RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。
% V2 i: K f; ?. n 使用示例:
' o* F- `+ \& ?; X, Z+ U, H+ y Temp RN R0 ;将R0定义一个别名Temp 6 c) `0 Q9 g- U& T6 ?+ u8 \
1 d& F$ `& s$ w& v* ~" V; M* S3 @$ }
`( K4 t$ g0 u! c- Y6 q12、 ROUT - M6 G' {- i1 H* q& Q. c! ^& W2 f
语法格式: 4 R: d( m S3 K" y% L6 f2 H
{ 名称 } ROUT ) r! C5 w5 n+ `" p+ h, f0 v9 o% P
ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ,而使用 ROUT 后,局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。
4 G. k$ ]1 b3 R6 A( c, N7 I/ C 否则,zero=0(跳到SuspendUp处执行)$ E" C4 {( R8 Y6 _3 m$ K$ \1 c% V
|
|