我得到了两个 DWORD 值,并将使用
.IF
、.ELSE
、.ELSEIF
比较它们,看看哪个数字更大或者它们是否都相等。例如,屏幕调出两条提示,分别是“输入数字1”和“输入数字2”。数字 1 和数字 2 使用 eax
(代表 num1)和 ecx
(代表 num2)存储到单独的寄存器中。如果 eax
和 ecx
相等,则调用相等提示。
如果不是,那么 .ELSEIF
就派上用场了。eax
与 ecx
进行比较,反之亦然。
唯一的问题是,如果第二个值不相等,那么它们总是大于第一个值。
include asmlib.inc
.data
Prompt BYTE " Enter a number ", 0 ;Type number 1
Prompt2 BYTE " Enter another number ", 0 ;Type number 2
Large BYTE " Is larger ", 0 ;Larger number output
Equal BYTE " Is equal", 0 ;Numbers are equal output
num1 DWORD ? ;Number 1 is num1
num2 DWORD ? ;Number 2 is num2
.code
main PROC
mov edx, OFFSET Prompt ;Enter first number
call writeLine
call readInt
mov num1, eax
endl
mov edx, OFFSET Prompt2 ;Enter second num
call writeLine
call readInt
mov num2, ecx
endl
.IF eax == ecx
mov edx, OFFSET Equal ;display Equal output
call writeString ;display line
.ENDIF
.IF ecx > eax && eax < ecx
mov ecx, num2
call writeInt
mov edx, OFFSET Large
call writeString
.ELSEIF ecx < eax && eax > ecx
mov eax, num1
call writeInt
mov edx, OFFSET Large
call writeString
.ENDIF
exit
main ENDP
end main
mov edx, OFFSET Prompt2 ;Enter second num call writeLine call readInt mov num2, ecx
由于
检索程序输入时出现错误,
.IF
、.ELSEIF
、.ELSE
或.ENDIF
可以执行的所有操作均无效。mov num2, ecx
指令应该读取 mov num2, eax
本质上,您的
.IF eax == ecx
当前正在将第二个数字与 ECX 中恰好存在的任何值进行比较。结果是不可预测的。
.IF eax == ecx
指令之前,您应该从 num1 加载 EAX,从 num2 加载 ECX。或者,更好地选择寄存器,这样您就根本不必存储到内存中。.ENDIF
,因为它会使执行失败,并且另外(并且不必要地)执行“大于”的比较。这是我的版本:
Prompt1 BYTE "Enter a number", 0
Prompt2 BYTE "Enter another number", 0
Larger BYTE " is larger", 0
Equal BYTE "Is equal", 0
...
mov edx, OFFSET Prompt1
call writeLine
call readInt ; -> EAX
mov ecx, eax ; ECX is 1st number
endl
mov edx, OFFSET Prompt2
call writeLine
call readInt ; -> EAX is 2nd number
endl
mov edx, OFFSET Equal
.IF ecx NE eax
.IF ecx GT eax
mov eax, ecx
.ENDIF
call writeInt
mov edx, OFFSET Larger
.ENDIF
call writeString
如果您能以更简单的方式解决问题,就不必使用
.ELSEIF
或.ELSE
。