zoukankan      html  css  js  c++  java
  • ARM 汇编 数据处理指令

    一. 如何把数据放到寄存器中

     1. 数据搬移指令 mov  , mvn

      1)  指令格式:<opcode><cond>{s}   Rd,  operand

                <操作码><条件码>{是否影响状态位}  目标寄存器,第一操作数

      2)  operand 第一操作数范围:(有效数和立即数前加 ‘#’)立即数 / 有效数 , 一个寄存器 , 移位指令         

      3) 关于立即数两个条件约束 举例说明:

        一个数据  X (一个32bit数据) 把这个数据转化为 二进制 ,(条件1)所有的位 中为 1 的都要在 连续的 8 个bit 位里面;

        (条件2)把这 8 个bit 位数据拿出来,如果这个 8 bit 数据循环右移偶数位,还可以是 X 这个数据,则X 是一个立即数。

      4) 关于有效数,一个数 X 按位取反后得到数 Y ,如果数 Y 是一个立即数, 则 X 是一个有效数

        5)【 mov  r0, #0xff 】 把数据 0xff 放在寄存器 r0 中  ; mov 表示直接把数据移动到目标寄存器中,r1 中值为 0xff

           【 mvn  r1,#0x55 】 把数据 0x55 按位取反后 放在寄存器 r1 中  ; mvn 表示把数据按位取反后放在目标寄存器中, r1 中值为0xaa

     

    2. 想在寄存器中放一个非立即数或者有效数

      使用伪指令 ldr  【 ldr r0,=0xfe000001 】 把数据0xfe000001 放在寄存器r0 中

     二. 移位操作

    3. 逻辑左移指令 【 lsl 】 低位补0,高位移出

      【 mov r1, #0xff  】    @ 1111 1111 ---> 0001 1111 1110

      【 lsl  r0, r1, #0x1 】  @ 把r1中的数据0xff 左移一位放在寄存器 r0 中 

      r0中值应该为 0x1fe 

     

    4. 逻辑右移指令 【 lsr 】 低位移出,高位补0  

        【 mov r0, #0xff 】    @ 1111 1111 ---> 0111 1111

      【 lsr r1, r0, #0x1 】 @把r0 中的数据 0xff 右移一位把结果放在寄存器 r1 中

      r1 中的值为 0x7f

    5. 算术右移指令 【 asr 】 低位移出,高位补符号位

      【 mov r1, #0x8000000f 】  @ 最高位表示符号位  1000 ...... 1111 ---> 1100 ...... 0111

      【 asr r0, r1, #0x1 】@ 把 r1中的值算术右移一位

    6. 循环右移指令 【 ror 】 低位移出,高位补移出位

      【 mov r0, #0xff 】 @   1111 1111 ---> 1000 ..... 0111 1111

      【 ror r1, r0, #0x1

    三. 加减乘法运算

    7. 加法指令 【 add ,adc 】 add表示加法指令,adc 表示带进位的加法指令, 会计算 CPSR 寄存器中的 状态位

    两个例子:通过 adds 和 adc 同时影响

    @ 例子1  32 位数据加法运算
    
    mov r0, #0xf0
    mov r1, #0x0f
    add r2, r1, r0    @ 把寄存器 r1和r0中的值相加放在寄存器r2中,r2的中值为0xff
    
    
    @ 例子2  64 位数据运算
    mov r0, #0x1          @数据高位
    mov r1, #0xfffffffe   @数据低位
    
    mov r2, #0x1          @数据高位
    mov r3, #0xf          @数据低位
    
    adds r5, r1, r3    @adds 中 s 表示影响 CPSR 中的 状态为
    adc  r4, r0, r2     @ adc 表示带进位的加法运算, CPSR中的状态位 效果 r4 = r0 + r1 + c

    8. 减法指令 【 sub ,sbc 】   sub 表示减法指令, sbc 表示带借位的减法指令,会计算CPSR 中的状态位

    两个例子:

    @ 例子 1   32 位数据减法
    mov r1,  #0x3
    mov r2,  #0x4
    sub r0, r2, r1   @ r0 = r2 - r1  
    
    
    @例子 2   64 位数据运算
    mov r0, #0x0       @ 数据高位
    mov r1, #0x4       @ 数据低位
    
    mov r2, #0x1       @ 数据高位
    mov r3, #0x3       @ 数据低位
    
    subs r5, r3, r1       @ 数据低位 , subs 表示运算会影响 CPSR 中的状态位, 3-4是负数,结果为全f的值
    sbc   r4, r2, r0      @ 数据高位 , sbc  相当于 r4 = r2 - r0 -!C  C 为CPSR 中的状态位

    9. 乘法运算指令 【 mul 】 

     【 mov r1, #0x4

     【 mov r2, #0x5

     【 mul r0, r1, r2 】  @ r0 = r1 * r2  

     

    四. 逻辑运算指令 : 【 and,orr,eor,bic 】

      指令格式:<opcord><cond>{s} Rd, Rn, operand

      <操作码><条件码>{是否影响状态位}  目标寄存器,第一操作数, 第二操作数

    10. 按位与 运算指令 【 and 】

    mov r0, #0xaa

    mov r1, #0x55

    and r3, r0, r1 】   @  r3 = r1 & r2 按位操作 r3中的值为0

     

    11. 按位或运算指令 【 orr 】

    mov  r1, #0xaa

    mov r2, #0x55 】

    orr r0, r1, r2 】@ r0 = r1 | r2  把r1 和r2 按位或 结果放在 r0 中, r0中的值为0xff

     

    12. 按位异或运算指令 【 eor 】

    mov r1, #0x3

    mov r2, #0x6

    eor r0, r1, r2 】 @  r0 = r1 ^ r2 把r1和r2 中的值异或运算结果放在 r0 中 , r0中的值为0x55

     

    13. 位清 0 指令 【 bic 】

    ldr r1, =0x12345678 】  @ 低 8 位  0111 1000 

    bic r0, r1, #0x55 】      @  0x55 == 0101 0101 ,把 低 8 位 对应的为 1 的地方全部清零 , r0的结果为0x12345628

     

    14. 例子:

    实现把 0x12345678 中的 6 对应的位置清零 , 清除的是 4 bit 

    ldr r0, =0x12345678    @ 需要改变的原始值
    mov r1, #0xf               @ 需要改多少bit 
    lsl r1, r1, #0x8            @ 把r1 中的值向左移8位在放在r1中
    mvn r1, r1                  @  把r1 中的值按位取反后再放在r1中
    and r0, r0, r1               @ 把r0 中的值和r1 中的值按位与运算后再放在r0中

     

    五. 数值比价指令

    15. 比较指令 【 cmp 】 影响 CSPR 寄存器的 NZC 位

    【 mov r0, #0x5 】

    【 mov r1, #0x4 】

    【 cmp r0, r1 】 @ 本质 做subs 操作 , 影响 CSPR 寄存器的 NZC 位

    相等情况                            不相等情况

                   

    16. 位测试指令 【 tst 】 影响 寄存器 CPSR 的 Z 位

    【 mov r0, #0xfe 】

    【 mov r1, #0x8 】 

    【 tst r0, r1 】 @ 测试某一位是否 为 0 ; 本质上 做 ands 运算;

    因为 r0 值为 0xfe == 1111 1110   ; r1 值为 0x8 == 1000 0000 测试 r0 第 7 位 是否为0,r0第7位为1,此时 Z 不置位

    改为【 mov r1, #0x1 】

      【 tst r0, r1 】 此时 cpsr 寄存器置位 

     17. 测试两个数是否相等指令 【 teq 】  寄存器 CPSR 的 Z 位

     【 mov r0,  #0xfe 】

     【 mov r1, #0x8 】

     【 teq r0, r1 】 @本质 做 eors操作 ,影响状态的异或运算 

    通过 teq 测试两个r0 , 和 r1 中的数据是否相等 , 如果相等 置1  Z 位,不相等,清零 Z 位

  • 相关阅读:
    Dingo/api 学习笔记
    Composer install 报错
    bootstrap4 调整元素之间距离
    css font-family常用的黑体宋体等字体中英文对照
    mac 开关机
    lodash.memoize
    Evevt Loop 事件循环
    mac 安装 XX-Net-3.12.11
    mac端口占用
    npm 安装/删除/发布/更新/撤销 发布包
  • 原文地址:https://www.cnblogs.com/electronic/p/11011777.html
Copyright © 2011-2022 走看看