x86 使用 .IF 、 .ELSE 和 .ELSEIF 比较两个数字

问题描述 投票:0回答:1

我得到了两个 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
if-statement assembly x86 masm
1个回答
0
投票
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

本质上,您的

.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

© www.soinside.com 2019 - 2024. All rights reserved.