• [国嵌笔记][025][ARM指令分类学习]


    算术和逻辑指令

    1.mov

    格式:mov {条件}{s} <dest>, <op>  

    作用:把一个值从一个地方移动到另一个地方,<dest>必须是寄存器

    示例:

    @mov指令范例   “@”表示注释

    mov r1, #8

    mov r2, r1

     

    2.mvn

    格式:mvn {条件}{s} <dest>, <op>  

    作用:把一个值取反后从一个地方移动到另一个地方,<dest>必须是寄存器

    示例:

    @“0b”表示二进制,”0x”表示十六进制,什么都不加表示十进制

    mvn r1, #0b10

    mvn r2, #5

    mvn r3, r1

     

    3.sub

    格式:sub{条件}{s} <dest>, <op1>, <op2>

    作用:减法,用<op1>-<op2>把结果放到<dest>寄存器中

    示例:

    @<dest>和<op1>不能为立即数

    mov r0, #4

    sub r1, r0, #2

     

    4.add

    格式:add{条件}{s} <dest>, <op1>, <op2>

    作用:加法,<op1>加上<op2>的和放到<dest>寄存器中

    示例:

    @可以在调试中直接给寄存器赋值

    mov r1, #1

    add r2, r1, #1

     

    5.and

    格式:and{条件}{s} <dest>, <op1>, <op2>

    作用:逻辑与,<op1>与<op2>相与结果放在<dest>寄存器中

    示例:

    mov r1, #5

    and r2, r1, #0

    and r3, r1, #1

     

    6.bic

    格式:bic{条件}{s} <dest>, <op1>, <op2>

    作用:位清除,把<op1>中在<op2>中对应为1的位清零,结果放在<dest>中

    示例:

    mov r1, #0b1011

    bic r2, r1, #0b0101

     

    比较指令

    1.cmp

    格式:cmp{条件}{P} <op1>, <op2>

    作用:比较,<op1>减去<op2>的大于、小于和等于三种情况保存在cprs中的N和Z位中

    示例:

    mov r1, #2

    cmp r1, #1   @NZ 00

    cmp r1, #2   @NZ 01

    cmp r1, #3   @NZ 10

     

    2.tst

    格式:tst{条件}{P} <op1>, <op2>

    作用:测试位,把<op1>与<op2>中对应位做按位与操作,结果保存在cprs中的Z位,用来测试<op1>在<op2>中对应位是否为1(条件是否为真)

    示例:

    mov r1, #0b101

    tst r1, #0b010   @Z 1

    tst r1, #0b110   @Z 0

     

    跳转指令

    1.b

    格式:b{条件} <地址>

    作用:根据条件跳转到地址处,常用条件有gt(大于)、ge(大于等于)、eq(等于)、ne(不等于)、lt(小于)、le(小于等于);也可以不跟条件,表示无条件跳转

    示例:

    mov r1, #2

    mov r2, #1

    cmp r1, r2

    bgt branch @(if)如果满足条件跳转到分支,否则执行另一个分支

       sub r3, r1, r2

       b end   @无条件跳转

    branch:

       add r3, r1, r2

    end:

       nop   @空操作

     

    2.bl

    格式:

    作用:带链接返回的跳转,在跳转之前保存返回后将要执行的下一条指令的地址到lr(链接寄存器)中,用于函数的返回

    示例:

    mov r1, #1

    mov r2, #2

    bl func

    mov r0, r3

    b end

     

    func:

    add r3, r1, r2

    mov pc, lr

     

    end:

    nop

     

    移位指令

    1.lsl

    格式:rx , lsl#n

    作用:逻辑左移(logical or arithmetic shift left),把rx寄存器中的值左移n位,低位补0。类似的还有asl(算术左移,低位直接补0),lsr(逻辑右移,高位补0),asr(算术右移,高位补符号值)。逻辑移动直接补0,算术移动补符号值。

    示例:

    mov r1, #0b101

    mov r2, r1, lsl#2

    mov r2, r1, asl#2

    mov r2, r1, lsr#2

    mov r2, r1, asr#2

     

    2.ror

    格式:rx, ror#n

    作用:循环右移(rotate right),把rx寄存器的最低位循环移动到最高位。

    示例:

    mov r1, #0b11

    mov r2, r1, ror#1

     

    3.rrx

    格式:rx, rrx#n

    作用:带扩展位的循环右移(rotate right with extend),把rx寄存器的值加上cprs中的S位一起循环右移。

    示例:

    mov r1, #0b11

    mov r2, r1, rrx

     

    4.循环指令汇总

    LSL  逻辑左移,低位补0值

    ASL  算术左移,低位补0值

    LSR  逻辑右移,高位补0值

    ASR  算术右移,高位补符号(S)值

    ROR  循环右移,高位补低位值

    RRX  带扩展的循环右移,符号位(S)补低位值

     

    5.程序状态字访问指令

    1.mrs和msr

    格式:mrs rd, cpsr   msr cpsr, rd

    作用:程序状态字寄存器不能直接修改,需要用专用指令来修改程序状态寄存器中的值。

    示例:

    mrs r0, cpsr

    orr r0, r0, #0b11111 @使处理器工作在sys(系统模式

    msr cpsr, r0

     

    6.存储器访问指令

    1.ldr和str

    格式:ldr{条件} rd, <地址>   str{条件} rd, <地址>

    作用:从<地址>中装载到rd中,或把rd的值保存到<地址中>

    示例:

    mov r1, #ff

    ldr r0,=0x30001000   @mov指令不能直接超过8位的值,用伪指令用来把内存地址0x30001000值赋给r0寄存器

    str r1, [r0]   @把r1中的值保存到到r0指向的地址中

    ldr r2, [r0]   @把r0指向的地址中的值装载到r2中

    .text
    .global _start
    _start:
    @ldr str
    ldr r0, =0x30001000
    mov r1, #0xff
    str r1, [r0]
    ldr r2, [r0]
    
    @mrs msr
    mrs r1, cpsr
    orr r1, r1, #0b11111
    msr cpsr, r1
    
    
    @ror
    mov r1, #0b11
    mov r2, r1, ror#1
    mov r3, r1, rrx
    
    @lsl
    mov r1, #0b101
    mov r2, r1, lsl#2
    mov r2, r1, asl#2
    mov r2, r1, lsr#2
    mov r2, r1, asr#2
    
    @bl
    mov r1, #1
    mov r2, #2
    bl func
    mov r0, r3
    b end
    
    func:
    add r3, r1, r2
    mov pc, lr
    
    end2:
    nop
    
    @b
    mov r1, #2
    mov r2, #1
    
    cmp r1, r2
    bgt branch
    	sub r3, r1, r2
    	b end
    branch:
    	add r3, r1, r2
    
    end1:
    nop
    
    @tst
    mov r1, #0b101
    tst r1, #0b010
    tst r1, #0b110
    
    @cmp
    mov r1, #2
    cmp r1, #1
    cmp r1, #2
    cmp r1, #3
    
    @bic
    mov r1, #0b1011
    bic r2, r1, #0b0101
    
    @and
    mov r1, #5
    and r2, r1, #0
    and r3, r1, #1
    
    @add
    mov r1, #1
    add r2, r1, #1
    
    @sub
    mov r0, #4
    sub r1, r0, #2
    
    @mvn
    mvn r1, #0b10
    mvn r2, #5
    mvn r3, r1
    
    @mov
    mov r1, #8
    mov r2, r1
    
  • 相关阅读:
    php设计模式-装饰器模式
    php设计模式-观察者模式
    play-with-docker搭配ffsend完成文件上传及下载(解决从docker hub拉取镜像慢问题)
    java执行命令行,以及解决卡死问题
    在docker容器中调用docker命令
    MIME 类型,ContentType
    大文件下载---之内存溢出问题解决
    OperationCenter Docker运行环境及其依赖启动脚本
    快速获取批量处理Docker镜像SQL语句
    解决达梦数据库新增大字段报错问题
  • 原文地址:https://www.cnblogs.com/d442130165/p/4895061.html
Copyright © 2020-2023  润新知