EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM汇编指令之伪指令介绍。 ARM汇编伪指令 在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。 在ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。 * a! R( J* D/ t5 g7 F8 ~
一、符号定义(Symbol Definition)伪指令 符号定义伪指令用于定义ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。 常见的符号定义伪指令有如下几种: $ R, x- R/ i; a7 V8 b
— 用于定义全局变量的GBLA 、GBLL 和GBLS 。
7 }/ B6 Y: q0 k1 u' \: d — 用于定义局部变量的LCLA 、LCLL 和LCLS 。 $ ]; Y& h' e6 U
— 用于对变量赋值的SETA 、SETL 、SETS 。 ) I. E8 h; O: E6 M' | ~2 O
— 为通用寄存器列表定义名称的RLIST 。 1、GBLA、GBLL 和GBLS 语法格式:
) |$ u W+ R- G1 t0 R& H9 V GBLA (GBLL 或GBLS )全局变量名
3 `" m% o d p7 s# e8 m0 g GBLA 、GBLL 和GBLS 伪指令用于定义一个ARM 程序中的全局变量,并将其初始化。其中:
- J8 z1 K- \% ]8 _6 {9 _ GBLA 伪指令用于定义一个全局的数字变量,并初始化为0 ;
+ V5 [! B8 s4 [1 V ?* r3 ~ GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为F(假); 5 e# ~! F& B' v! N5 C
GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空;
; O; ?1 P) p- g$ m0 s 由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。 使用示例: GBLA Test1 ; 定义一个全局的数字变量,变量名为 Test1。 5 b0 Q# v# F9 M$ H) L1 |& @& Z3 L8 s
Test1 SETA 0xaa ; 将该变量赋值为0xaa。
6 V- Y( S$ C: v7 ^! Z/ x GBLL Test2 ; 定义一个全局的逻辑变量,变量名为 Test2。 - s0 g ^" w0 H1 L3 d0 w! ?/ ~: H. q
Test2 SETL {TRUE} ;将该变量赋值为真。 ( z5 h% I7 u/ N9 z) I$ N2 u; \
GBLS Test3 ; 定义一个全局的字符串变量,变量名为 Test3。
0 w& q' A6 ~! f Test3 SETS “Testing” ;将该变量赋值为"Testing”。 1 q1 y7 w- W R" c% h/ b c T
2、LCLA、LCLL 和LCLS 语法格式: 5 z S& o8 V1 V. Q) J
LCLA (LCLL 或 LCLS )局部变量名
1 d* J" m. P+ T3 `6 h2 [ U LCLA 、LCLL 和LCLS 伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。其中:
" a+ F5 O+ m( g5 m* | LCLA伪指令用于定义一个局部的数字变量,并初始化为0 ; & o" f0 N; f' g( k+ ~9 m
LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);
, }9 ^$ V# D/ }9 i. W% i LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;
' I7 t1 H$ G) u3 r 以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。 使用示例: LCLA Test4 ; 声明一个局部的数字变 量,变量名为Test4。
/ j; X- z$ A3 w+ T, h8 K4 v Test3 SETA 0xaa ; 将该变量赋值为0xaa。
. A; P+ A4 S: y( P! @& e: H LCLL Test5 ; 声明一个局部的逻辑变 量,变量名为Test5。 3 S! E) g! F5 S1 }, r& ?. R
Test4 SETL {TRUE} ;将该变量赋值为真。 + Y" B1 w6 ^. M% v
LCLS Test6 ; 定义一个局部的字 符串变量,变量名为Test6。 5 E& M( V. o) I0 j9 P! Y
Test6 SETS “Testing” ;将该变量赋值为 "Testing”。
# J6 Q Y" M; h+ d% @. V0 E8 ~" @) z3、SETA、SETL 和SETS 语法格式: " @+ q5 V P8 I& {3 l, K- J
变量名 SETA (SETL 或 SETS )表达式 T3 S! u3 n3 s, X
伪指令 SETA 、SETL 、SETS 用于给一个已经定义的全局变量或局部变量赋值。 5 s4 f; t9 r. Y! Q6 i
SETA伪指令用于给一个数学变量赋值; 7 _+ M. F' }2 f a
SETL伪指令用于给一个逻辑变量赋值; : N: s8 `& K* J1 ]: y
SETS伪指令用于给一个字符串变量赋值;
" Z* Z+ f& S0 ]8 s+ m" ?0 C 其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。 使用示例: $ L/ ^: U% X" i# ]" @4 E- w
LCLA Test3 ; 声明一个局部的数字变量,变量名为 Test3。
" h% P4 \& S" e! O% m& M- { Test3 SETA 0xaa ; 将该变量赋值为0xaa。
" Z. L8 p( K4 x# t& h LCLL Test4 ; 声明一个局部的逻辑变量,变量名为 Test4。 $ T' @2 n3 @* R) _6 v: j+ T. | C
Test4 SETL {TRUE} ;将该变量赋值为真。 ! E$ Q, ]$ [0 t; ?# K5 I$ {( D f
4 、RLIST 语法格式: ( O3 x9 v% C2 p, ^: X
名称 RLIST { 寄存器列表 } RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM 指令 LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。 使用示例: & T: V& @; l* ~- ~' E8 d
RegList RLIST {R0-R5 ,R8 ,R10} ;将寄存器列表名称定义为 RegList ,可在ARM指令LDM/STM中通过该名称访问寄存器列表。 & u0 d- I/ u0 J4 G$ d8 B
二、数据定义(Data Definition)伪指令
% L% H' v$ ^* v5 }% q" b, D8 U* o 6 K2 U& \9 H u) W( v
|