0

我知道有很多方法可以做到这一点,我正在努力寻找最有效的方法。

我试图避免的一种特殊方法是从零中减去数字,因为它涉及将值从曾经为 0 的寄存器传输回包含预先否定的数字的寄存器,这将是一种痛苦。

4

2 回答 2

0

从我在网上能找到的关于 Y86 的有限信息来看,它是 x86 的简化版本。x86 指令集有一个NEG对数字求反的指令。Y86 没有。您可能必须从 0 中减去您的值。

于 2014-11-17T01:09:24.140 回答
0

抱歉,Y86 是有限的,所以几乎任何你能想象到的操作最终都会比简单的 0 减法消耗更多的卡路里。

我们可以做什么优化 0 的建立(通过使用 XOR)和中间值的保存/恢复(通过使用堆栈。)

以下代码有效:

 #
 # Negate a number in %ebx by subtracting it from 0
 #
 Start: 
  irmovl $999, %eax    // Some random value to prove non-destructiveness
  irmovl Stack, %esp   // Set the stack
  pushl %eax           // Preserve 

 Go:
  irmovl $300, %ebx
  xorl %eax, %eax
  subl %ebx,%eax
  rrmovl %eax, %ebx

 Finish:
  popl %eax             // Restore 
  halt

 .pos 0x0100
 Stack: 
于 2015-11-18T01:33:21.580 回答