首页 > 解决方案 > x86 使用 .IF 、 .ELSE 和 .ELSEIF 比较两个数字

问题描述

我得到了两个 DWORD 值,并将使用.IF,比较它们.ELSE.ELSEIF以查看哪个数字更大或它们是否相等。例如,屏幕上调用了两个提示,分别是“输入数字 1”和“输入数字 2”。数字 1 和数字 2 使用eaxfor num1ecxfor num2存储到单独的寄存器中。如果eaxecx相等,则调用相等提示。如果他们不是,那么这就是.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

标签: if-statementassemblyx86masm

解决方案


mov edx, OFFSET Prompt2 ;Enter second num
call writeLine
call readInt
mov num2, ecx

由于检索程序输入时出错,所有.IF.ELSEIF.ELSE或可以做的事情都无效。readInt返回寄存器中的整数,因此您的指令应为.ENDIF
EAXmov num2, ecxmov num2, eax

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

如果ecx > eax显示“更大”,并且ecx < eax还显示“更大”。你期待什么?

  • 在您的第一.IF eax == ecx条指令之前,您应该EAXnum1ECXnum2加载。
  • 如果数字恰好相等,您不想使用.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

推荐阅读