减去装配中的负数

时间:2015-02-23 03:53:04

标签: assembly subtraction negative-number

我知道为了在汇编中将数字变为负数,我需要通过xor'ing然后添加一个来将其变为二进制补码。

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

对象是减去-val1 - val2 - val3

以下是我的大部分代码

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

.CODE 主要PROC

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处理器上运行。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

这不起作用:

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