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 用于 num1ecx 用于 num2 存储到单独的寄存器中。如果eaxecx 相等,则调用相等提示。 如果不是,那么这就是 .ELSEIF 的用武之地。eaxecx 进行比较,反之亦然。

唯一的问题是第二个值总是大于第一个值,如果它们不相等的话。

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 &lt; ecx,而不是两种方式(如eax &lt; ecx &amp;&amp; ecx &gt; eax)。接下来,您应该将较大值的值复制到同一个寄存器。我不知道,哪个寄存器 writeInt 需要参数,但在两种情况下它应该是相同的。此外,正确的值已经在正确的寄存器中,或者在另一个寄存器中,这意味着不需要从内存中加载。因此mov eax, ecxmov 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 &gt; eax 显示“更大”,如果ecx &lt; 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 比较两个数字的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用带有多个 if 语句的 else

elseif 与 else if 之间的潜在区别

多个if else if语句的用法?

增强else-if链的性能

R语言中else if 常见错误

if-then-else 结构中的注释应该放在哪里? [关闭]