Что делать, если непосредственный номер находится вне диапазона перед операциями со знаком - PullRequest
0 голосов
/ 03 ноября 2019

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

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

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

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

Вот мой код и вывод:
Код 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

In 'Код 1:' Я ожидаюOF = 0 и CF = 1
В 'Коде 2:' Я ожидаю, что CF = 1
'Код 3:' его вывод правильный

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

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

1 Ответ

0 голосов
/ 03 ноября 2019

Интерпретация подписи 2 битового шаблона 80h равна -128. Вот что важно для sub наборов OF. См. Также Понимание условий / флагов переноса и переполнения для подписанного и неподписанного.

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

...