【问题标题】:subtracting negative numbers in assembly在汇编中减去负数
【发布时间】:2015-02-23 03:53:03
【问题描述】:

我知道为了在汇编中将一个数字变成一个负数,我需要通过异或然后加一个来将它变成二进制补码。

我已经这样做了,但我的输出仍然不正确,有人可以向我解释我在哪里犯了错误吗?

对象是减去-val1 - val2 - val3

这是我的大部分代码

.data val1 dword 10000h val2 dword 40000h val3 dword 20000h finalVal dword ?

.code 主进程

mov eax,val1            ; start with 10000h
xor eax,val1            ; xor eax to make it almost negative
add eax,1h              ; now add one to make it negative
sub eax,val2            ; subtract 40000h
sub eax,val3            ; subtract 20000h
mov finalVal,eax        ; store the result (30000h)
call    DumpRegs        ; display the registers

exit

https://ideone.com/hulsdU

最终结果应该是EAX=FFF90000 但目前我的输出是 EAX=FFFA0001

请注意,我使用的是 32 位数字,并在 x86 处理器上运行。

感谢您的帮助

【问题讨论】:

    标签: assembly subtraction negative-number


    【解决方案1】:

    这行不通:

    mov eax,val1
    xor eax,val1
      ; (a XOR a) is always 0. Using the line above you XOR
      ; val1 with val1 so EAX will always be 0 here!
    add eax,1h
      ; (Ok. EAX will be 1 here...)
    sub eax,val2
      ...
    

    如果你想否定一个数字,你可以使用“NEG”指令:

    neg eax
    

    如果您想使用补码执行此操作,请使用“NOT”指令:

    not eax
    add eax, 1h
    

    或者:

    not eax
    inc eax
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多