linux 汇编 preserve8,ARM汇编伪指令

分类: LINUX

2009-10-21 16:39:09

ARM 汇编程序的由机器指令,伪指令和宏指令组成。伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理。在前面的指令集章节中,我们已经接触了几条常用到的伪指令,如ADR 、ADRL、LDR、NOP 等,把它们和指令集一起介绍是因为它们在汇编时会被合适的机器指令代替,实现真正机器指令操作。宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。

当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。

A.4.1  符号定义伪指令

符号定义伪指令用于定义ARM 汇编程序的变量,对变量进行赋值以及定义寄存器名称,该类伪指令如下:

全局变量声明:GBLA、GBLL 和GBLS。

局部变量声明:LCLA、LCLL 和LCLS。

变量赋值: SETA、SETL 和SETS。

为一个通用寄存器列表定义名称:RLIST。

为一个协处理器的寄存器定义名称:CN。

为一个协处理定义名称: CP。

为一个VFP 寄存器定义名称:DN 和SN。

为一个FPA 浮点寄存器定义名称:FN。

GBLA、GBLL、GBLS

全局变量声明伪指令。

GBLA 伪指令用于声明一个全局的算术变量,并将其初始化为0。

GBLL 伪指令用于声明一个全局的逻辑变量,并将其初始化为{FALSE}。

GBLS 伪指令用于声明一个全局的字符串变量,并将其初始化为空字符串“”。

伪指令格式:

GBLA variable

GBLL variable

GBLS variable

其中:variable 定义的全局变量名,在其作用范围内必须惟一。全局变量的作用范围为包含该变量的源程序。

伪指令应用举例如下:

GBLL codedbg ;声明一个全局逻辑变量

codebg SETL {TRUE} ;设置变量为{TRUE}

LCLA、LCLL、LCLS

局部变量声明伪指令,用于宏定义的体中。

LCLA 伪指令用于声明一个局部的算术变量,并将其初始化为0。

LCLL 伪指令用于声明一个局部的逻辑变量,并将其初始化为{FALSE}。

LCLS 伪指令用于声明一个局部的字符串变量,并将其初始化为空字符串“”。

伪指令格式:

LCLA variable

LCLL variable

LCLS variable

其中:variable 定义的局部变量名。在其作用范围内必须惟一。局部变量的作用范围为包含该局部变量只能在宏中进行声明及使用。

伪指令应用举例如下:

MACRO ;声明一个宏

SENDDAT $dat ;宏的原型

LCLA bitno ;声明一个局部算术变量

bitno SETA 8 ;设置变量值为8

MEND

SETA、SETL、SETS

变量赋值伪指令。用于对已定义的全局变量,局部变量赋值。

SETA 伪指令用于给一个全局/局部的算术变量赋值。

SETL 伪指令用于给一个全局/局部的逻辑变量赋值。

SETS 伪指令用于给一个全局/局部的字符串变量赋值。

伪指令格式:

variable_a SETA expr_a

variable_l SETL expr_l

variable_s SETS expr_s

其中:variable_a 算术变量。用GBLA、LCLA 伪指令定义的变量。

expr_a 赋值的常数。

variable_l 逻辑变量。用GBLL、LCLL 伪指令定义的变量。

expr_l 逻辑值,即{TRUE}或{FALSE}。

variable_s 字符串变量。用GBLS、LCLS 伪指令定义的变量。

expr_s 赋值的字符串。

伪指令应用举例如下:

GBLS ErrStr

ErrStr SETS “No,semaphone”

RLIST

RLIST 为一个通用寄存器列表定义名称。伪指令格式如下:

name RLIST {reglist}

其中:name 要定义的寄存器列表的名称。

reglist 通用寄存器列表。

伪指令应用举例如下:

LoReg RLIST {R0-R7} ;定义寄存器列表LoReg

STMFD SP!,LoReg ;保存寄存器列表LoReg

CN

CN 为一个协处理器的寄存器定义名称。

伪指令格式:

name CN expr

其中:name 要定义的协处理器的寄存器名称。

expr 协处理器的寄存器编号,数值范围为0~15。

伪指令应用举例如下:

MemSet CN l ;将协处理的寄存器l 名称定义为MemSet

CP

CP 为一个协处理器定义的名称。

伪指令格式:

name CP expr

其中:name 要定义的协处理器名称。

expr 协处理器的编号,数值范围为0~15。

伪指令应用举例如下:

DivRun CN 5 ;将协处理器5 名称定义为DivRun

DN、SN

DN 和SN 为VFP 的寄存器的名称定义的伪指令。

DN 为一个双精度原VFP 寄存器定义名称。

SN 为一个单精度的VFP 寄存器定义名称。

伪指令格式:

name DN expr

name SN expr

其中:name 要定义的VFP 寄存器名称。

expr 双精度的VFP 寄存器编号为0~15,单精度的VFP 寄存器编号为0~31。

伪指令应用举例如下:

cdn DN 1 ;将VFP 双精度寄存器1 名称定义为cdn

rex SN 3 ;将VFP 单精度寄存器3 名称定义为rex

FN

FN 为一个FPA 浮点寄存器定义名称

伪指令格式:

name FN expr

其中:name 要定义的浮点寄存器名称。

expr 浮点寄存器的编号,值为0~7。

伪指令应用举例如下:

ibq FN l ;将浮点寄存器l 名称定义为ibq

A.4.2  数据定义伪指令

数据定义伪指令用于数据表定义,文字池定义,数据空间分配等。该类伪指令如下:

声明一个文字池:LTORG。

定义一个结构化的内存表的首地址:MAP。

定义结构化内存表中的一个数据域:FIELD。

分配一块内存空间,并用0 初始化:SPACE。

分配一段字节的内存单元,并用指定的数据初始化:DCB。

分配一段字的内存单元,并用指令的数据初始化:DCD 和DCDU。

分配一段字的内存单元,将每个单元的内容初始化为该单元相对于静态基址寄存器的偏移量:DCDO。

分配一段双字的内存单元,并用双精度的浮点数据初始化:DCFD 和DCFDU。

分配一段字的内存单元,并用单精度的浮点数据初始化:DCFS 和DCFSU。

分配一段字的内存单元,并用单精度的浮点数据初始化,指定内存单元存放的是代码,而不是数据:DCI。

分配一段双字的内存单元,并用64 位整数数据初始化:DCQ 和DCQU。

分配一段半字的内存单元,并用指定

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值