ARM day4 汇编及硬件编程

这篇具有很好参考价值的文章主要介绍了ARM day4 汇编及硬件编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、指令--数据从内存到cpu--ldr、str

load -- 加载 读

store -- 存储 写 

在ARM 架构下, 数据从内存到cpu 直接的移动只能通过 LDR/STR来完成 
    mov 只能在寄存器之间移动数据 ,或把立即数移动到寄存器 ,并且数据长度不能超过 8 位

str  r2,  [r0]   //把r2 的数据  存储(写)到 r0 地址      *((int *) r0)  = r2

往右写
ldr  r1, [r0] // 把r0 地址中的数据  加载(读)到 r1 中   r1 = *((int *) r0)

往左读

    三种索引方式:
    LDR R0,[R1, #4]  //r0 = *((int *)(r1 + 4))        只读取数据
    LDR R0,[R1, #4]! // r0 = *((int *)(r1 + 4))  r1 += 4       读取数据且更新r1地址
    LDR R0, [r1],#4  //r0 = *((int *)r1)  r1 += 4         读取数据后更新r1地址?

二、pre or post indexed寻址

ARM day4 汇编及硬件编程,arm开发,汇编

 ARM day4 汇编及硬件编程,arm开发,汇编

ldrb 存一个数据
ldrh 存两个数据
ldr 存四个数据

三、stmXX / ldmXX

     stm  ---store  much   多数据存储(写),将寄存器的值 存到地址上 
      ldm   --- load much   多数据加载(读),将地址上的值加载到寄存器

XX有八种类型

IA(increase After )

每次传送后地址加 4 ,寄存器从左到右执行

STMIA  R0, {R1, LR}

//先存R1, 将R0的地址 加上4 再存 LR
LDMIA R0, {r0,r1,r2}

//将r0 地址中的值 逐个写入 寄存器 r0, r1, r2 

IB(increase Before  ) 每次传送前 地址加 4 ,同上
DA (decrease  After)

每次传送后 地址 减 4寄存器从右往左执行

STMDA R0, {r1, lr}  //先存LR,再存 r1 

DB(decrease  Before) 每次传送前 地址减4 ,同上 
FD满递减堆栈

每次传递前 地址减4

(LDMFD--LDMIA    STMFD--STMDB )

FA满递增堆栈

每次传送后地址减4

(LDMFA--LDMDA; STMFA--STMIB)

ED空递减堆栈

每次传送前地址加4

(LDMED--LDMIB; STMED--STMDA)

EA空递增堆栈

每次传送后地址加4

(LDMEA--LDMDB; STMEA--STMIA)

   四种栈         空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出
        满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针
        增栈:栈指针移动时向地址增加的方向移动的栈
        减栈:栈指针移动时向地址减小的方向移动的栈

    eg: 一般出栈/入栈
        ldmfd sp!,{r0,r1,r2}   //将sp中值逐个写入到寄存器r0 R1 R2中
        stmfd sp!,{r0,r1,r2}   //将寄存器r0 R1 R2中逐个写入到sp中

ARM day4 汇编及硬件编程,arm开发,汇编

重要:异常处理

        ldmfd sp!,{r0-r12,pc}^ --- 出栈 恢复现场
        stmfd sp!,{r0-r12,lr}  --- 入栈 保护现场

ARM day4 汇编及硬件编程,arm开发,汇编

    SP后面的!表示要更新sp的值 sp -= n
    ^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。

四、中断和异常

异常的定义 芯片内部的调度
异常(exception  )机制 处理器,顺序执行程序指令的过程中,突然遇到异常的事情,而中止执行的当前程序,转而去处理异常。 
异常与中断的最大区别

中断--外部因素引起  异常--内部因素引起

(内因:本身硬件故障,程序故障,非法指令,或执行等特殊的系统服务指令等引起的)

异常源

ARM day4 汇编及硬件编程,arm开发,汇编

    1、复位异常 reset
    2、数据异常   data abort
    3、FIQ 异常   fiq 
    4、IRQ 异常   irq
    5、预取指 异常    prefetch abort 
    6、软中断 异常    swi 
    7、未定义指令异常   undefined  instruction 

异常优先级

    异常优先级{
            异常在当前指令完成后才会被响应
            多个异常 在同一时间产生
            异常指定优先级和固定服务顺序(从高到低 )
    }

为什么FIQ的响应速度比IRQ快?

FIQ优先级更高

FIQ向量位于异常向量表的最末,异常处理程序可以从异常量处连续执行

FIQ有五个额外的私有寄存器,中断处理必须保护其使用的非私有寄存器

异常处理过程

ARM day4 汇编及硬件编程,arm开发,汇编

ARM day4 汇编及硬件编程,arm开发,汇编

ARM day4 汇编及硬件编程,arm开发,汇编文章来源地址https://www.toymoban.com/news/detail-809603.html

到了这里,关于ARM day4 汇编及硬件编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM day2、day3 汇编

    @ 注释 # 注释(放在行首表示注释一行) /*    */ 注释 #+数字 立即数 : 一种标号(比如main:        loop:) .text        .end+换行 固定格式 ARM指令构成 ARM 指令包含操作码和一些其他的信息,只剩下8 位存放数据 具体来说,一个 ARM 指令通常由以下部分组成: 操作码(Opcode)

    2024年01月19日
    浏览(60)
  • ARM day5 (点灯实验 汇编&C)

    汇编 C语言 led.h led.c main.c

    2024年02月12日
    浏览(37)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.1 嵌入式系统的基本概念

    嵌入式系统是一种特殊的计算机系统,通常用于执行特定的任务。它通常包含一个或多个微处理器、存储器和外围设备。与通用计算机系统相比,嵌入式系统具有体积小、功耗低、成本低和实时性强等特点。在这一部分,我们将介绍嵌入式系统的基本概念,并通过实例来展示

    2024年02月11日
    浏览(49)
  • [ARM 汇编]高级部分—ARM汇编编程实战—3.3.3 嵌入式应用程序设计实例

    在本章节中,我们将学习如何使用ARM汇编编写一个简单的嵌入式应用程序。我们将以STM32F103微控制器为例,编写一个程序,实现按下按钮时点亮LED的功能。 硬件连接 首先,我们需要将STM32F103微控制器的一个GPIO引脚连接到LED(通过一个合适的电阻),另一个GPIO引脚连接到按钮

    2024年02月10日
    浏览(42)
  • 探索ARM GCC内联汇编器:高效编程的新工具

    项目地址:https://gitcode.com/chunhuajiang/arm-gcc-inline-assembler 在嵌入式开发领域, ARM架构因其低功耗和高性能而广受欢迎。然而,为了充分利用硬件资源并优化性能,开发者常常需要直接使用汇编语言进行编程。ARM GCC内联汇编器是一个专为ARM平台设计的项目,它让C/C++代码与汇编语

    2024年04月12日
    浏览(37)
  • 用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

    ARM 编程模拟器网站地址: 在arm里也有和高级语言一样的for和while循环,可以根据条件来判断是否执行 首先我们创建一个data标签,然后在里面写一个分支,存放一些数值,然后使这些存放的数值依次相加 然后我们要将list加载到内存里 然后使用直接寻址,将r0寄存器里的值放

    2024年02月06日
    浏览(51)
  • Keil MDK配置ARM汇编/C语言混合开发环境

    1. 安装Keil MDK 安装方法这里不再说明,懂得都懂!🐶 2. 安装ARM开发包 在Keil MDK5之后,不再原生支持ARM7/9,需要自行安装软件包,链接在这,注意安装与自己MDK版本对应的那个包 我的版本是5.18,下载之后傻瓜式安装,因为它会自动检测你MDK所在的位置。 3. 新建工程 注意:选

    2024年02月02日
    浏览(60)
  • 【Linux下6818开发板(ARM)】硬件空间挂载

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏         在嵌入式系统开发中,经常需要使用外部硬件

    2024年02月14日
    浏览(42)
  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(49)
  • 【ARM系列】ARM常用汇编指令

    在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。 指令格式:MOV{条件}{S} 目的寄存器,源操作数 指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包