Код выполняет условие неправильно?

Основной вопрос здесь,

Я написал следующий блок:

    IDEAL
    MODEL small
    STACK 100h
    DATASEG

    Var1 db 4
    Var2 db 2

    CODESEG

start:
    mov ax, @data
    mov ds, ax
    xor ax, ax
    mov al, [Var1]
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 1
Var1Greater:
    mov ax, 0

Я новичок в сборке.

Я хотел создать код, который сравнивает [Var1] с [Var2].

IF (!) [Var1] больше, чем [Var2], выполнить mov ax, 1, ЕСЛИ (1) что-либо еще (равное или меньшее) исключительное, mov ax, 0,

Как это может быть сделано? код, который я написал, выполняет обе инструкции, если условие выполняется.

2 ответа

Решение

Ах, Turbo Assembler "Идеальный" режим; Прошло много времени с тех пор, как я в последний раз видел это. Я люблю идеальный режим. Он намного лучше продуман и имеет гораздо больший смысл, чем синтаксис Microsoft Assembler.

Что ж, происходит то, что обе инструкции выполняются.

Первый, mov ax, 0 выполняется, а затем управление переходит к следующему оператору, который mov ax, 1так что вы остались в ax является 1,

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

Итак, что вам нужно, это:

    ...
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 0
    jmp skip
Var1Greater:
    mov ax, 1
skip:

Кроме того, это хорошая форма при написании ассемблера xor ax, ax вместо mov ax, 0,

Вы должны перепрыгнуть Var1Greater тоже пропустить mov ax, 1 инструкция. В качестве альтернативы вы можете сделать это следующим образом:

mov ax, [Var1]
cmp ax, [Var2]
mov ax, 1
jg  skip0
mov ax, 0
skip0:
Другие вопросы по тегам