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

介绍12个ARM常用的伪指令

[复制链接]

该用户从未签到

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

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
  • 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 19:47 , Processed in 0.203125 second(s), 24 queries , Gzip On.

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

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

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