2015-02-23 76 views
1

我知道爲了在程序集中將數字轉化爲負數,我需要將它變成二進制補碼,然後加上一個。減去程序集中的負數

我已經這樣做了,但是我的輸出結果仍然不正確,有人可以向我解釋我犯了什麼錯誤嗎?

目的是減去-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處理器上運行此數字。

感謝您的幫助

回答

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 
+0

感謝您的幫助,這工作! – user3335607 2015-02-24 21:39:12