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

介绍12个ARM常用的伪指令

[复制链接]

该用户从未签到

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

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; @
  • 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 21:32 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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