|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、 AREA
3 Z3 ? Y1 L0 r& YAREA 伪指令用于定义一个代码段或数据段。 ( q8 U* g6 g' L" k3 A3 Z
语法格式: 8 X$ _, I& Q+ `3 V9 J7 g
AREA 段名 属性 1 ,属性 2 ,…… 6 L, X7 e+ N( L Z
其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。 a3 ?& D$ N( s. ]5 Z" d
属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下: 1 |! a" M- Q8 w2 w
— CODE 属性:用于定义代码段,默认为 READONLY 。 3 F; x* `" S ?
— DATA 属性:用于定义数据段,默认为 READWRITE 。
2 T: W9 V+ a; V& s2 X' I— READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 9 v2 G6 r- ^- c! U1 d! V
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。
, f9 V% c( Y1 {' u— ALIGN 属性:使用方式为ALIGN表达式。在默认时, ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~ 31 ,相应的对齐方式为表达式2次方。
$ J3 H# r% n0 t& y; W— COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。 G" W& d/ A5 x5 ^ L6 q
一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。 - n. _, i& `# L/ c2 t
使用示例:
! f+ o! s5 B+ E% M* KAREA Init , CODE , READONLY
7 I, M- {" e% q |0 W' O 该伪指令定义了一个代码段,段名为 Init ,属性为只读0 C; a: N! }: b8 i( w/ [( T4 A" v
- @6 E9 x) S8 A. i& S; Q+ t# n
& N, w/ K& Q% W3 h5 r" ?2、 ALIGN + c2 V& U# q& D: D$ L
ALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式 。
$ K9 U5 ?" m+ ^6 G- H' V! ~ d 语法格式: 2 ?% O: o8 A( G- e3 U' V+ a, j
ALIGN { 表达式 { ,偏移量 }} B- V8 g3 o" E; Z/ W
其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为: 2 的表达式次幂+偏移量。 1 ]% }* R( O+ e$ b" J
使用示例:
& {' q' C; S7 p" ? AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令为8字节对齐。 指令序列
9 ^0 w# s. v0 L: X END ' _) p7 e' g" U6 \, d: q2 j% X
/ s, P/ [* \4 S! K6 c9 i7 |$ \& f
3、 ENTRY
# y3 _' \. @: ] j. ]0 bENTRY 伪指令用于指定汇编程序的入口点。 4 A7 S k4 e: p- o7 M8 g) S
语法格式:
! P5 U4 n* G" V( |# G ENTRY
% t& x! I$ }! r! o 在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
1 w9 e: [( Q: h/ ~; J) M, | 使用示例:
, v0 C# f& ^& i! K8 E5 z! o AREA Init , CODE , READONLY
: ~! W$ p; p7 C! R- d' ^9 A ENTRY ;指定应用程序的入口点 , u, n' Y* M7 m6 W4 R
……
! |9 \( R& N- H# H7 f/ x. \* F4、 END
3 p3 u2 O5 U) a1 m, @$ }+ y% pEND 伪指令用于通知编译器已经到了源程序的结尾。 3 F6 a1 X, O0 @& D( d9 |
语法格式:
! _ a% y1 y9 ?) O' Z$ N3 J& H END
* w& H, M# I! b9 q 使用示例: 1 r# _' f% ] I1 X% i+ p; ^! `! V
AREA Init , CODE , READONLY
4 U" g6 a- S. w5 `5 d5 j ……
. l5 l8 k% D$ f* m) c END ;指定应用程序的结尾
# F' u w& @& @8 `3 G% g" a
1 R8 Z# \3 L- k' l" s& E1 }% p5 F7 Z# A
5、 EQU: ]& S- m8 F+ x8 L% K( G
EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define 。
3 y# j! e& t" \ 语法格式:
$ j0 V3 i$ g7 V2 c7 N0 B 名称 EQU 表达式 { ,类型 }
2 A7 V$ n: |/ X! o 其中 EQU 可用 “ * ” 代替。 ( p$ {' a* F8 y* b- v" n& {8 T
名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型: 2 E# p7 }, y: e1 s3 z9 f
CODE16 、 CODE32 和 DATA 2 u1 J& ^8 H9 q/ a: l
: A8 C$ Q ~0 l4 a$ t# G- z
6、 EXPORT(或GLOBAL)
1 Y7 y- t1 u, U 语法格式: ' Q* V( |; }; G( U# I8 C
EXPORT 标号 {[WEAK]}
- O, h9 l! M f: g* K Z3 P# R& L EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用GLOBAL代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。
0 Y, R/ Q2 W' N( `, _2 g5 E2 [ 使用示例:
$ `* i5 m/ e1 D! q AREA Init , CODE , READONLY
. d# {! V3 c' Q R7 p' o EXPORT Stest ;声明一个可全局引用的标号Stest……
! a, E/ x/ T* Y- N0 j END , D/ @& M) H! ~" r3 i
/ F- q( }! S% ^' `, a7、 IMPORT ; H5 y) O4 @ |! C" W
语法格式:
! ?/ @9 _2 E, N8 b2 x9 e" a IMPORT 标号 {[WEAK]}
' q! T9 N \! E2 K9 J IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。 - Q: l. ]) b5 O$ ~; H( l, o( H
标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B 或BL指令引用,则将B或BL指令置为 NOP 操作。 / T8 `' R& _; B( S# I$ G* w
使用示例: : q$ g3 ^' {1 S
AREA Init , CODE , READONLY ! v, t. L1 n/ R# K. W, F
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义7 ]# i1 M8 l. E; M8 k: L
……
* ?/ z# L! O# L6 u3 A END
8 p% q( }. ^4 z+ A' M7 V3 r A$ ?# F9 S8 \$ c8 e5 Q
' E- R$ y$ l8 h0 o) u8、 EXTERN % A9 A( h: [+ V! L, d6 ^& A
语法格式:
8 Z; n& i! n) }' {; P- o EXTERN 标号 {[WEAK]}
0 h6 o% i0 Y8 d& O' L, q EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。
0 P. ~3 ^& x% v& u 使用示例:
1 z0 V7 x% Y) R- y AREA Init , CODE , READONLY
: u. h' g. B; X( ^" `5 \ EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义…… $ P. G2 }( n1 D) ]; Q
END 4 L5 F9 d6 {: F4 V g
: K" S* F9 }$ n5 C$ R: e9 x# f4 s4 {& @5 J3 l
9、 GET(或INCLUDE)
) M9 H; \7 _3 g* [( J) V 语法格式: 6 u( d: R: W. f8 \% B% s9 W3 `
GET 文件名
; I1 P' }0 J k" y. z0 Q GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。 1 M. K& u1 B; [3 n" J
汇编程序中常用的方法是在某源文件中定义一些宏指令,用 EQU 定义常量的符号名称,用MAP和FIELD 定义结构化的数据类型,然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 “ include ” 相似。 ; T' d: i4 V% o
GET 伪指令只能用于包含源文件,包含目标文件需要使用 INCBIN 伪指令 0 ?& b$ D \4 d0 s
使用示例: * Q) x) N; V8 b/ S9 x
AREA Init , CODE , READONLY 8 \1 ^- F$ @. [( K
GET a1.s ;通知编译器当前源文件包含源文件a1.s
0 y) H& v( v, h" @( h U4 G7 I5 f GE T C:\a2.s ;通知编译器当前源文件包含源文件C:\ a2.s ……
& h& ~2 |/ s+ e END
# s1 N8 F# ~+ c7 b& T
1 _# T2 h5 o) S2 u/ k+ A! u2 f4 [5 k/ }. _3 R
10、 INCBIN
+ v B* T: c/ W/ y7 I 语法格式: . r1 ~% n r! }! \+ n
INCBIN 文件名 # p, Q: a! F) _4 M& c* w
INCBIN 伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。
/ ]/ w! S. |$ Z& y* `0 R 使用示例:
3 j# X6 r5 L: f" \9 y* { AREA Init , CODE , READONLY ) \3 U3 }. c/ D
INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat
! _8 J0 Z. x# Y2 |8 ]+ u0 x' V' o INCBIN C:\a2.txt ;通知编译器当前源文件包含文件C:\a2.txt…… - n3 |/ s! ?' r6 e$ C6 P' @1 E7 _" r
END
Q& i- z% D9 {, P0 I
0 V/ |% ]/ C. j9 S7 U0 z
$ R0 W, W6 a, |1 a11、 RN
M5 W, s' U7 D1 L* @( }. u# t3 j) ]5 _ 语法格式: 3 e5 R" W2 ~. b5 K( j
名称 RN 表达式
# t; l1 y+ a* a: G9 ^& v2 V RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。
% q& z: ]) q; y2 W. U/ c* d 使用示例: # n, o9 D3 S$ s- ?( B
Temp RN R0 ;将R0定义一个别名Temp / G- G [! r. W. @2 T
+ x. Q3 D, Y) ^5 \5 p4 n9 q$ f
9 [* \1 ?7 f8 R- G
12、 ROUT
, M6 \2 s% }* J6 N# I! `0 M2 c0 ]& Z 语法格式: ! ]& ~/ v* R' b" _9 S
{ 名称 } ROUT $ |# N* M+ l* N7 e' n Z, y3 X
ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ,而使用 ROUT 后,局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。
* X& B# p$ W8 V" Z 否则,zero=0(跳到SuspendUp处执行)8 U* f' C+ ?, M8 E, T7 e
|
|