如何查找用户输入的最小和最大数字

时间:2015-12-03 21:57:32

标签: assembly x86 masm 32-bit irvine32

所以我的任务是“编写一个程序,在输入-999之前读取数字,然后显示已输入的最大和最小数字”

我自己构建了大约75%的这个,我在代码的最后得到一个错误它一直显示0作为我最大的输入。我认为这与我的计数器设置方式有关。我认为它试图从我推送之前存在的堆栈中拉出来。

这项任务的第二部分我绝对不知道如何解决。如果我有一个sceond堆栈访问我可以解决它没有问题,但我不是因为我已经尝试找出如何使用像堆栈一样的数组。我真的不记得细节,但我知道可以做到。

INCLUDE Irvine32.inc

.data
input byte 50 DUP(0)
counter Dword 50 dup (0)
counter2 byte 50 dup (0)
array Word 50 dup(0)

sentinal dword (0)

statement  byte "PLease enter a number"  ,0
statement2 byte "To exit enter the number '-999'" ,0
statement3 byte "your biggest number was " ,0


.code
main proc

mov ecx ,1
L1: 
mov ecx ,2
mov edx , OFFSET statement          ; puts statement into register
call WriteString                    
call CRLF
mov edx , offset statement2
Call writestring
Call CRLF

call Readdec
.if (EAX==sentinal )                ;tests agaisnt breakout
sub ecx , 1
.endif
push EAX
inc counter
loop L1

mov ecx ,0
mov ecx , counter

pop EDX                             ;pulls initial inputs
Pop EBX
L2:

.if (EDX > EBX)                     ;test for largest input
pop EbX 
.Elseif (EDX<EBX)
pop EDX
.Endif
loop L2

mov EDX ,offset statement3
call writestring                    ;displays largest input(BUG)
.if (EDX>EBX)
mov edx , eax
CAll writeDec
.elseif (EBX>EDX)
mov eBx , EAX
CAll Writedec
call crlf
.endif
Exit
main endp
end main

1 个答案:

答案 0 :(得分:1)

  

我一直在我的代码的最后得到一个错误它一直显示0作为我最大的输入。

当您准备打印结果时,您已通过为其分配了随附文本的地址来销毁EDX的内容。
将EDX保存在堆栈中:

push edx
mov  EDX ,offset statement3
call writestring                    ;displays largest input(BUG)
pop  edx
.if  (EDX>EBX)
mov  edx , eax
CAll writeDec

您不应该使用正确的值定义 sentinal 吗?

sentinal dword (-999)

你能看到在下一个片段中第一行是多余的吗?您立即用另一个值覆盖ECX寄存器。

mov ecx ,1
L1: 
mov ecx ,2

为什么要定义那么多计数器?也许剥离50 dup

counter Dword 50 dup (0)