• ARMday02(汇编语法、汇编指令)


    汇编语法

    汇编文件中的内容

    1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word....

    2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算

    数据处理指令

             数据搬移指令

            算数运算指令

            数据移位指令

            位运算指令

            数据比较指令

    跳转指令

    内存读写指令

    状态寄存器传送指令 CPSR

    软中断指令

    3.伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现

    4.注释

    单行注释: @ ;

    多行注释: /* */

    条件注释 .if 1/0 指令段1 .else 指令段2 .endif

     汇编指令的基本语法格式

    指令的基本格式: {} {s} , ,

    :指令的操作码

    cond:条件码后缀

    s:指令的执行结果将会影响CPSR中的条件标志位。

    :目标寄存器,指令的运算结果保存在目标寄存器中

    :第一操作寄存器,只能是寄存器

    :第二操作数,既可以是寄存器编号,又可以是立即数

    意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中

    注意:

    1.一般一条汇编指令就占据一行代码

    2.汇编不区分大小写

    3.操作数前面要跟一个#

    汇编指令

    数据搬移指令

    {} {s} ,

    解释:

    :指令的操作码

    cond:条件码后缀

    s:指令的执行结果将会影响CPSR中的条件标志位。

    :目标寄存器,指令的运算结果保存在目标寄存器中

    :第一操作数,既可以是寄存器编号,又可以是立即数

    指令码:

    mov:将操作数直接搬移到目标寄存器中

    mvn:将操作数按位取反之后搬移到目标寄存器中

    立即数的概念

    定义:可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取(循环右移:低位移除,补到高位)

    立即数的判断

    如何判断一个数据是不是立即数: 只要让这个数据或者这个数据按位取反的值循环右移偶数位,能够得到一个0-255范围内的数字就说明这个数是立即数

    如何将一个非立即数保存在寄存器中

    利用伪指令ldr即可完成非立即数的操作

    格式: ldr 目标寄存器名,=数据

     移位操作指令

    格式: {} {s} , ,

    解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中

    指令码:

    lsl:左移运算,最高位移出,最低位补0

    lsr:右移运算,最低位移出,最高位补0

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

    位运算指令 

    与、或、异或、按位清0

    格式: {} {s} , ,

    指令码:

    and:进行按位与

    orr:进行按位或

    eor:按位异或

    bic:按位清0

    算数运算指令 

    格式: {}{s} , ,

    指令码: add:加法运算 Rd=Rn+shifter_operand

    adc:进行加法运算时考虑CPSR的C位 Rd=Rn+shifter_operand+CPSR[c]

    sub:减法运算 Rd=Rn-shifter_operand

    sbc:进行减法运算时考虑CPSR的c位 Rd=Rn-shifter_operand-!CPSR[c]

    RSB :逆向减法Rd=shifter_operand-Rn

    RSC:带借位的逆向减法指令 Rd = shifter_operand – Rn - !CPSR[c]

    mul:乘法运算 Rd=Rn*shifter_operand

    进行64位算数运算 

    MOV R1,#0xfffffffe @第一个数据的低32位

    mov r2,#0x00000004 @第一个数据的高32位

    MOV R3,#0x00000005 @第二个数据的低32位

    mov r4,#0x00000004 @第二个数据的高32位

    加法:

    低32位: adds r5,r1,r3

    高32位: adc r6,r2,r4

    数据比较指令 

    格式: cmp ,

    比较指令的本质: 拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位

    可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句 这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现

    跳转指令

    一般实现程序的跳转有两种方式: 1.直接修改PC的值 2.通过跳转指令

    1.b label 解释:跳转到label标签所在代码,此时跳转,lr寄存器不保存返回地址

    2. bl label 解释:跳转到label标签所在代码,此时跳转,lr寄存器保存返回地址 

    3. bx 地址 跳转到地址对应的的指令位置,此时跳转LR不保存返回地址 

    4.blx 地址 跳转到地址对应的的指令位置,此时跳转LR保存返回地址 

    今日任务:

    1. .text
    2. .globl _start
    3. /*累加1-100*/
    4. _start:
    5. mov r0,#0@sum
    6. mov r1,#0@累加的值
    7. mov r2,#12@标记位
    8. add r1, r1,#1
    9. add r0,r0,r1
    10. cmp r1,#100
    11. beq stop
    12. bne continuefun
    13. continuefun:
    14. bx r2
    15. stop:
    16. b stop
    17. .end

    another

    1. .text
    2. .globl _start
    3. /*累加1-100*/
    4. _start:
    5. mov r0,#0@sum
    6. mov r1,#0@累加的值
    7. continuefun:
    8. add r1, r1,#1
    9. add r0,r0,r1
    10. cmp r1,#100
    11. beq stop
    12. bne continuefun
    13. stop:
    14. b stop
    15. .end

  • 相关阅读:
    数据结构——栈与队列
    【大话云原生】微服务篇-五星级酒店的服务方式
    cpp primer plus笔记05-ios_base
    适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序
    【Oracle】新建模式,用户,表空间、授权记录
    SQL Server教程 - T-SQL-存储过程(PROCEDURE)
    【第2章 Node.js基础】2.2 Node.js回调函数
    号称“阿里爸爸”最新Java面试八股文,从最基础的面试题开始
    rust内存分配,内存回收,内存泄露
    二层华三交换机连接三层思科交换机,trunk,vlan划分
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/134252898