有关签名/未签名的加载和存储指令(MIPS)的说明

时间:2011-08-29 04:44:43

标签: assembly mips

即使借助Google和我手中的教科书,我似乎无法掌握这些内容的概念。

遵循格式(操作码,rs,rt,偏移)......

  • 您是否在将偏移量添加到地址值之前对其进行扩展?或者在扩展之前添加?
  • lb lbu 的情况下,有什么区别?它是否也遵循MIPS算术定义'unsigned'只是意味着它不会报告溢出?
  • lw 为什么没有未签名的版本?即使商店说明书也没有...

1 个答案:

答案 0 :(得分:30)

  

对于lblbu,有什么区别?

“加载字节”指令lblbu将单个字节加载到32位寄存器的最右侧字节中。你如何设置高24位? unsigned 操作将它们设置为零;签名操作将sign-extend加载的字节。

例如,假设您从内存中读取字节0xFFlbu会将此值0扩展为0x000000FF并将其解释为255,而lb会将其符号扩展为0xFFFFFFFF,这将被解释为-1。

  

为什么lw没有未签名的版本?即使商店说明书也没有......

另一方面,“加载字”指令(lw)将32位数量加载到32位寄存器中,因此没有歧义,也不需要特殊的签名版本

如果存储的字不到一个完整的32位字,那么除了丢弃它们外,你无法对寄存器中的额外位做任何事情(忽略它们)。

  

它是否也遵循MIPS算法定义'unsigned'只是意味着它不会报告溢出?

我认为此约定仅适用于加减指令。对于其他指令,signed / unsigned指示是否将执行符号扩展。

  

您是否在将偏移量添加到地址值之前对其进行扩展?或者在扩展之前添加?

如果对符号进行符号扩展,则只有在将其添加到基址之前才有意义。我认为对two's complement算术的回顾会明确这一点。