такой вопрос, почему в регистр dx не записывается 2 часть отрицательного числа?
как я понял при переполнении число записывается в 2 регистрах AX, DX, но в моем случае просто записывается часть в AX, а в dx ничего не записывается.
data segment
a dw 60231
b dw 30132
c dw 15712
x dw ?
rez dd 0
data ends
code segment
assume cs: code, ds: data
start:
mov ax, data
mov ds, ax
mov AX, b ; Загрузить значение b в регистр AX
mov BX, a ; Загрузить значение a в регистр BX
mov CX, 4 ; Загрузить значение C в регистр CX
sal bx, 1 ; Умножить значение A на 2 (BX = 2A)
mov word ptr rez, bx
jnc dop1
adc word ptr rez+2,0
dop1:
mul cx; умножаем значение b на 4
mov word ptr rez, ax
jnc dop2
adc word ptr rez+2,0
dop2:
add ax, b; 4b+1
mov word ptr rez, ax
jnc dop3
adc word ptr rez+2,0
dop3:
add ax,bx; 5B+ 2A
mov word ptr rez, ax
jnc dop4
adc word ptr rez+2,0
dop4:
add ax,c
mov word ptr rez, ax
jnc dop5
adc word ptr rez+2,0
dop5:
neg ax ; делаем результат отрицательным
mov word ptr rez, ax
jnc dop6
adc word ptr rez+2,0
dop6:
mov word ptr x,ax
mov word ptr x+2,dx
quit:
mov ax, 4c00h
int 21h
code ends
end start
Ответы (2 шт):
В общем случае в процессоре есть флаг переполнения, который устанавливается, если в результате какой-либо операции происходит переполнение. Так же в него приходит значение при операциях сдвига. Вот этим и воспользуйтесь для формирования старшей части результата.
NEG выполняет отрицание только одного регистра. Если вам нужно поменять знак длинного числа - NEG подходит только для младшей части, для старших нужно использовать комбинацию NOT+ADC. Например:
neg ax
not dx
adc dx,0
Обратите внимание, что перед ADC с нулевым операндом не нужно делать JNC - проверка CF уже заложена в инструкцию.
Кроме того, в вашем коде ошибка - вы собираете переносы в res+2, но никогда их не используете.