Не могу понять JZ, не работает, как ожидалось - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь понять, почему команда jz equ не работает в моем коде. Понятно, что команда перед ним (xor bl, bh) устанавливает нулевой флаг в 1 и все же, когда я отлаживаю программу, она не переходит в equ.

Что мне здесь не хватает?

Я не могу заставить прыжок ноль работать ... Пробовал другие тесты кода с прыжком ноль, которые тоже не удалось Я что-то упускаю из-за команды перехода с нуля, но что это?

.model small
.stack 10h
.data
.code
start:
      mov ax, @data
      mov ds, ax

      mov ch, 0
      mov cl, 0
      mov bh, 21h
      mov bl, 21h
      xor bl, bh
      jz equ
      not ch
      and ch, cl
      jmp end
equ:
      add bh, bl
end:
      mov ah, 4ch
      int 21h

End start

1 Ответ

0 голосов
/ 16 января 2019
jz equ

Вышеуказанное equ является директивой, которая говорит ассемблеру заменять все вхождения текста "jz" на без текста . Вот почему ваш условный переход не выполняется. Это даже не там!

Вот инструкции, которые выполняет ваша программа:

 mov ax, @data
 mov ds, ax
 mov ch, 0
 mov cl, 0
 mov bh, 21h
 mov bl, 21h
 xor bl, bh    \
                |No jump was encoded here
 not ch        /
 and ch, cl
 jmp end

end:
 mov ah, 4ch
 int 21h

Просто выберите лучшее название для этого ярлыка:

  xor bl, bh
  jz  IsZero
  not ch
  and ch, cl
  jmp end
IsZero:

Я надеюсь, что вы не пришли к выводу, что jz equ не работает, просто взглянув на регистрационную дамп в конце вашей программы, потому что все регистры будут иметь одинаковые конечные значения независимо от этого. BX=2100h CX=0000h

Ни одна ветвь не изменяет значения регистра в конце:

  • провалиться

    not ch         0 becomes 255
    and ch, cl     255 returns back to 0
    
  • скачок, если ноль

    add bh, bl     21h is raised by 0
    

.stack 10h

Лучше настроить больший стек. 16 байт это несколько нереально. Я предлагаю минимум 256 байт.

...