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