描述
L16SI
是一个从内存中加载16位带符号数据的指令。它通过将地址寄存器的内容与指令字中编码的一个左移一位的8位零扩展常数值相加来形成一个虚拟地址。因此,偏移量可以指定从0到510之间的两倍数。从物理地址处读取16位(两个字节)的数据。然后,这些数据被符号扩展并写入目标寄存器。
如果启用了区域翻译选项(第226页)或MMU(内存管理单元)选项(第241页),则虚拟地址会被翻译成物理地址。如果没有启用这些选项,则物理地址与虚拟地址相同。如果翻译或内存引用遇到错误(例如,保护违规、不存在的内存),处理器会引发若干异常之一(参见第142页的4.4.3.5节)。
如果不启用非对齐异常选项(第153页),最低有效地址位将被忽略;对奇数地址的引用会产生与对地址减一相同的引用结果。如果启用了非对齐异常选项,则这样的访问会引发异常。
解释
这段描述解释了L16SI
指令的功能及其操作细节:
-
指令功能:
L16SI
是一个从内存中加载16位带符号数据的指令。- 它用于从内存中读取两个字节(16位)的数据,并将其符号扩展为32位的数据。
-
地址计算:
- 形成虚拟地址的方式是将地址寄存器的内容与指令字中编码的一个左移一位的8位零扩展常数值相加。
- 偏移量可以指定从0到510之间的两倍数(即0到255乘以2)。
-
数据读取与扩展:
- 从计算出的物理地址处读取16位(两个字节)的数据。
- 这些数据被符号扩展为32位的数据,并写入目标寄存器。
-
地址翻译:
- 如果启用了区域翻译选项或MMU(内存管理单元)选项,虚拟地址会被翻译成物理地址。
- 如果没有启用这些选项,则物理地址与虚拟地址相同。
-
错误处理:
- 如果在地址翻译或内存引用过程中遇到错误(如保护违规或不存在的内存),处理器会引发异常。
- 异常的具体处理方式可以在相关的文档中查阅。
-
非对齐访问:
- 如果没有启用非对齐异常选项,最低有效地址位将被忽略;对奇数地址的引用会产生与对地址减一相同的引用结果。
- 如果启用了非对齐异常选项,则这样的访问会引发异常。
示例
假设我们有以下寄存器和内存地址:
a1
:地址寄存器,其值为0x2000
。imm
:指令字中的8位零扩展常数值,其值为0x01
(十进制1)。
那么,执行l16si a2, a1, #0x01
的结果如下:
-
计算虚拟地址:
- 偏移量
imm
左移一位:0x01 << 1 = 0x02
。 - 虚拟地址 =
a1
+0x02
=0x2000
+0x02
=0x2002
。
- 偏移量
-
地址翻译:
- 如果启用了MMU或区域翻译选项,虚拟地址
0x2002
会被翻译成物理地址。 - 如果没有启用这些选项,物理地址仍然是
0x2002
。
- 如果启用了MMU或区域翻译选项,虚拟地址
-
读取数据:
- 从物理地址
0x2002
处读取两个字节的数据。
- 从物理地址
-
扩展并存储:
- 将读取的16位数据符号扩展为32位,并存储到目标寄存器
a2
中。
- 将读取的16位数据符号扩展为32位,并存储到目标寄存器
汇编器注意事项
- 虚拟地址计算:
L16SI
通过计算地址寄存器和指令字中imm8
字段的两倍之和来形成虚拟地址。- 因此,机器码中的偏移量是以16位(2字节)为单位的。
- 然而,汇编器期望的是字节偏移量,并通过除以2来编码到指令中。
通过这种方式,L16SI
指令可以有效地从内存中读取16位带符号数据,并对其进行适当的扩展处理。这在处理短整型数据时非常有用。