MRC命令的附加协处理器寄存器的作用是什么?

2024-01-01

引用自 ARMMRC文档,

MRC{2}<c><q> <coproc>, #<opc1>, <Rt>, <CRn>, <CRm>{, #<opc2>}

where:

2如果指定,则选择编码 T2 / A2。如果省略,则选择编码 T1/A1。

<c><q>请参阅第 A8-7 页的标准汇编器语法字段。 ARM MRC2 指令必须是无条件的。

<coproc>协处理器的名称。标准通用协处理器名称为 p0、p1、...、p15。

<opc1>是协处理器特定的操作码,范围为 0 到 7。

<Rt>是目标 ARM 核心寄存器。该寄存器可以是 R0-R14 或 APSR_nzcv。最后一种形式将传输值的位 [31:28] 写入 N、Z、C 和 V 条件标志,并通过将编码的 Rt 字段设置为 0b1111 来指定。在 UAL 之前的汇编语法中,用 PC 代替 APSR_nzcv 来选择这种形式。

<CRn>是包含第一个操作数的协处理器寄存器。

<CRm>是附加源或目标协处理器寄存器。

<opc2>是协处理器特定的操作码,范围为 0 到 7。如果省略,<opc2>假设为 0。

If MRC意味着将单个协处理器寄存器的内容复制到单个ARM寄存器中,原因是什么CRm?另外,我不太确定原因是什么opcode是其中之一,但这无关紧要。


user786653 的这个链接可能一语中的。

我知道旧的 fpu、fpa 使用协处理器接口,如果您解码 fpa 浮点指令,我想您会发现它们与通用协处理器 (mrc/mcr) 的操作码模式一致。

我的观点是,我不会对该指令中的每个字段都感到兴奋,就协处理器而言,某些字段可能不关心。 ARM 处理器和汇编器不一定知道您连接了什么,这是将位模式放入机器指令的通用方法。您需要关注您正在交谈的特定协处理器,其 TRM 特别是具有该逻辑的匹配版本号的 TRM(如果可能,如果来自 ARM)假设该协处理器来自 ARM,如果它是其他人的协处理器,则使用他们的文档。希望该协处理器中每个操作所使用的字段都定义得足够好。如果他们不谈论其中一个字段的含义,我会认为他们不在乎。剪切并粘贴手册中的 mrc/mcr 行(如果有),如果没有,则可能会找到一些已经使用良好的代码,然后剪切并粘贴该模式和/或为未定义的字段尝试不同的操作,看看是否会改变操作。

一般来说,尽管 mrc/mcr 字段定义不是一成不变的,但供应商可以创建协处理器并对这些字段执行任何他们想要的操作。就像 FPA 一样,可能甚至会更改汇编器/反汇编器来创建指令集的新扩展。 ARM核心可能关心ARM寄存器本身,如果协处理器接口本身有一个TRM,如果协处理器读取有一条控制线告诉ARM是否根据协处理器修改指定的ARM寄存器,我不会感到惊讶驱动该信号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MRC命令的附加协处理器寄存器的作用是什么? 的相关文章

  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct

随机推荐