在x86汇编中减去两个64位数的正确方法

时间:2014-03-24 07:25:49

标签: assembly x86 subtraction

我正在使用32位系统并在EDX中保存了64位数:EAX。我正在尝试减去ESI中保存的数字:EDI是正确的吗?我很确定这不是因为经过3次迭代后结果不正确。

sub %esi, %edx          #Subtract two 64 bit numbers
sub %edi, %eax

1 个答案:

答案 0 :(得分:9)

您需要进行两项更改:

  1. 首先减去低位32位,而不是高位
  2. 如果低阶32位的减法生成borrow,则需要从高阶位中减去一个。幸运的是,CPU会记住是否存在借用(在carry flag CF中)并且有一条指令要借借减去,SBB
  3. 这是最终代码

    sub %edi, %eax          # Subtract low order 32-bits, borrow reflected in CF
    sbb %esi, %edx          # Subtract high order 32-bits, and the borrow if there was one