找回密码
 注册
关于网站域名变更的通知
查看: 361|回复: 1
打印 上一主题 下一主题

介绍12个ARM常用的伪指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-13 15:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2020-11-13 16:11 | 只看该作者
    我都用过,哈哈
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 22:29 , Processed in 0.171875 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表