当前位置: 首页 > news >正文

自学嵌入式第四十四天:汇编

一、目的

        初始化硬件,引导启动C语言程序;

        引导C语言启动:

        (1)初始化异常向量表;

        (2)初始各工作模式的栈指针寄存器;

        (3)开启ARM内核中断允许;

        (4)将工作模式设置为user模式;

        (5)完成上述工作后,引导程序进入c语言主函数执行;

二、MOV

        MOV{S}<c> <Rd>, #<const>       

        MOV{S}<c> <Rd>, <Rm>

        mvn r1, r1    //把r1按位取反后放回r1

三、立即数

        1.能被编译器编译进指令中的数字量称为立即数;

        2.立即数的判断方法:

        (1)如果一个数在0-255中间一定是立即数;

        (2)如果将一个数展开为二级制形式,存在一种循环右移偶数位方式,使得移位后的结果的高24位全为0,则是立即数;

        3.imm12(立即数):4位旋转位放循环右移次数/2;imm8放低八位;

四、ADD、SUB

        add r0, r1, #0x4     //r0 = r1 + 4

        add r2, r0, r1      //r2 = r0 + r1

        add r2, r0, r1, lsl #2      //r2 = r0 + 逻辑左移2位的r1

五、LDR加载指令

        ldr r0, =0xffff     //可以赋不是立即数

六、BIC/ORR

        bic:指定位清零;

        bic r0, r1, #0x04       //清第三低位,r0 = r1 & (~(0x04))

        orr:指定位置1;

        orr r0, r1                 //r0 = r0 | r1;

七、状态

        CPSR寄存器中条件判断标志位

        N: 符号标志位:上条指令执行结果最高位bit31为1,则 N = 1, 当结果作为有符号解释时为负值

        Z: 零值标志位:上条指令执行结果为0(即bit0 - bit31 均为0),则 Z = 1;

        C: 进位标志位:进行无符号解读,如果在加法过程中进位或者减法时没有借位,则为 C = 1,否则 C = 0

         V: 溢出标志位:进行有符号解读,是否发生溢出 -2^31 - 2^31-1(两个正数加得负数,两个负数加得正数)

        条件码:eq ge gt le lt al(无条件执行)

        equal:等于

        not equal:不等

八、cmp比较大小

        CMP<c> <Rn>, #<const>

九、B/BL、BX

        B<c> <label>

        BL<c> <label>

        跳转到标签处并存储当前位置到R14(LR)位

        BX<c> <Rm>

        eg:bx lr  //跳转到lr上存储的位置

十、四种系统栈

        1.满减栈

        2.满赠栈

        3.空减栈

        4.空增栈

十一、压栈弹栈

        stmfd sp!, {lr}

        ldmfd sp!, {lr}

 

http://www.dtcms.com/a/393720.html

相关文章:

  • RTX 4090助力深度学习:从PyTorch到生产环境的完整实践指南——模型部署与性能优化
  • PythonOCC 在二维平面上实现圆角(Fillet)
  • Unity 性能优化 之 实战场景简化(LOD策略 | 遮挡剔除 | 光影剔除 | 渲染流程的精简与优化 | Terrain地形优化 | 主光源级联阴影优化)
  • [GXYCTF2019]禁止套娃1
  • 【论文阅读】-《Triangle Attack: A Query-efficient Decision-based Adversarial Attack》
  • 云微短剧小程序系统开发:赋能短剧生态,打造全链路数字化解决方案
  • 《从延迟300ms到80ms:GitHub Copilot X+Snyk重构手游跨服社交系统实录》
  • 力扣2132. 用邮票贴满网格图
  • Halcon学习--视觉深度学习
  • LeetCode:40.二叉树的直径
  • dplyr 是 R 语言中一个革命性的数据操作包,它的名字是 “data plier“ 的缩写,意为“数据折叠器“或“数据操作器“
  • 使用Node.js和PostgreSQL构建数据库应用
  • 设计模式(C++)详解—享元模式(1)
  • C++线程池学习 Day08
  • VALUER倾角传感器坐标系的选择
  • 解决 win+R 运行处以及文件资源管理器处无法使用 wt、wsl 命令打开终端
  • R语言 生物分析 CEL 文件是 **Affymetrix 基因芯片的原始扫描文件**,全称 **Cell Intensity File**。
  • Apache Spark Shuffle 文件丢失问题排查与解决方案实践指南
  • xtuoj 0x05-C 项链
  • STM32F429I-DISC1【读取板载运动传感器数据】
  • 【Kafka面试精讲 Day 21】Kafka Connect数据集成
  • 2025数据资产管理平台深度分析:技术特性、与选型逻辑
  • RabbitMQ Java 解决消息丢失、重复和积压问题
  • 深入解析 Spring AI 系列:解析请求参数处理
  • OpenLayers地图交互 -- 章节五:捕捉交互详解
  • 阿瓦隆1566HA-448T矿机深度解析:性能、效率与冷却技术
  • 平替confluence,推荐一款国产开源免费的知识管理工具 - sward
  • 【开源】基于STM32的智能垃圾桶
  • RuoYi-Cloud问题:访问https的网关地址,实际是访问http的文件服务
  • HttpClientFactory vs new HttpClient:.NET Core HTTP 客户端的正确打开方式