• ARM指令集——数据处理指令


    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, #1 mov r1, #1 add r2, r1, r0  ;r2 = r1 + r0 add r2, r1, #2  ;r2 = r1 + 2

     数据操作对CPSR的影响 

    ;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
    mov r1, #0mov r2, #-1
    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, #1  ;第一个数的高32位
    mov r2, #0x5  ;第二个数的低32位 
    mov r3, #1  ;第二个数的高32位
    adds r4, r0, r2 
    adc r5, r1, r3  ; adc运算的实质是 r5 = r1 + r3 + 'C'  'C'位 CPSR 进位标志

    减法指令 SUB

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

    带借位的减法指令 SBC

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

    逆向减法指令 RSB

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

    乘法指令 MUL

    ;为了提高效率,任何乘法指令不可以使用立即数
    mov r0, #3
    mov r1, #5
    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, #2
    mov r1, #1
    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 #4  ;将 r0 逻辑左移 4 位放入 r1 中
    ;LSL 逻辑左移:高位移出,低位补零
    ;LSR 逻辑右移:低位移出,高位补零
    ;ASR 算是右移:低位移出,高位补符号位
    ;ROR 循环右移:低位移出,高位补低位移出位
  • 相关阅读:
    rocketmq详解
    rocketmq的windows版客户端的启动步骤
    postman提交数组格式方式
    关于springmvc的包含list提交的格式
    数据库字段和实体类和map中对应类型
    怎么连接两个数据库和怎么停止上一个线程
    IDEA 创建类是自动添加注释和创建方法时快速添加注释
    centOs7 安装mysql8
    CentOS7安装Nginx及配置
    windows安装mysql8详解
  • 原文地址:https://www.cnblogs.com/chen-farsight/p/6066413.html
Copyright © 2020-2023  润新知