• ARM汇编


    ARM UAL模拟器VisUAL

    在这里插入图片描述
    VisUAL模拟的ARM板子如图,它没有模拟外设,仅仅模拟了CPU、ROM、RAM。
    红色区域不能读不能写,只能运行其中的程序。
    RAM可读可写。

    栈的4种方式

    根据栈指针指向,可分为满(Full)/空(Empty)

    • 满SP指向最后一个入栈的地址,需要先修改SP再入栈
    • 空SP指向下一个位置,先入栈再修改SP

    根据压栈时SP的增长方向,可分为增/减:

    • 增:SP变大
    • 减:SP减小

    组合就有四种方式:

    • 满增
    • 满减
    • 空增
    • 空减

    常用的是满减
    入栈时用STMDB,也可以用STMFD
    出栈是用STMIA,也可以用LDMFD

    在这里插入图片描述

    压栈就是先减后存,出栈就是先读后增

    MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

    位操作
    AND R1,R2,#(1<<4)
    BIC R1,R2,#(1<<4)
    ORR R1,R2,R3

    比较
    CMP R0,R1;比较R0-R1的结果
    CMP R0,#0x12
    在这里插入图片描述
    在这里插入图片描述

    分支/跳转指令

    • B:Branch,跳转。
    • BL:Branch With Link,跳转前先把返回地址保存在LR寄存器中。
    • BX/BLX:根据跳转地址的BIT0切换为ARM状态或Thumb状态(0:ARM状态,1:Thumb状态)

    ADR PC,LR

    进制

    在这里插入图片描述
    几进制就逢几进一

    10进制里,每一位的权重,从右往左数:个十百千万,也就是:10^0, 10^1, 102,103……
    16进制里,每一位的权重,从右往左数,分别是:16^0, 16^1, 16^2, 16^3, 16^4, ……
    8进制里,每一位的权重,从右往左数,分别是:8^0, 8^1, 8^2, 8^3, 8^4, ……
    2进制里,每一位的权重,从右往左数,分别是:2^0, 2^1, 2^2, 2^3, 2^4, ……

    10进制,逢10进1,16 = 110^1 +610^0 = 16
    16进制:逢16进1, 0x10 = 116^1 + 016^0 = 16
    8进制: 逢8进1, 020 = 28^1 + 08^0 = 16
    2进制: 逢2进1, 0b10000 = 12^4 + 02^3 + 02^2 + 02^1 +0*2^0 = 16

    它们表示的值是一样的。

    在代码里,
    10进制这样写:123456789,每位最大值为9
    16进制这样写:0x12ABCDEF, 每位最大值为15,
    A表示10,B表示11,C表示12,D表示13,E表示14,F表示15
    8进制这样写:01234,每位最大值为7
    2进制这样写:0b0110,每位最大值为1 (注意:C语言没有二进制数值的表示方法)

    硬件上用多个晶体管表示数据,晶体管只有2个状态,0和1。——二进制
    后续为了简便,使用八进制和十六进制表示。

    在C语言中表示:

    • 二进制前面加0b(程序里没有)
    • 八进制前面加0
    • 十六进制前面加0x

    字节序

    假设int a = 0x12345678;
    16进制数中每位数值占据4 bit;在内存中,是以8个bit作为1byte。
    因此0x12345678中每两位作为1byte, 其中0x78是低byte,0x12是高byte。

    在内存中的存储方式有两种:
    在这里插入图片描述
    0x12345678的低位(0x78)存在低地址,即方式1,叫做小字节序(little endian)。
    0x12345678的低位(0x78)存在低地址,即方式2,叫做大字节序(big endian)。

    一般ARM芯片都是小字节序,有些处理器,可以设置某个寄存器,让整个系统使用大字节序或小字节序。

    位操作

    嵌入式开发中,只涉及逻辑移位,不关心符号位,都是补0。

    算术移位,需要分有符号型值和无符号型值:

    • 对于无符号型值,算术移位等同于逻辑移位。
    • 对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1。

    程序处理的4个步骤

    在这里插入图片描述

    1. 预处理
    2. 编译
    3. 汇编:把汇编文件转换成目标文件(里面是机器码)
    4. 反汇编:把可执行文件(目标文件,机器码)转换成汇编文件。

    KEIL下如何生成反汇编

    在KEIL的User选项中,如下图添加这两项:

    fromelf  --bin  --output=led.bin  Objects\led_c.axf
    fromelf  --text  -a -c  --output=led.dis  Objects\led_c.axf
    
    • 1
    • 2

    在这里插入图片描述
    然后重新编译,就会得到二进制文件led.bin,反汇编文件led.dis。

    在这里插入图片描述

    GCC下反汇编

    使用GCC工具链编译程序时,在Makefile中有这一句:

    $(OBJDUMP) -D -m arm  led.elf  > led.dis	# OBJDUMP = arm-linux-gnueabihf-objdump
    
    • 1

    它就是把可执行程序led.elf,反汇编,得到led.dis。

  • 相关阅读:
    Centos7通过SSH使用密钥实现免密登录
    机器学习——图片处理应用(人脸补全)
    我的这段代码为什么总是报错“”is not in list,怎么改呢?
    艾美捷细胞计数试剂盒-8(CCK-8),一步到位
    【愚公系列】2022年11月 .NET CORE工具案例-.NET 7中的WebTransport通信
    Spring Cloud:微服务架构的利器与应用实践
    对LitJson开源插件的自定义尝试
    Vue中的图标
    手机浏览器风生水起,多御安全浏览器手机版升级上线
    【电路中的滤波器】1.一阶RC低通滤波器详解
  • 原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/134280239