首先看下ARM状态下不同模式下的的寄存器,共37个,31个通用的。

好,问题来了:在快速中断模式下的R8_fiq与其他模式下的R8是不同的寄存器,但是在汇编代码中不会区别寄存器名字。

例如MOV R8,#0x12345678,该命令在快速中断模式下运行,与处快速中断之外的模式下执行,显然访问的是不同的R8寄存器,但是这个访问不同寄存器的过程是编译器做的,还是CPU做的?

通过请教高手得出结论如下:

编译器不能区分r8和r8_fiq

 

名词:r*_fiq (*=8~14)

在Linux内核里,如果要用到快速中断,需要初始化快速中断,首先先设置r*_fiq,然后使能快速中断。系统在同一时刻只能支持一个fiq,允许程序员在系统运行的过程中改变fiq的目标。

下面是摘抄Linux内核里设置r*_fiq的代码:

Linux3.2 arch/arm/kernel/fiqasm.S  line25:

ENTRY(__set_fiq_regs)

mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE

mrs r1, cpsr

msr cpsr_c, r2 @ select FIQ mode

mov r0, r0 @ avoid hazard prior to ARMv4

ldmia r0!, {r8 - r12}

ldr sp, [r0], #4

ldr lr, [r0]

msr cpsr_c, r1 @ return to SVC mode

mov r0, r0 @ avoid hazard prior to ARMv4

mov pc, lr

ENDPROC(__set_fiq_regs)

系统程序员预先初始化一个数组,填上需要放到r8-r14的值,然后调用该函数,参

数为该数组的指针。这个函数主要做的工作是保存cpsr,将当前模式切换成FIQ

模式,将r0指向的内存里的值放到r8-r14(r*_fiq),切换回以前的管理模式,

函数返回。

程序里使用ldmia和ldr指令往r*_fiq寄存器里存储数据。根据ARM指令手册,

ldmia指令操作的register_list(位图)只有16位,下图为LDMIA指令的二进制码,后16位是寄存器列表。

也就是说ldmia指令只能访问r0-r15,不能在指令码里指定更多的寄存器编号。如果想要在指令二进制码里就指明不同模式下的同名寄存器(如指明快速中断模式下的r8_fiq),那就需要不止16位的寄存器编号。

LDR指令也类似,指令码里指明寄存器编号的位段只有4位,也只能访问r0-r15。

从这里我们可以看出编译器并不知道r*_fiq的存在,只能当r*处理。真正区分

fiq寄存器和通用寄存器,需要CPU根据cpsr寄存器的标志位来判断。

下图是CPSR寄存器,后五位组合为不同模式位。

转载于:https://my.oschina.net/victorlovecode/blog/344266

ARM在不同模式下如何区别同名寄存器(如fiq模式下的R8_fiq与其他模式下的R8),从而访问不同的寄存器...相关推荐

  1. CSMA/CD在全双工和半双工模式下的区别

    谈谈以太网中何时使用CSMA/CD冲突检测机制 关于以太网何时使用CSMA/CD检测机制,这个问题前两天刚和朋友做了讨论.在网络上搜索和很久,也有一些同行们不太理解,特别是一些初学CCNA的,没有工作 ...

  2. ARM、DSP、FPGA的区别

    https://blog.csdn.net/godloveyuxu/article/details/80027501 DSP: DSP(digital singnal processor)是一种独特的 ...

  3. ARM指令和Thumb指令的区别

    一.现在先区分下ARM指令集与Thumb指令集        Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率 ...

  4. fiq中断的入口地址_ARM中断模式(IRQ)和快速中断模式(FIQ)区别比较

     概念 IRQ(Interrupt Request):指中断模式. FIQ(Fast Interrupt Request):指快速中断模式. IRQ与FIQ是ARM处理器的两种不同编程模式(ARM有7 ...

  5. J-Link、ST-Link、DAPLink、ULink仿真器区别?以及支持的JTAG、SWD、SWIM下载模式、SWV、串口Printf调试差异?

    参考文章 什么是下载调试器? 简单来说,下载调试器是将PC(例如通过USB协议)发送的命令转换为MCU(负责MCU内部外围设备))理解的语言(例如SWD或JTAG协议)的设备,加载代码并精确控制执行. ...

  6. ARM与X86 CPU架构对比区别

    ARM与X86 CPU架构对比区别 CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计 ...

  7. 关于IAR的一些总结 -- ARM调试和Flash调试的区别

    作者:jicheng0622 最近一直埋头于毕业论文的撰写当中,真是有种"两耳不闻窗外事,一心只写毕业论文"的感觉啊.成天大眼对小眼地面对着word.viso和知网客户端等等文字编 ...

  8. 爱创课堂每日一题第二天8/24日 Quirks模式是什么?它和Standards模式有什么区别?...

    从IE6开始,引入了Standards模式,标准模式中,浏览器尝试给符合标准的文档在规范上的正确处理达到在指定浏览器中的程度. 在IE6之前CSS还不够成熟,所以IE5等之前的浏览器对CSS的支持很差 ...

  9. 模式对话框与非模式对话框的区别

    模式对话框与非模式对话框的区别 模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持 ...

最新文章

  1. 深入理解javascript作用域系列第四篇——块作用域
  2. 皮一皮:这解释...没毛病!
  3. DIY Ruby CPU 分析——Part III
  4. 智能家居 (2) ——设计模式的引入
  5. c语言 二维数组 文库,c语言二维数组练习题
  6. jsp mysql 音乐网站_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
  7. nginx 替换返回请求中的字符
  8. HTML5缓存和GPS定位
  9. Java项目经验是程序员成长的重要经验
  10. java笔试题型_JAVA笔试必备题
  11. Hibernate XXX.hbm.xml 里的class标签的 schema 属性解释
  12. 一个500强公司的数据化运营管理实践 1
  13. excel冻结窗格怎么同时冻结行和列
  14. 【树莓派】Raspberry Pi OS 64 位版本
  15. LibJpeg的安装与修复颜色错误图像错位保姆级教程
  16. php 公众号 模板消息id如何获取_微信公众号后台模板消息如何实现发送的功能...
  17. JAVA实现FTP文件传输
  18. Oracle net architecture
  19. Lucas定理相关证明
  20. 数据库系统概论-005: 数据库完整性(正确性和相容性)

热门文章

  1. StaggeredGridView瀑布流,网格布局
  2. SQLite 的特点
  3. 2017年电大计算机应用基础试题及答案,2017年电大计算机应用基础试题及答案小抄1.doc...
  4. 认识Python的PPT
  5. [创业之路-55] :总经理与CEO的区别?技术副总VP和首席技术官CTO的区别?
  6. 小程序关联公众号推送公众号消息
  7. 计算机网络技术的发展模式背景,浅谈计算机网络技术发展模式
  8. 修改ubuntu18.04分辨率+自定义分辨率
  9. 软件工程国考总结——选择题
  10. Maya2018 快速绑定人物骨骼制作动画并导出fbx