assembly - 如何知道在 LDRH 指令中将哪些半字位(8 位)移到 Rd(目标寄存器)?
问题描述
我正在做一个硬件,我必须为 LDRH 指令制作内存指令格式和单个数据路径周期。在计算地址(rn + 扩展 imm12)之后,我们得到一个 32 位值存储在 Rd 中,但是 32 位值(二进制)中的 8 位将存储在 Rd 中(我知道 8 位将存储在较低的路的尽头?
我也在 Arm32 中工作,并将其视为示例 LDRH Rd , [Rn ,#imm12]。
这是问题
考虑 ARM ISA 中的 LDRH(加载半字)指令。指令格式如下: LDRH Rd, [Rn,#imm12] 该指令从(Rn + 0-扩展立即数)指定的地址读取 8 位(1 字节)数据,并将数据存储为符号扩展的 32 位值到目标寄存器 Rd。
(a) 给出 LDRH 指令的 32 位指令格式。根据您对 ARM 体系结构的了解来命名格式。清楚地标记所有指令字段并提及每个字段的大小(以位为单位)。
(b)。在作业的下一页修改单周期 ARM 处理器以实现 LDRH。显示数据路径中所有必要的更改,并绘制执行指令可能需要的任何其他控制信号。请使用与图表颜色不同的颜色笔/荧光笔(或不同的字体和线条颜色,如果提供数字解决方案),以使标记更容易理解您的解决方案。
解决方案
如何知道半字位(8位)...
...并将数据作为符号扩展的 32 位值存储到目标寄存器 Rd 中。
在 ARM 术语中,“ word ”表示 32 位,“ halfword ”表示 16 位。
此外,该LDRH
指令不进行符号扩展,而是进行零扩展。
这里描述的指令是LDRSB
,不是LDRH
。LDRSB
符号扩展 8 位。
计算地址后……我们得到一个 32 位的值,它存储在 Rd 中,但是 32 位中的 8 位……要存储?
计算出的地址不会存储到任何寄存器中。该地址用于寻址 RAM(或任何类型的存储器)中的一个字节。
换句话说:计算的地址是内存中某处的地址。
将读取存储在该地址的字节。
该字节将被写入寄存器的低 8 位Rd
。因为指令对值进行符号扩展,所以读取的值的第 7 位值将被复制到 的第 31...8 位Rd
。(假设我们在谈论LDRSB
。)
这样做是因为(如在十进制系统中)一个正数在添加“零”数字(在二进制系统中:位)时保持不变,而在二进制补码算术中,一个负数在添加“一”位时保持相同:
decimal 12 = decimal 0000012
01100 = 000000001100 = decimal 12
10100 = 111111110100 = decimal -12
...如果在使用二进制补码时设置了最高位,则一个数字被解释为“负”数。
该指令LDRB
将对值进行零扩展,这意味着二进制数不会被解释为二进制补码,而是被解释为没有符号的正数:
10100 = 000000010100 = decimal 20
因此LDRB
只需将位 31...8 设置为零。
对于 16 位指令 (LDRH
和LDRSH
),将读取两个字节:
计算出的地址处的字节将被读入低 8 位,随后的字节将被读入 15...8 位。在 ;的情况下,第二个字节的最高位将被复制到第 31...16 位LDRSH
。在 的情况下,这些位将简单地设置为零LDRH
。
例子:
R0 = 1234000 (decimal)
Content of the memory:
Address 1234012: 9A (hexadecimal)
Address 1234013: 7A (hex.)
Address 1234014: BC (hex.)
Address 1234015: DE (hex.)
Address 1234016: 7E (hex.)
Program:
LDRSB R1, [R0, #12]
LDRSB R2, [R0, #13]
LDRB R3, [R0, #12]
LDRSH R4, [R0, #14]
LDRSH R5, [R0, #15]
LDRH R6, [R0, #14]
Results:
R1 = FFFFFF9A
R2 = 0000007A
R3 = 0000009A
R4 = FFFFDEBC
R5 = 00007EDE
R6 = 0000DEBC
推荐阅读
- c++ - 从 x86 更改为 x64 后的链接器错误
- machine-learning - pytorch 中使用 torch.no_grad() 的范围
- node.js - node.js Osmosis 编译 js 后得到结果
- flutter - Flutter,多个浮动操作按钮(缺口)
- android - 确保文件不存在 friestore
- c# - Animator 没有播放 AnimatorController
- angular - 使用反应形式的离子 5 和 Angular 9 出现错误“无名称的表单控件的值访问器”
- javascript - 使用 InteractJS 拖动多个对象
- c# - 这个协方差相关代码背后的意义是什么?
- grafana - 如何使用 Grafana 获取存储在 InfluxDB 中的计数器类型值的总跨时间值?