簡體   English   中英

使用32位匯編x86。 如果我的情況為真,如何跳轉到標簽?

[英]Assembly x86 using 32bit. How can I jump to a label if my condition is true?

我正在學習匯編,對此我還很陌生。 我正在做一個基本的求和程序,完成后會提示我是否要“繼續:y / n”。 當我調用readChar(存儲在AL寄存器中)並調用JE(跳轉相等)命令時,沒有任何反應。 似乎沒有將字符輸入記錄到寄存器中。 它不會跳到我的“ 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

or是按位或運算,根據結果是否為零來設置ZF。 在用je讀取之前,它會破壞cmp的標記結果

我認為您正在嘗試檢查al'y'還是'Y' 由於這些值僅在一位位置不同,因此您可以通過忽略該位(無條件設置或清除)來進行檢查。

例如or al, 0x20強制小寫(如果為Y ),則cmp al, 'y'根據al - 'y' 'y cmp al, 'y'設置FLAGS(即,如果它們相等,則設置ZF)。

請參閱^ = 32背后的想法是什么,它將小寫字母轉換為大寫字母,反之亦然?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM