Сборка х86 с использованием 32 бита. Как я могу перейти к метке, если мое условие верно? - PullRequest
0 голосов
/ 06 марта 2019

Я изучаю ассемблер, и я довольно новичок в этом.Я делаю программу базовых сумм, и когда она будет завершена, у меня будет приглашение спросить, хочу ли я «продолжить: да / нет».Когда я вызываю readChar (хранит в регистре AL) и вызываю команду JE (jump equal), ничего не происходит.Не похоже, что он записывает ввод символов в регистр.Он не прыгает на мою метку "L2" и продолжается построчно.Есть идеи почему?

INCLUDE Irvine32.inc

.data
firstPrompt BYTE "Enter first 16 bit unsigned integer: ", 0
secondPrompt BYTE "Enter second 16 bit unsigned integer: ", 0
reenterPrompt BYTE "The number must be between 0 and 65,535 ", 0
continuePrompt BYTE "Continue: y/n:", 0
sumPrompt BYTE "Sum = ", 0
arr BYTE 5 DUP (?), 0

.code
main PROC  

L1:
     mov edx, OFFSET firstPrompt
     call writeString
     call readInt
     cmp eax, 0
     jl falseCase
     cmp eax, 65535
     ja falseCase
     mov bx, ax ;bx = first int
L2:
     mov edx, OFFSET secondPrompt
     call writeString
     call readDec ;ax = second int
     cmp ebx, 65535 
     jl falseCase
     cmp bx, 0
     jae trueCase
trueCase: ;if true, sum both intergers, print the sum and prompt to continue
     add ax, bx
     mov edx, OFFSET sumPrompt
     call writeString
     call writeDec
     call crlf
     mov edx, OFFSET continuePrompt
     call writeString
     call readChar
     cmp al, 'y'
     or al, 'Y'
     call crlf
     je L2
falseCase:
     mov edx, OFFSET reenterPrompt
     call writeString
     call crlf
     jmp L1

1 Ответ

0 голосов
/ 06 марта 2019

or - побитовая операция ИЛИ, которая устанавливает ZF в соответствии с нулевым результатом или нет. Это засоряет флаг-результат cmp, прежде чем вы прочитаете его с помощью je

Я думаю, вы пытаетесь проверить, является ли al 'y' или 'Y',Поскольку эти значения различаются только в одной битовой позиции, вы можете проверить оба, игнорируя этот бит (безоговорочно устанавливая или сбрасывая его).

например, or al, 0x20 для принудительного ввода строчных букв (если это был Y), тогда cmp al, 'y' чтобы установить флаги в соответствии с al - 'y' (то есть установить ZF, если они равны).

См. В чем идея ^ = 32, которая преобразует строчные буквы в верхние и наоборот?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...