x86 使用 .IF 、 .ELSE 和 .ELSEIF 比较两个数字
Posted
技术标签:
【中文标题】x86 使用 .IF 、 .ELSE 和 .ELSEIF 比较两个数字【英文标题】:x86 Using .IF , .ELSE , and .ELSEIF to compare two numbers 【发布时间】:2021-09-26 04:46:58 【问题描述】:我得到了两个 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
【问题讨论】:
首先,您只需要比较eax < ecx
,而不是两种方式(如eax < ecx && ecx > eax
)。接下来,您应该将较大值的值复制到同一个寄存器。我不知道,哪个寄存器 writeInt 需要参数,但在两种情况下它应该是相同的。此外,正确的值已经在正确的寄存器中,或者在另一个寄存器中,这意味着不需要从内存中加载。因此mov eax, ecx
或mov ecx, eax
仅在其中一个分支中,甚至swap ecx, eax
。无论哪种方式,您都可以通过.IF cond; swap; .ENDIF
保存代码
【参考方案1】:
mov edx, OFFSET Prompt2 ;Enter second num call writeLine call readInt mov num2, ecx
由于检索程序输入时出错,.IF
、.ELSEIF
、.ELSE
或 .ENDIF
可以执行的所有操作均无效。readInt 返回EAX
注册,所以你的mov num2, ecx
指令应该是mov num2, eax
唯一的问题是第二个值总是大于第一个值,如果它们不相等的话。
如果ecx > eax
显示“更大”,如果ecx < eax
还显示“更大”。你期待什么?
.IF eax == ecx
指令之前,您应该从num1 加载EAX
并从num2 加载ECX
。
如果数字恰好相等,您不想使用.ENDIF
,因为它会让您失败并且另外(并且不必要地)执行“大于”的比较。
mov eax, num1
mov ecx, num2
.IF eax == ecx
mov edx, OFFSET Equal
call writeString
.ELSEIF eax > ecx
call writeInt
mov edx, OFFSET Large
call writeString
mov eax, ecx ; ecx = num2
call writeInt
.ENDIF
【讨论】:
以上是关于x86 使用 .IF 、 .ELSE 和 .ELSEIF 比较两个数字的主要内容,如果未能解决你的问题,请参考以下文章