|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、 AREA
: |; h5 N6 M+ \) oAREA 伪指令用于定义一个代码段或数据段。 . f: D4 X0 d; \ g6 ]
语法格式:
" k! \9 C! w7 U. d' O6 ^0 i AREA 段名 属性 1 ,属性 2 ,…… / y3 z/ W) v3 D
其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_test| 。 ) |9 L% V4 d% c- `$ v; j
属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下: : v$ x+ C2 t3 O& {
— CODE 属性:用于定义代码段,默认为 READONLY 。
8 a6 H% o6 T( D3 g— DATA 属性:用于定义数据段,默认为 READWRITE 。 0 l* O1 e, G2 _% i$ b- I" _
— READONLY 属性:指定本段为只读,代码段默认为 READONLY 。 5 ?; [9 O; {- x8 h1 C+ N
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE 。
# q! _' } T) e4 k: s— ALIGN 属性:使用方式为ALIGN表达式。在默认时, ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为 0 ~ 31 ,相应的对齐方式为表达式2次方。 ! C) Q5 _8 p9 G3 R5 F. {
— COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。 9 R5 h; a" l* J3 P) `
一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。 ; N. s( p* Q% y3 S% K- p3 H# v
使用示例:$ c/ c) `3 H T* B5 `! x
AREA Init , CODE , READONLY
' @9 ^/ D+ m- o& x' a 该伪指令定义了一个代码段,段名为 Init ,属性为只读3 H4 l' i" S/ E. u) [+ D
4 e& u( s0 N9 v e R: a8 Z1 j
! @. a- J8 v: J5 x2 U2、 ALIGN
# v/ P4 `3 ~! R0 AALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式 。 H4 u' `7 _* N$ S8 Y
语法格式:
& S Q9 x6 o/ x, i( [ ALIGN { 表达式 { ,偏移量 }}
- [, P5 j5 s. { 其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为: 2 的表达式次幂+偏移量。 . ~9 x, Z3 `5 g1 L2 h
使用示例: , v! s2 u: j- e# \2 D
AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令为8字节对齐。 指令序列
' Y9 B8 n) g2 r3 y% }+ ~% _ END
3 a v8 k$ T9 d* p- {. r( @
% g5 E- H) c9 z* E* A4 X/ g3、 ENTRY
. }! `9 @6 M6 W7 J/ N# I3 ~) QENTRY 伪指令用于指定汇编程序的入口点。 3 t% Q+ G8 u$ U" {4 ~, i' G
语法格式:
& t1 e$ O" f+ M1 Q ENTRY * H- e. N% |# z- L& \
在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
7 K- x6 y" R& H# E k 使用示例:
1 J5 a- m' o0 {& { AREA Init , CODE , READONLY
" v9 b1 {- C: G ENTRY ;指定应用程序的入口点
) Z$ d1 U" f1 k7 G; ~# U ……
- C! b' l0 O, e% h# _& t' R4、 END' x; b/ H' e1 ^. l
END 伪指令用于通知编译器已经到了源程序的结尾。 ; W; z7 J+ @7 j- D! e" [
语法格式:
8 k8 a% V$ \) R- r END 3 E" t7 r% y5 K9 d
使用示例: 5 f% S" j7 @5 i0 M4 z
AREA Init , CODE , READONLY
7 p1 @& o$ m& F, l: }$ t1 g# n0 ` …… ' Q4 G% {3 e% X
END ;指定应用程序的结尾
% N% a5 |& o9 B5 A/ h
: Z& \/ d! N' b. m* A6 P
' I3 z* Z8 d4 y R2 d1 }0 L- W5、 EQU( c6 E5 d3 g5 q! @# c* i
EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define 。 - _, b' e2 t/ ]+ o" X
语法格式: ( F+ q, s; R- O/ H+ [, H
名称 EQU 表达式 { ,类型 }
' v+ l; k7 t3 R p1 O2 `- G 其中 EQU 可用 “ * ” 代替。 % _ s; V K# _ R
名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型: ( v; N5 a" [) t4 I) g8 t
CODE16 、 CODE32 和 DATA 7 _0 F: w$ T. F
7 j/ \# x7 v$ p6、 EXPORT(或GLOBAL)
' ^2 t& {4 R7 P 语法格式:
" E) [0 P5 E' b. w6 O EXPORT 标号 {[WEAK]} ' z- T9 g1 T0 E
EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 EXPORT可用GLOBAL代替。标号在程序中区分大小写, [WEAK] 选项声明其他的同名标号优先于该标号被引用。 , c! O8 B# f( F' {( [# N
使用示例: h% k2 v$ s* P, I. ]
AREA Init , CODE , READONLY M2 Q- H: x- G6 Q- M
EXPORT Stest ;声明一个可全局引用的标号Stest……
( ^8 }# y3 d& U' E- p5 ? END
# k# q* k8 [4 d( ~
1 d! S2 B- u/ `6 d" \1 Z+ f7、 IMPORT ) G2 e0 u' o( P. e0 d
语法格式: 5 J! X- R" ]. I+ a, V$ w
IMPORT 标号 {[WEAK]} / _4 Q" @% K- E* i# l, y
IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
' ~. [: `' f4 m; y+ U# b& I 标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为B 或BL指令引用,则将B或BL指令置为 NOP 操作。 6 z% z Y4 ], |! B# h' u$ {. m
使用示例:
' y; q: c/ d! m: g+ @: e AREA Init , CODE , READONLY , |0 Y6 d2 q. a/ I+ Q: U* I1 V
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义
, k$ P/ |5 f1 b7 G ……
. }- t& d, F; X) ~) P' ]% W END 9 f+ H G( Z1 ~3 l
# L0 c6 h! W/ b
4 z: Y! p0 x8 b" J8、 EXTERN , q I; M" n1 v( g. q$ E5 D4 w& s
语法格式:
9 f. V4 E4 _# l EXTERN 标号 {[WEAK]} ; J( b R" u, A$ V$ K
EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为 0 ,若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。 ; u4 c) M3 @: d* j: V% b- _. h; A/ \
使用示例:
$ ~1 A* @- w D$ J# @, g, l. _ AREA Init , CODE , READONLY 7 d! c: _6 S# s/ t
EXTERN Main ;通知编译器当前文件要引用标号Main,但Main 在其他源文件中定义……
3 h: a' v1 _3 c4 T8 W END + K, ^; C: \- t2 e8 X* n( i
. W/ ?7 ?0 c( k) y' X
( V2 l0 a! Y. E0 d( f% [9、 GET(或INCLUDE)
2 P) U" Q4 Y7 ]6 h' E 语法格式: 3 m: j# x; z7 K
GET 文件名
5 n- ?0 n1 h) N+ [) L4 q GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。 ; c1 t8 i- c- h& @8 u$ G! O/ g- f7 h
汇编程序中常用的方法是在某源文件中定义一些宏指令,用 EQU 定义常量的符号名称,用MAP和FIELD 定义结构化的数据类型,然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 “ include ” 相似。 4 a: p( f5 P7 j! {- Z; A3 I
GET 伪指令只能用于包含源文件,包含目标文件需要使用 INCBIN 伪指令 , v7 P9 N G( H& g. Q' E+ G" M
使用示例: S$ }, W& P* [
AREA Init , CODE , READONLY
$ L& l/ \* a& g3 K GET a1.s ;通知编译器当前源文件包含源文件a1.s 2 b+ J& _2 \* I- u* s# D1 I1 F
GE T C:\a2.s ;通知编译器当前源文件包含源文件C:\ a2.s …… ' `* R' @- _- i; n$ ? y
END ; K% n1 H2 N" C0 Z, a
" G1 j/ Z$ V* Z5 r1 ]; }
/ C* w n9 `& \10、 INCBIN 4 I% C: a4 ~' [. z% l6 I! r. y1 [
语法格式:
, t' z Q3 ?- Z: U INCBIN 文件名
: h% A( G1 G5 O, i! ?5 y: l/ ^) I4 ` INCBIN 伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。
- t2 h& M+ r/ ~. S1 s 使用示例:
! f! C9 G. C1 c; }% F: b/ t AREA Init , CODE , READONLY
" n/ t; u' H: s0 s# u" I INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat 5 e' m5 s) g% |
INCBIN C:\a2.txt ;通知编译器当前源文件包含文件C:\a2.txt……
+ Z% G- ^- `6 y& n( K END
1 w0 r% X( V' D+ A3 w. J7 X( y
) y2 [8 L+ p _3 q' A0 m, h% I/ P
+ @1 d$ b0 V9 u' X) M0 P g" c11、 RN
! k& C2 L( V2 n- J8 L) u o 语法格式:
; I- _, A1 @3 @* ^7 n 名称 RN 表达式
9 n* D4 B% C1 |& r$ k c RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。 $ {9 G: z2 ^8 Q* b8 X
使用示例:
4 m( i( {; C% z8 ]. S Temp RN R0 ;将R0定义一个别名Temp ; K7 X, ^" z+ w- H9 M% w. f
( `0 M) l: ~ W% K( \6 Z/ Z, g0 A+ P3 o9 g$ ^; y! |
12、 ROUT $ o$ z0 d4 ?3 C& Q# m8 V( ?
语法格式:
/ H$ w' `, E! U/ v. O U) {3 i { 名称 } ROUT
# r; ?5 N9 Q8 x4 b$ | P% h6 X ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的 AREA ,而使用 ROUT 后,局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。
" `( ]0 \0 K/ F 否则,zero=0(跳到SuspendUp处执行)
" _ [' {/ Q5 t1 c, T( D) V. l; @ |
|