如何知道在LDRH指令中哪些半字位(8位)要移位到Rd(目标寄存器)?

问题描述 投票:0回答:1

我正在做一个h.w,我必须为LDRH指令制作一个存储器指令格式和单个数据路径周期。在计算地址(rn +扩展的imm12)之后,我们得到一个存储在Rd中的32位值,但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。显示数据路径中的所有必要更改,并绘制实现指令可能需要的任何其他控制信号。请使用不同颜色的笔/荧光笔(或提供数字解决方案的不同字体和线条颜色),而不是图表上的颜色,以便标记更容易理解您的解决方案。

assembly arm
1个回答
0
投票

怎么知道半字位(8位)...

...并将数据作为符号扩展的32位值存储到目标寄存器Rd中。

在ARM术语中,“字”表示32位,“半字”表示16位。

此外,LDRH指令不进行符号扩展,但它是零扩展。

这里描述的指令是LDRSB,而不是LDRHLDRSB签署 - 扩展8位。

在计算地址后......我们得到一个存储在Rd中的32位值,但是32位中的8位是要存储的吗?

计算的地址不存储在任何寄存器中。该地址用于寻址RAM中的一个字节(或任何类型的存储器)。

换句话说:计算的地址是存储器中某处的地址。

将读取存储在该地址的字节。

该字节将写入寄存器Rd的低8位。因为指令对值进行了扩展,所以读取的值的第7位将被复制到Rd的第31 ... 8位。 (假设我们正在讨论LDRSB。)

这样做是因为(在十进制系统中)正数在前置“零”数字时(在二进制系统中:位)保持不变,在二进制补码算术中,当前面加“1”位时,负数保持不变:

decimal 12 = decimal 0000012
01100 = 000000001100 = decimal 12
10100 = 111111110100 = decimal -12

...如果在使用二进制补码时设置了最高位,则数字被解释为“负数”。

指令LDRB会对值进行零扩展,这意味着二进制数不会被解释为二进制补码,而是一个没有符号的正数:

10100 = 000000010100 = decimal 20

因此,LDRB只会将位31 ... 8设置为零。

对于16位指令(LDRHLDRSH),将读取两个字节:

计算出的地址的字节将被读入低8位,并且该字节后面的字节将被读入位15 ... 8。在LDRSH的情况下,第二个字节的最高位将被复制到位31 ... 16;在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
© www.soinside.com 2019 - 2024. All rights reserved.