такой вопрос, почему в регистр 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 шт):

Автор решения: rotabor

В общем случае в процессоре есть флаг переполнения, который устанавливается, если в результате какой-либо операции происходит переполнение. Так же в него приходит значение при операциях сдвига. Вот этим и воспользуйтесь для формирования старшей части результата.

Флаги состояния и условные переходы

→ Ссылка
Автор решения: user22405329

NEG выполняет отрицание только одного регистра. Если вам нужно поменять знак длинного числа - NEG подходит только для младшей части, для старших нужно использовать комбинацию NOT+ADC. Например:

neg ax
not dx
adc dx,0

Обратите внимание, что перед ADC с нулевым операндом не нужно делать JNC - проверка CF уже заложена в инструкцию.


Кроме того, в вашем коде ошибка - вы собираете переносы в res+2, но никогда их не используете.

→ Ссылка