• 2023 ARM


    汇编语法的组成部分

    1. 1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译
    2. .text
    3. .global .end .if .else .endif .data
    4. 2.汇编指令
    5. 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能
    6. 3.伪指令
    7. 不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现
    8. 4.注释
    9. 单行注释: @
    10. 多行注释 /* */
    11. 条件编译
    12. .if 0
    13. 指令段
    14. .else
    15. 指令段
    16. .endif

    汇编指令的基本格式

    1. 指令的基本格式:
    2. <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
    3. 解释:
    4. <opcode>:指令码
    5. {<cond>}:条件码
    6. {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
    7. <Rd>:目标寄存器
    8. <Rn>:第一操作寄存器 只能是寄存器
    9. <shifter_operand>:第二操作数,可以是寄存器,也可以是立即数
    10. 按照指令码将第一操作寄存器和第二操作数进行运算,将运算后的结果保存在目标寄存器
    11. 注意:
    12. 1.一条汇编指令一般占一行
    13. 2.汇编不区分大写小写

    汇编指令

    数据搬移指令

    1. <opcode>{<cond>}{s} <Rd>, <shifter_operand>
    2. 解释:
    3. <opcode>:指令码
    4. {<cond>}:条件码
    5. {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
    6. <Rd>:目标寄存器
    7. <shifter_operand>:第一操作数,可以是寄存器,也可以是立即数
    8. 按照指令码将第一操作数运算后的结果保存在目标寄存器
    9. 指令码功能:
    10. mov:将第一操作数的值保存在目标寄存器
    11. mvn:将第一操作数的值按位取反,将结果保存在目标寄存器

    立即数的概念

    定义:能够直接当作指令的一部分参与到指令的执行过程中的数据就是立即数.立即数由一个0-255范围内的数循环右移偶数位获得。

    在指令的32为中将低12位预留保存立即数的数据

    1. 如何判断一个数据是不是立即数:
    2. 0-255范围内找一个数,让它循环右移偶数位(一个0-15范围内的数*2得到),如果能够得到这个数据,则这个数就是一个立即数。
    3. 循环右移:最低位移出去的数补到最高位
    4. 0000 0000 0000 0000 0000 0000 0000 1010
    5. 右移两位: 0000 0000 0000 0000 0000 0000 0000 0010
    6. 循环右移两位: 100000 0000 0000 0000 0000 0000 0000 10
    7. ex:
    8. 0X1040000 0000 0000 0000 0000 0001 0000 0100
    9. 循环右移2位-》000000 0000 0000 0000 000000 0100 0001 -》0x41
    10. 换句话说,将0x41循环右移30位得到0X104,所以,0X104是一个立即数
    11. 0X101:0000 0000 0000 0000 0000 0001 0000 0001
    12. 0X101找不到一个0-255范围内的数循环右移得到它,所以0X101不是立即数

    移位指令

    格式以及指令码

    1. 格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
    2. 解释:将第一操作寄存器的数值移位第二操作数指定的位数,将结果保存在目标寄存器中
    3. 指令码:
    4. LSL:左移运算 低位补0
    5. LSR:右移运算 高位补0
    6. ROR:循环右移:低位移出的值补到高位

    位运算指令

    1. 格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
    2. 解释:将第一操作寄存器和第二操作数进行位运算,将结果保存在目标寄存器中
    3. 指令码:
    4. and:与 与001不变
    5. orr:或 或110不变
    6. eor:异或 相同为0 不同为1
    7. bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可
    8. 实例
    9. 1.and:
    10. mov r0,#0XFF
    11. and r1,r0,#0XF0 @R1结果为0XF0
    12. 2.ORR:
    13. mov r0,#0XFF
    14. orr r1,r0,#0XF000 @R1结果为0XF0FF
    15. 3.EOR:
    16. ldr r0,=0xf0f0
    17. EOr r1,r0,#0XFF @R1结果为0XF00F
    18. 0000 0000 0000 0000 0000 0000 1111 1111
    19. 0000 0000 0000 0000 1111 0000 1111 0000
    20. 结果:0000 0000 0000 0000 1111 0000 0000 1111 -》0XF00F
    21. 4.BIC
    22. ldr r0,=0xFF
    23. BIC r0,r0,#(0x1<<5) @将R0的值第5位清0 @R0结果为0XDF

    算术运算指令

    1. 格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
    2. 解释:将第一操作寄存器的值和第二操作数进行算数运算,结果保存在目标寄存器中
    3. add:加法运算
    4. adc:进行加法运算时需要考虑CPSR的条件位
    5. sub:减法运算
    6. sbc:进行减法运算时需要考虑CPSR的条件位
    7. mul:乘法运算

    比较指令

    1. 格式:
    2. cmp 第一操作数,第二操作寄存器
    3. 比较两个数据
    4. cmp命令本质:实际上就是比较的两个数进行减法运算,并且减法运算的结果会影响到CPSR寄存器的条件位
    5. 通常比较指令完毕之后会使用条件码进行判断,根据判断的结果做不同的逻辑

    跳转指令

    1. 格式:
    2. <opcode>{<cond>} 标签
    3. 功能:跳转到指定的标签下
    4. 指令码:
    5. b:跳转时不影响LR寄存器的值
    6. ex:.text
    7. .global _start
    8. _start:
    9. mov r1,#3
    10. mov r2,#4
    11. b fun1 @程序跳转
    12. mul r5,r1,r2
    13. stop:
    14. b stop
    15. fun1:
    16. add r4,r1,r2
    17. .end
    18. bl:跳转时影响LR寄存器的值
    19. .text
    20. .global _start
    21. _start:
    22. mov r1,#3
    23. mov r2,#4
    24. bl fun1 @程序跳转
    25. mul r5,r1,r2
    26. stop:
    27. b stop
    28. fun1:
    29. add r4,r1,r2
    30. mov pc,lr @程序返回
    31. .end

    实现1~100的和

    1. .text
    2. .globl _start
    3. _start:
    4. MOV R0,#0
    5. MOV R1,#1
    6. MOV R2,#100
    7. FUN:
    8. CMP R1,R2
    9. ADDNE R0,R0,R1
    10. ADDNE R1,R1,#1
    11. BNE FUN
    12. stop:
    13. b stop
    14. .end

  • 相关阅读:
    一个信号间相互干扰问题的发现及解决方法
    Go template详解(中)- 变量使用、if语句、迭代(数组、切片、map)、内置函数(比较、逻辑判断、打印、索引、函数调用)
    国内外数据保护(灾备、备份、恢复、复制、归档)厂商
    Java项目:SSM电影售票管理系统
    接龙管家-Python自动打卡(续)获取接龙管家token
    Nginx负载均衡详解
    会话技术之Coookie && Session详解
    深入理解@Transactional注解
    springcloudalibaba架构(13):Spring Cloud Gateway服务网关和入门案例
    Python——第6章 Numpy库的使用
  • 原文地址:https://blog.csdn.net/2301_78388097/article/details/133619122