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

介绍12个ARM常用的伪指令

[复制链接]

该用户从未签到

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

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
  • 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:09 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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