Что делать, если непосредственное число выходит за пределы диапазона до операций с числами со знаком

Одно из моих домашних упражнений выглядит следующим образом:

mov al,77h  
sub al,80h  
AL=_______  
CF=_______  
OF=_______  

Когда я впервые увидел это, я подумал, что результат "положительное число минус положительное число" не переполнится. И я просто сделал OF равным 0.
Но мой ассемблерный код показывает мне, что OF=1.

Я использую 32-битную консольную среду MASM6.15

Вот мой код и результат:
Код 1:

; eg000000.asm in Windows Console  
    include io32.inc  
    .data  
    .code  
start:  
        mov al,77h ;119  
        sub al,80h ;128  
        call disprf ;show those 6 flags  
        call dispbd ;binary  
        call dispcrlf  
        call disphd ;hexadecimal  
    exit 0  
    end start  

Выход 1:

OF=1, SF=1, ZF=0, AF=0, PF=0, CF=1  
000000000001100111111111 1111 0111  
0019FFF7  

Код 2:

; eg000000.asm in Windows Console  
    include io32.inc  
    .data  
    .code  
start:  
        mov al,77h  
        add al,-80h ;-128  
        call disprf  
        call dispbd  
        call dispcrlf  
        call disphd  
    exit 0  
    end start

Выход 2:

OF=0, SF=1, ZF=0, AF=0, PF=0, CF=0  
000000000001100111111111 1111 0111  
0019FFF7  

Код 3:

; eg0000.asm in Windows Console
    include io32.inc
    .data
    .code
start:
        mov al,77h
        sub al,7fh ;127
        call disprf
        call dispbd
        call dispcrlf
        call disphd
    exit 0
    end start

Выход 3:

OF=0, SF=1, ZF=0, AF=1, PF=0, CF=1
000000000001100111111111 1111 1000
0019FFF8

В 'Код 1:' я ожидаю OF=0 и CF=1
'В' Код 2:'Я ожидаю CF=1
' Код 3:'вывод правильный

Может ли кто-нибудь сказать мне, почему это так и что, если непосредственное число выходит за пределы диапазона, такого как "Код 1:", до того, как компьютер завершит свои вычисления. Я знаю, что независимо от числа со знаком или без знака, компьютер просто не знает об этом.

BTW: Мой первый вопрос здесь. Если я что-то сделал не так, я буду признателен, если вы укажете на это и подскажете, как это сделать правильно.:)

1 ответ

Решение

Подписанное 2-дополнительное толкование 80h битовый шаблон -128. Вот что важно для того, какsubнаборы. См. Также Общие сведения об условиях / флагах переноса и переполнения для подписанных и неподписанных.

-80h имеет то же значение и будет собираться в один и тот же машинный код.

Другие вопросы по тегам