• ARM汇编基础指令整合


    汇编语言的组成

    伪操作

            不参与程序的执行,但是用于告诉编译器程序该怎么编译 如:

            .text        .global        .end        .if        .else        .endif        .data

    汇编指令

            汇编器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能。

    伪指令

            不是指令,但是看似一条指令,可以实现指令类似的功能,一条伪指令可能是由多条指令共同实现。

    注释

            单行注释:@

            多行注释:/**/

    条件编译        

    1. .if 0
    2. @text
    3. .else
    4. @text
    5. .endif

    汇编指令的介绍

    基本数据操作指令

            数据搬移指令:=

            数据位移指令:<< >>

            数据算数运算指令:+ - * /

            位运算指令:$ | ~ ^

            数据比较指令:cmp 第一操作数,第二操作寄存器,其有很多条件码,如果条件码满足则执行对应的指令

            跳转指令

            内存读写指令

            状态寄存器读写指令

            软中断指令

    汇编指令的基本语法格式

     基本格式: {cond}{s} Rd,Rn,#oprand2
            解释:
                opcode:指令码
                cond:条件码
                           指令不加条件码,指令默认无条件执行
                           指令加条件码,指令有条件执行
                s:状态位
                           指令不加s,指令执行的结果不会影响CPSR寄存器
                           指令加s,指令执行的结果会影响CPSR寄存器
                Rd:目标寄存器
                Rn:第一操作寄存器
                #oprand2:第二操作数
                    1)立即数
                    2)有效数:将一个数取反之后,变成立即数
                    3)寄存器
                    4)经过移位的寄存器 
            注意事项:
                    1)汇编指令中不区分大小写
                    2)汇编指令不需要以;号结尾
                    3){cond}{s}:需要连在一起写
                    4)Rd,Rn,#oprand2:需要用逗号分隔开
                    5) {cond}{s}和Rd,Rn,#oprand2需要用空格分隔开

    数据搬移指令

            指令码:mov mvn

            格式:{cond}{s} Rd,#oprand2        

    1. @ 代码1:
    2. mov r0,#0xf @ r0 = 0xf
    3. mov r1,#0xff
    4. @ mov r2,#0xfff @ error
    5. @ mov r3,#0xffff @ error
    6. @ mov r4,#0xfffff @ error
    7. mov r5,#0xffffff
    8. mov r6,#0xfffffff
    9. mov r7,#0xffffffff
    10. /*------------------ ------------------ ---------------*/
    11. @ 代码2:
    12. mvn r5,#0xff @ 0xff按位取反之后,赋值给r5
    13. mov r0,#0xff000000 @ 0xff 8
    14. mov r1,#0x1f800000 @ 0x7e 10
    15. mov r2,#0x00ffffff @ ~r2 = 0xff000000
    16. mov r3,#0x0fffffff @ ~r3 = 0xf0000000
    17. mov r4,#0xffffffff @ ~r4 = 0x00000000

    立即数判断

            要从这个数中间找到0~0xff之间的数,而且要包含所有1,如果能找到,循环右移偶数位,如果能够得到要判断的数,则该数为立即数。

    伪指令

            如何用伪指令将非立即数保存到寄存器中

            伪指令:

                    LDR 目标寄存器,=数值

    移位指令

         格式:{cond}{s} Rd,Rn,#oprand2 

          指令码:

                    lsl:逻辑左移 高位移出,低位补0

                    lsr:逻辑右移 低位移出,高位补0

                    asr:算数右移 有符号数右移,低位移出,高位补符号位

                    ror:循环右移 低位移出,补高位

    位运算指令

            格式:{cond}{s} Rd,Rn,#oprand2 

            方法:看到清零用 & 看到置1用 |

            and:按位与(&)------>与0清0,与1不变
            orr:按位或(|) ------>或0不变,或1置1
            eor:按位异或(^) ------>异或0不变,异或1取反
            bic:按位清除  ------> 哪一位写1,对应的位进行清0

    算数运算指令

            指令码:add adc sub sbc mul       

            基本格式: {cond}{s} Rd,Rn,#oprand2     

            add: 普通加法指令
            adc:带进位加法指令
            sub:普通减法指令
            sbc:带借位减法指令
            mul:乘法指令  格式:{cond}{s} Rd,Rn   

    64位数据进行算数运算

    原则:
            一个 64位数保存在两个寄存 高32位运算,低32位运算
                 mov r1,#0XFFFFFFFE          @保存第一个数据的低32位
                 mov r2,#2         @保存第一个数据的高32位
                 mov r3,#3         @保存第二个数据的低32位
                 mov r4,#4         @保存第2数据的高32位
            @低32位运算要求影响条件位
                    ADDS R5,R1,R3         @R5保存运算后结果的低32位
                    ADC R6,R2,R4           @R6寄存器保存运算结果的高32位,需要考虑条件位

    比较指令

    指令码:cmp
    基本格式: {cond} Rn,#oprand2
            1)比较指令没有目标寄存器
            2)比较指令本质做减法运算
            3)比较指令的执行结果会影响CPSR寄存器的NZCV位,不需要加s
            4)比较指令需要和条件码搭配使用
            5)前面所有学习的指令都属于无条件指令,比较指令属于有条件执行

    示例:

    比较两个数大小
    第一个数比第二个数大:第一个数减第二个数
    第一个数比第二个数小:第二个数减第一个数

    mov r0,#0x3
    mov r1,#0x4
    cmp r0,r1
    subhi r0,r0,r1  @ r0 = r0 - r1
    subcc r1,r1,r0  @ r1 = r1 - r0

    跳转指令

    1. 指令码:b
    2. 格式:b {cond} 标签
    3. b指令码:有去无回,不会保存函数的返回地址到LR寄存器中
    4. -------------------
    5. b loop
    6. -------------------
    7. loop:
    8. -------------------
    9. /****************************************************/
    10. 指令码: bl
    11. 格式:bl{cond} 标签
    12. bl指令码:有去有回,会保存函数的返回地址到LR寄存器中
    13. -------------------
    14. bl loop
    15. ------------------- ----->会保存函数的返回地址到LR寄存器中
    16. loop:
    17. -------------------

            

  • 相关阅读:
    Docker如何进行实践应用?
    ‘View‘ cannot be used as a JSX component
    Springboot项目打jar包的两种方式 + 本地测试jar包是否可以启动
    LabVIEW专栏八、类
    俄罗斯方块
    html和winform webBrowser控件交互并播放视频(包含转码)
    Django学习第一天
    信息中心网络提出的背景、研究现状及研究内容
    前端常用样式组元SCSS
    最新python大数据毕业设计选题推荐(三)
  • 原文地址:https://blog.csdn.net/2301_77665369/article/details/133434405