linux汇编 数据定义命令,常用 arm 汇编指令

ARM编译器一般都支持汇编语言的程序设计和C/C++语言的程序设计,以及两者的混合编程

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

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

数据定义(Data Definition)伪指令

DCD(DCDU) 用于分配一片连续的字存储单元并用指定的数据初始化。

其他常用的伪指令

EQU

用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。

AREA

语法格式:

AREA 段名 属性1,属性2,……

AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:

EXTERN

用于通知编译器要使用的标号在其他的源文件中定义

SPACE

伪指令用于分配一片连续的存储区域并初始化为0

DataSpace SPACE 100 ;分配连续100字节的存储单元并初始化为0。

SUBS 减法指令

例如:SUBS R0,R0,#0x20

意思为 R0 = R0 - 20;

STM 批量数据加载/存储指令

STM     R0, {R4-R11}将R4至R11寄存器保存在此进程的R0堆栈中

STR指令

STR指令的格式为:

STR{条件} 源寄存器,

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。

指令示例:

STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。

STRB指令

STRB指令的格式为:

STR{条件}B 源寄存器,

STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。

指令示例:

STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

LDR

LDR指令的格式为:LDR{条件} 目的寄存器,,

LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。

该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。

当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。

指令示例:

LDR R0,[R1]                ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2]       ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8]        ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1,R2] !    ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,#8] !   ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDR R0,[R1],R2        ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR R0,[R1],R2,LSL#2      ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRB

LDRB指令的格式为:

LDR{条件}B 目的寄存器,

LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。

该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。

当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

指令示例:

LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。

LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

BLX指令

BLX指令的格式为:BLX 目标地址

BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,

该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,

可以通过BLX指令实现子程序的调用和处理器工作状态的切换。

同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。

MSR 将操作数的内容传送到程序状态寄存器的特定域中

MSR指令的格式为:

MSR{条件} 程序状态寄存器(CPSR或SPSR)_,操作数

MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:

位[31:24]为条件位域,用f表示;

位[23:16]为状态位域,用s表示;

位[15:8] 为扩展位域,用x表示;

位[7:0] 为控制位域,用c表示;

该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。

指令示例:

MSR CPSR,R0 ;传送R0的内容到CPSR

MSR SPSR,R0 ;传送R0的内容到SPSR

MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

ORR 逻辑位或

ORR指令的格式为:

ORR{条件}{S} 目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。

指令示例:

ORR R0,R0,#3 ;该指令设置R0的0、1位,其余位保持不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值