Код выполняет условие неправильно?
Основной вопрос здесь,
Я написал следующий блок:
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: