Почему инструкция сравнения не работает? - PullRequest
0 голосов
/ 01 ноября 2018

Итак, у меня есть простой код сборки в 8086, который сравнивает значение в переменной value со значением 100 и, если оно больше, выводит: «Значение больше 100», а если нет: «The значение не превышает 100 ".

Вот код:

data segment
    string db "The value is larger$"
    value db 80
    right db "The value is greater than 100$"
    wrong db "The value is not greater than 100$"
ends

stack segment
    dw 128 dup(0)
ends

code segment
start:

    mov ax, data
    mov ds, ax
    mov es, ax

    lea ax, value
    cmp ax, 100d
    jae StatementWrong

StatementRight:
    lea dx, right
    jmp Ending

StatementWrong:
    lea dx, wrong

Ending:
    mov ah, 9
    int 21h

    mov ah, 1
    int 21h

    mov ax, 4c00h
    int 21h

ends

Однако проблема не в том, какое значение я имею, будет ли оно больше или нет 100, всегда выполняется сегмент StatementRight .

Есть идеи о том, что может быть причиной проблемы?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018
lea ax, value
cmp ax, 100d
jae StatementWrong

3 инструкции, все 3 неправильно!

Инструкция lea загружает адрес переменной value . Вам нужен его контент. Вы получаете это с помощью одной из следующих инструкций:

mov al, value

или

mov al, [value]

Поскольку переменная value определена как байт, ваш код также должен сравнивать ее как байт.

cmp al, 100

Сообщение, которое принадлежит StatementWrong , гласит: «Значение не больше 100». Почему тогда вы переходите к этому сообщению , когда сравнение дает ВЫШЕ ИЛИ РАВНОЕ? Это противоречиво.

jng StatementWrong

--------------------------------------------

В контексте (и немного улучшилось!):

  mov  al, [value]
  cmp  al, 100
  lea  dx, right    ; "The value is greater than 100$"
  jg   Ending       ; JG means JUMP IF GREATER
  lea  dx, wrong    ; "The value is not greater than 100$"
Ending:
  mov  ah, 09h
  int  21h
0 голосов
/ 02 ноября 2018

Другая проблема заключается в том, что вы объявляете значение как BYTE, но загружаете WORD в AX. Есть несколько решений для этого, но простое было бы;

    cmp     al, 100

или

value:   dw   100

таким образом, высокий порядок AX обнуляется, и использование CMP AX работает.

...