|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、 AREA5 L: @2 a% ?: o' f
AREA 伪指令用于定义一个代码段或数据段。
4 |/ I2 h) R/ D1 \: l& { 语法格式: ' n5 ?2 y. v. N2 T% j$ j# t
AREA 段名 属性 1 ,属性 2 ,…… 2 G; q2 n6 }$ }! V
其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。
' b# _: F! P; k) ]; t$ ^ 属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:
, c4 U0 m0 |& |& f+ B/ K/ X— CODE 属性:用于定义代码段,默认为 READONLY 。
`9 e/ D S, k2 g, O3 }! X— DATA 属性:用于定义数据段,默认为 READWRITE 。 " `: P( ?! d' {3 V$ `
— READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 # Q2 o1 s x, E, V. W! u+ \: p
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。
+ |! J* R7 o+ {+ C& V/ n— ALIGN 属性:使用方式为ALIGN表达式。在默认时, ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~ 31 ,相应的对齐方式为表达式2次方。 ! |& U& q/ X1 u& \; p
— COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。 5 R: e9 d, R0 N0 J8 S+ D$ A
一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。
2 G8 B, i. }% Q8 U 使用示例:
& v0 h2 j; @6 r. s+ mAREA Init , CODE , READONLY # _" _9 j! _2 l) @- M( f6 F
该伪指令定义了一个代码段,段名为 Init ,属性为只读
8 w) a$ g3 r/ |9 o7 X+ t
3 `2 F: X6 o q, A" }9 E" v
) {: \! K. X9 Q) E' e9 h' ~* P2、 ALIGN ' L# {7 R$ h: X+ `9 g
ALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式 。
' v7 f) f' X! \: c 语法格式: ) c; u ]2 J) |2 \7 e0 w
ALIGN { 表达式 { ,偏移量 }} 3 P5 F3 b& r' r+ g3 `; N
其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为: 2 的表达式次幂+偏移量。 ; k$ E/ F X# w
使用示例:
0 {5 i4 c+ l& ] AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令为8字节对齐。 指令序列
$ E$ Z$ i4 c9 X4 v1 e END ! V% D! x3 e) _- L
1 p0 b0 C Q3 g3 \# [0 ]& A/ b0 `( R
3、 ENTRY: s3 \ h; G( v* b* |
ENTRY 伪指令用于指定汇编程序的入口点。 4 ]: v* s7 ]9 E- b, ]2 |# a5 }
语法格式:
6 d) M) H6 A+ a/ Y$ p% [ ENTRY
9 T ]( G8 C3 ~5 @5 d 在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。 # [7 E9 e5 u+ t6 [) K: ^6 a/ G
使用示例:
$ D' Q0 J4 j, B AREA Init , CODE , READONLY % y# _1 N: Y- q5 Z1 e1 j* u% u! a6 Q$ C
ENTRY ;指定应用程序的入口点
I+ k; b( N j2 ]9 E …… ; b2 m7 K5 u! b$ d) o
4、 END
: H9 E7 A' p# q4 C( [: qEND 伪指令用于通知编译器已经到了源程序的结尾。 Q. r @5 C a; k
语法格式:
) G9 K6 j+ d- _ END
$ @7 ` Y$ n% t$ ~ 使用示例:
( ^! d& r7 n1 {# O A3 V. P AREA Init , CODE , READONLY
- W! _5 ^3 T# X0 r9 Y ……
\& g2 ]' D, ?9 ~. l# @1 X END ;指定应用程序的结尾
, i5 j" ] |/ L/ J3 y$ Q# Y- R. N$ z
4 z( f" h7 y- F& b( r, }9 J0 Y4 G o7 U9 j6 E6 t
5、 EQU: Z; [ I" j) h2 E
EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define 。
0 |( ^9 e7 B/ ?, F {0 G 语法格式:
5 L' m4 r5 J- y8 j% z 名称 EQU 表达式 { ,类型 } / A; Y% Q7 N; `- [* ^6 a2 B
其中 EQU 可用 “ * ” 代替。 ) J6 ~/ i. g$ v
名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型:
% r% X9 L& Y# [5 {% R; G- c, W CODE16 、 CODE32 和 DATA
5 m, T4 N4 N3 O4 }1 c* O) @* s4 D8 _7 Z% I- W, ?9 K
6、 EXPORT(或GLOBAL) : u L5 Y: w1 i6 b- k6 {: P. I
语法格式: 6 _$ ~8 a+ G% r b
EXPORT 标号 {[WEAK]} ( g. j: k2 w7 b+ N
EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用GLOBAL代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。
- y; j! z' J, e- P 使用示例: * C, T! |0 l- r4 K
AREA Init , CODE , READONLY
0 M' L& t8 ^. |& h3 E4 t EXPORT Stest ;声明一个可全局引用的标号Stest…… # X: A& _8 R8 R6 a3 C4 n
END
: I) M" N( W- J0 R; C) e# D, w. e u1 ?( r! s' f, M/ F
7、 IMPORT
- J% `0 m7 g5 v0 ]5 ~: w+ M% k J 语法格式: ! c" i7 L. W9 H* u0 c* J& x
IMPORT 标号 {[WEAK]}
. j6 K D) w) a# p% d$ p5 y IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
9 ]) s6 j' e: C* z6 D 标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B 或BL指令引用,则将B或BL指令置为 NOP 操作。 9 j, v/ X/ g! ^% }0 z( B3 e4 q
使用示例:
0 s& e1 P, j# \) ~4 C AREA Init , CODE , READONLY ! L$ \+ I4 O) i4 o* q
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义
q6 F2 f4 x( H8 C/ v# t' U, _4 S ……
1 j" Z5 I' D4 S! L& R END
! \& b f. H1 s! |
% [2 }7 c. }1 w. Q
$ l! U6 i1 X& }( J) B0 r' l8、 EXTERN
5 p2 t- J; {- c9 }5 S 语法格式:
7 }/ B. j( t( ]3 l EXTERN 标号 {[WEAK]}
( X$ Q( ]/ r% U5 y8 W* f EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。
% p B! |6 c1 y. g W9 T 使用示例: 1 T* K! v$ l% D
AREA Init , CODE , READONLY 5 q4 l) z! X; j; x! H4 e7 q' l
EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义……
( ~: e0 g' W+ d& P END % `8 B# _; |+ B" I
$ [6 `# [+ E7 U: Y: c
; C; {6 g! n4 x8 c) M# Z! O! I \$ v/ Q
9、 GET(或INCLUDE) 5 _+ W6 w, ]. m$ N/ O% _
语法格式:
6 ^% U! s7 c' U5 Q# K2 H GET 文件名 * q0 v1 N% \8 I+ G8 ]% K
GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。
$ ^2 O- E0 ^6 I5 Q- m3 a3 s 汇编程序中常用的方法是在某源文件中定义一些宏指令,用 EQU 定义常量的符号名称,用MAP和FIELD 定义结构化的数据类型,然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 “ include ” 相似。
/ G+ G7 ]& d! r6 `5 J' r GET 伪指令只能用于包含源文件,包含目标文件需要使用 INCBIN 伪指令
- W" m7 A1 \) y; K7 |, p4 B 使用示例: + b% E) q! i9 D3 w9 M; r
AREA Init , CODE , READONLY
( O& u7 h2 [% `) ]" \; J; ] GET a1.s ;通知编译器当前源文件包含源文件a1.s 1 [1 I; ]5 l( }& [
GE T C:\a2.s ;通知编译器当前源文件包含源文件C:\ a2.s ……
7 |3 |" ]) A. _# z3 _ END
" ]! ~: }3 r3 a& a- X, g; `- q) M/ q7 g. x* V1 o
" Y* R5 [# @6 e# f% l! d2 |
10、 INCBIN : j! h2 {; E& X
语法格式: , I% C* H0 q8 J' n& Z \0 }0 e
INCBIN 文件名
& ]7 ^9 A2 n0 \7 M/ k INCBIN 伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。 3 V; T2 ?* y* r$ e8 T2 E/ N
使用示例:
; l7 ~4 M# j+ Y5 P AREA Init , CODE , READONLY
% E4 D. T- L" O& ?5 R INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat 9 \- y8 U# D' u3 r o; t3 T
INCBIN C:\a2.txt ;通知编译器当前源文件包含文件C:\a2.txt……
, s( ^* i: g' C$ i6 Q0 u END 1 s9 \* T z: p( r
" C9 b, i7 O& B" i' q
$ T* y j; f; P$ F# X( d" Q+ y5 o
11、 RN * m' N+ R3 t" }3 [2 I% m, E% A
语法格式: - |, ^2 M/ k: S p& b3 q. }. _
名称 RN 表达式
3 ]8 s2 N/ Q$ l6 R, G( O) d' A RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。
e) a9 v+ ~ { 使用示例: ! K. W, }/ i! p& T/ t6 a0 ^ l" q5 a
Temp RN R0 ;将R0定义一个别名Temp + i9 n) M* [- a+ E# V, x$ S
$ G% {5 b; B& e: g$ G$ ^: ]
: [0 E: K8 Z- J. @5 V$ Q12、 ROUT
/ X, Z4 W; g. M* w( a 语法格式:
- K' f0 C& O1 e w! Y { 名称 } ROUT
& d9 Y# d) O6 o+ a, Y! C2 H ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ,而使用 ROUT 后,局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。) V+ _ }* f2 p" C/ b" Z1 }
否则,zero=0(跳到SuspendUp处执行)( K# z& Q: D+ i& {4 V3 b
|
|