ARM汇编指令集

ARM汇编文件的组成

  1. 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作
  2. 伪指令:在编译时替换成能被识别的ARM指令
  3. 伪操作:知道编译器进行编译,编译完成后不生成指令,也不占用内存空间。

ARM汇编指令类型

  1. 数据处理指令
  2. 跳转指令:实现程序执行过程中的跳转
  3. Load/Store指令:CPU与内存数据之间的操作指令
  4. 状态寄存器存送指令:对状态寄存器操作(只能使用这些指令对状态寄存器操作)
  5. 协处理器指令:对协处理器进行操作
  6. 异常产生指令:产生异常(软中断),实现模式切换

数据处理指令 mov,add,adds,adc,sub,subs,sbc,rsb,mul,and,orr,eor,bic,cmp,tst,teq,lsl,lsr,asr,rorv

数据处理指令语法

<操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>
<操作码> <目标寄存器Rd> <第一操作寄存器Rn> <第二操作数Operand2>
;第一个位置必须是寄存器,第二操作数可以是寄存器,也可以是立即数

数据传送指令  MOV

mov r1, #0x1  ;r1 = 0x1    0x1 是立即数
mov r2, r1  ;r2 = r1
mvn r3, r2  ;r3 = ~r2
mov r1, 0xffffff00  ;0xffffff00 不是立即数,只是编译器在编译阶段对其进行了替换
mvn r1, 0x000000ff  ;替换的指令 ;一条数据传送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留给立即数使用,因此立即数自包含2^12个
;一个立即数由 bits[8:0]循环右移 2 * bits[11:9]得到。(一个八位的数循环右移偶数次得到)
;立即数的本质是包含于指令中的数,占用指令本身的空间

加法指令 ADD

;加法指令执行时,若没有进位 CPSR 'C' 位置 0
mov r0, #
mov r1, #
add r2, r1, r0  ;r2 = r1 + r0
add r2, r1, #  ;r2 = r1 + 2

 数据操作对CPSR的影响 

;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
mov r1, #mov r2, #-
adds r3, r1, r2 

带进位的加法指令 ADC

;两个64位数相加,第一个64位的低32位放在 r0,高位放到 r1,第二个64位数的低32位放在 r2 高32位放在 r3
;编写代码实现两个64位数的和,结果的低32位放在 r4 高32位放在 r5
mov r0, #0xfffffffe  ;第一个数的低32位
mov r1, #  ;第一个数的高32位
mov r2, #0x5  ;第二个数的低32位 
mov r3, #  ;第二个数的高32位
adds r4, r0, r2
adc r5, r1, r3  ; adc运算的实质是 r5 = r1 + r3 + 'C'  'C'位 CPSR 进位标志

减法指令 SUB

;减法指令执行时,没有借位时 CPSR 'C' 位置 1
mov r0, #
mov r1, #
sub r2, r0, r1  ;r2 = r0 - r1

带借位的减法指令 SBC

mov r0, #  ;第一个数的低32位
mov r1, #  ;第一个数的高32位
mov r2, #  ;第二个数的低32位
mov r3, #  ;第二个输的高32位
subs r4, r0, r2  
sbc r5, r1, r3

逆向减法指令 RSB

mov r0, #
rsb r1, r0, #  ;r1 = 5 - r0

乘法指令 MUL

;为了提高效率,任何乘法指令不可以使用立即数
mov r0, #
mov r1, #
mov r2, r0, r1  ;r2 = r0 * r1

乘——累加指令 MLA

mla r3 ,r0, r1, r2  ;r3 = (r0 * r1) + r2

逻辑与指令 AND

mov r0, #0xf0
mov r1, #0x0f
and r2, r0, r1  ;r2 = r0 & r1

逻辑或指令 ORR

mov r0, #0xf0
mov r1, #0x0f
orr r2, r0, r1  ;r2 = r0 | r1

逻辑异或运算指令 EOR

mov r0, #0xf0
mov r1, #0x0f
eor r2, r0, r1  ;r2 = r0 ^ r1

位清零指令 BIC

mov r0, #0xff
bic r0, r0, #0xf  ;第二个操作数的每一位为 1 就把第一个操作数对应的位清零

比较指令 CMP

;实质是一条减法指令
;没有目标register,用来比较两个数是否相等,结果放到 CPSR 的 'Z' 位判断
mov r0, #
mov r1, #
cmp r0, r1

位测试指令 TST

;实质是与运算 常用于用来测试某一位或某几位是 0 还是 1,结果通过 CPSR 的 'Z' 位判断
tst r0, #0x3

相等测试指令 TEQ

;实质是异或运算,测试两个数是否相等,两个数相等时异或结果位 0,通过 CPSR 的 'Z' 位判断
teq r0, r1

移位指令 LSL、LSR、ASR、ROR

;需要与mov配合,不能够单独使用
mov r0, #0xff
mov r1, r0, lsl #  ;将 r0 逻辑左移 4 位放入 r1 中
;LSL 逻辑左移:高位移出,低位补零
;LSR 逻辑右移:低位移出,高位补零
;ASR 算是右移:低位移出,高位补符号位
;ROR 循环右移:低位移出,高位补低位移出位

ARM指令集——数据处理指令的更多相关文章

  1. ARM指令集—SWP指令

    ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...

  2. ARM指令集----杂项指令

    ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...

  3. ARM 汇编 数据处理指令

    一. 如何把数据放到寄存器中 1. 数据搬移指令 mov  , mvn 1)  指令格式:<opcode><cond>{s}   Rd,  operand     <操作 ...

  4. ARM指令集——条件执行、内存操作指令、跳转指令

    ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...

  5. ARM学习笔记3——数据处理指令

    一.数据处理指令概述 1.概念 数据处理指令是指对存放在寄存器中的数据进行处理的指令.主要包括算术指令.逻辑指令.比较与测试指令以及乘法指令 如果在数据处理指令前使用S前缀,指令的执行结果将会影响CP ...

  6. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

  7. ARM指令集----寻址方式

    ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...

  8. ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)

    ARM指令集编码格式解读 说明: 1.本文参考的书籍<ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition>中的Cha ...

  9. 常用 ARM 指令集及汇编

    ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...

随机推荐

  1. Stack and queue.

    队列的定义及基本运算 1.定义    队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表 (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rea ...

  2. Sybase datetime 时间转换格式 convert(varchar(10),字段名,转换格式)

    convert(varchar(10),字段名,转换格式)sybase下convert函数第三个参数(时间格式)比如:1.select user_id,convert(varchar(10),dayt ...

  3. js精度丢失解决办法

    /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失. * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var ...

  4. Jqgrid的用法总结与分页功能的拓展

    这是本人写的第一个与技术相关的博客,但是非挑战技术的,而是对工作的总结,另外加一点点拓展. Jqgrid的功能十分强大,强大到可以做到与数据grid相关的任何功能,同时由于在用的过程中总是不能够一气呵 ...

  5. (转)反射发送实战(-)InvokeMember

    反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...

  6. C++安装JSONCPP

    VS2013里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz 利用VS2008打开jsoncpp ...

  7. mysql数据库在Navicat Premium连接的时候出现1862错误

    navicat连接打开时报1862的错误, 很就没有连接mysql看看了,今天连接的时候发现本机的mysql链接不上了,在cmd中执行动作的时候也会叫你去set password,做设置密码的动作时会 ...

  8. (转载)C# 编程 使用可空类型

    转载出处为://https://msdn.microsoft.com/zh-cn/library/2cf62fcy(vs.90).aspx#Anchor_1 C#可以为 null 的类型可以表示基础类 ...

  9. vim的命令集合

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令.启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并 ...

  10. VC中如何获取当前时间(精度达到毫秒级)

    标 题: VC中如何获取当前时间(精度达到毫秒级)作 者: 0xFFFFCCCC时 间: 2013-06-24链 接: http://www.cnblogs.com/Y4ng/p/Millisecon ...