zenz
@zenz

Как вводить и выводить отрицательные числа turbo assembler?

не могу понять, как правильно вводить и выводить отрицательные числа в массиве. отрицательные перевожу в доп код, но они считываются как положительные (возможно, я неправильно использую sf флаг?)

Fill: 
    mov mas[si], al
    add si, 1
    inint ax
    cmp ax, 0
    jnl positiveIn
    not ax
    add ax, 1
    cmp si, N
    jne Fill
positiveIn:
    cmp si, N
    jne Fill

    mov si, 0

Print:   
    mov al, mas[si]
    cmp ax, ax
    jns positiveOut   ;;;;
    sub ax, 1                 
    not ax  
    outch '-'
    outint ax
    outch ' '
    add si, 1
    cmp si, N 
    jne Print

positiveOut:
    outint ax
    outch ' '
    add si, 1
    cmp si, N
    jne Print
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
возможно, я неправильно использую sf флаг?
mov al, mas[si]
cmp ax, ax
jns positiveOut   ;;;;

cmp ax, ax сравнивает ax с самим собой, результат немного предсказуем: они равны, т.е. sf = 0, zf = 1. Чтобы узнать знак числа нужно либо сравнивать его с нулём, либо использовать вместо cmp логическую операцию -- test, or или and.

Кстати, mov al, mas[si] загружает из памяти только al, в ah остаётся мусор от предыдущих операций. По-нормальному после mov нужно сделать знаковое расширение al в ax, если собираешься дальше работать с ax, например так:
mov al, mas[si]
cbw


sub ax, 1                 
not ax

Зачем две инструкции, когда есть neg ax?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы