0
  1. 我们可以使用

orhi r8,r0,%hi(0xffffffff)

addi r8,r0,%lo(0xffffffff)

而不是%hiadjat orhi?

  1. 或者必须是

orhi r8,r0,%hi(0xffffffff)

ori r8,r0,%lo(0xffffffff)

如果我坚持使用%hiat orhi?

  1. %hiadj(0xffffffff)=的结果是0x0001

  2. 然后不会

orhi r8,r0,%hi(0xffffffff)

addi r8,r0,%lo(0xffffffff)

生产0x0001ffff时间r8?不保留 32 位地址。

4

1 回答 1

1
  1. 是的,你可以,但它不会做你认为它做的事情。
  2. 覆盖上一条指令的ori r8,r0,%lo(0xffffffff)结果,因此没有任何意义。
  3. 不,是0x0000( 0xffff + 1)
  4. “那么”它会,但既然不是,它不会:)

使用addi符号扩展,并%hiadj通过添加第 15 位来补偿。之后orhi r8,r0,%hiadj(0xffffffff) r80x00000000addi r8,r0,%lo(0xffffffff)汇编为,但该addi r8,r0,0xffff立即数是 cpu 在运行时将符号扩展为0xffffffff. 这一点,当添加到0x00000000显然给出0xffffffff. 一个更好的例子是尝试加载0x0001ffff. 在这里,%hiadj将给出0x00020000因此添加扩展符号0xffffffff将再次产生正确的结果。

于 2016-03-08T12:56:39.263 回答