2015-02-23 4 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 eax 
add eax, 1h 

Или:

not eax 
inc eax 
+0

Спасибо за помощь, это сработало! – user3335607