EDA365电子论坛网

标题: 超级实用的ARM 汇编指令集(续) [打印本页]

作者: mytomorrow    时间: 2019-9-16 17:51
标题: 超级实用的ARM 汇编指令集(续)

ARM汇编指令之伪指令介绍。

ARM汇编伪指令

       在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。     

     在ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。


; ~+ A) p0 K  z: x. q2 W

一、符号定义(Symbol Definition)伪指令   

符号定义伪指令用于定义ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。   

常见的符号定义伪指令有如下几种:    . M" W( ^( V  g4 V
    — 用于定义全局变量的GBLA 、GBLL 和GBLS 。   
( u0 U& r0 d8 m    — 用于定义局部变量的LCLA 、LCLL 和LCLS 。    3 ^" M7 F+ B  ?6 d
    — 用于对变量赋值的SETA 、SETL 、SETS 。    - C! u. F1 t' M- s
    — 为通用寄存器列表定义名称的RLIST 。   

1、GBLA、GBLL 和GBLS   

语法格式:    6 O9 {5 Q) j/ m. ^% C# }/ A
    GBLA (GBLL 或GBLS )全局变量名    # s9 g4 q/ M$ \  g2 E
    GBLA 、GBLL 和GBLS 伪指令用于定义一个ARM 程序中的全局变量,并将其初始化。其中:   
' l% n) k: F) g8 Z0 s    GBLA 伪指令用于定义一个全局的数字变量,并初始化为0 ;      c$ u+ ^. A; c: |
    GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为F(假);   
8 P) r5 G8 {3 o2 L    GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空;    % ]# `; m4 u) x/ B
    由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。   

使用示例:   

    GBLA Test1 ;           定义一个全局的数字变量,变量名为 Test1。   
* ?0 s5 b" Q, r* ~    Test1 SETA 0xaa ;   将该变量赋值为0xaa。    3 r4 u7 }: G4 j* g" i0 K
    GBLL Test2 ;            定义一个全局的逻辑变量,变量名为 Test2。   
6 _0 R/ z6 @2 v    Test2 SETL {TRUE} ;将该变量赋值为真。   
$ U; `3 l: \% g5 W- K1 M    GBLS Test3 ;             定义一个全局的字符串变量,变量名为 Test3。   
9 s, t- v) K4 H" z9 W" F# `" S    Test3 SETS “Testing” ;将该变量赋值为"Testing”。  

2 B- b6 G# E3 o2 Y7 e

2、LCLA、LCLL 和LCLS   

语法格式:    ! C7 g- O' F, i. r6 a( ?
    LCLA (LCLL 或 LCLS )局部变量名   
! v9 x! X1 Z0 V) @- `* A# `( `    LCLA 、LCLL 和LCLS 伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。其中:    4 }8 u1 Z5 C* Y9 H
    LCLA伪指令用于定义一个局部的数字变量,并初始化为0 ;   
5 |5 e$ R, J- l( `( ~    LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);   
+ A0 H4 o6 K% t    LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;   
. A2 J1 U- |" d1 a    以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。   

使用示例:   

    LCLA Test4 ;            声明一个局部的数字变 量,变量名为Test4。  
4 ^, _* G- C1 j9 n; Q/ i    Test3 SETA 0xaa ;   将该变量赋值为0xaa。   " E- o4 y7 y. S. m* g
   LCLL Test5 ;             声明一个局部的逻辑变 量,变量名为Test5。    : r) a. K6 m  y; c
    Test4 SETL {TRUE} ;将该变量赋值为真。   
# V; {; T2 y/ G8 R* L- f* ~    LCLS Test6 ;             定义一个局部的字 符串变量,变量名为Test6。   
( d6 E' p) o' \! c( L    Test6 SETS “Testing” ;将该变量赋值为 "Testing”。   


) E% X4 ?8 a$ F! f( o; f, Y$ Z

3、SETA、SETL 和SETS   

语法格式:   
& e! `8 f- o5 p* u    变量名 SETA (SETL 或 SETS )表达式   
- c9 A+ d+ N! K( y/ L    伪指令 SETA 、SETL 、SETS 用于给一个已经定义的全局变量或局部变量赋值。   
" l3 X2 O% N8 j& ^    SETA伪指令用于给一个数学变量赋值;    1 r+ p( Q8 K3 ?& z' u
    SETL伪指令用于给一个逻辑变量赋值;    : r2 \) F4 J% k' C) h
    SETS伪指令用于给一个字符串变量赋值;    - F  D; u/ F# U* W% t) m; ?  u! }- x
    其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。   

使用示例:   
  I, t' r" z: O- b    LCLA Test3 ;             声明一个局部的数字变量,变量名为 Test3。      U6 k- x5 T3 ^
    Test3 SETA 0xaa ;    将该变量赋值为0xaa。    2 t1 x/ x$ T. D2 T8 E2 H% F1 h" ]
    LCLL Test4 ;             声明一个局部的逻辑变量,变量名为 Test4。   
& C6 @! m# M% H0 v- {& k    Test4 SETL {TRUE} ;将该变量赋值为真。   


% X% y. y& i9 ]6 N1 U/ G) G& j7 `

4 、RLIST   

语法格式:    3 F5 c, K: ~2 S( I& H/ D9 E
    名称 RLIST { 寄存器列表 }   

RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM 指令 LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。   

使用示例:    - Z+ ~8 f" m  ^, s
    RegList RLIST {R0-R5 ,R8 ,R10} ;将寄存器列表名称定义为 RegList ,可在ARM指令LDM/STM中通过该名称访问寄存器列表。  

4 l+ e7 t. G3 P9 s% U- S

二、数据定义(Data Definition)伪指令   

! v" I. o% c' K: c* ^: F

" e1 o' U! J3 h- W: Y7 w

作者: fanichicl    时间: 2019-9-17 20:59
谢谢楼主分享的实用的ARM 汇编指令集。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2