在汇编中减去负数
subtracting negative numbers in assembly
我知道为了在汇编中将数字变成负数,我需要通过异或运算然后加一将其变成二进制补码。
我已经这样做了,但我的输出仍然不正确,有人可以向我解释我哪里出错了吗?
目的是减去-val1 - val2 - val3
这是我的大部分代码
.data
val1 dword 10000h
val2 dword 40000h
val3 dword 20000h
finalVal dword ?
.代码
主要过程
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
最后的结果应该是EAX=FFF90000
但目前我的输出是 EAX=FFFA0001
请注意,我使用的是 32 位数字,运行这是在 x86 处理器上使用的。
感谢您的帮助
这行不通:
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
我知道为了在汇编中将数字变成负数,我需要通过异或运算然后加一将其变成二进制补码。
我已经这样做了,但我的输出仍然不正确,有人可以向我解释我哪里出错了吗?
目的是减去-val1 - val2 - val3
这是我的大部分代码
.data
val1 dword 10000h
val2 dword 40000h
val3 dword 20000h
finalVal dword ?
.代码 主要过程
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
最后的结果应该是EAX=FFF90000 但目前我的输出是 EAX=FFFA0001
请注意,我使用的是 32 位数字,运行这是在 x86 处理器上使用的。
感谢您的帮助
这行不通:
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