我目前在我所在大学的计算机组织和架构课程中学习,我们一直在与MASM进行很多合作,出于我自己的兴趣,我一直在研究一些程序。现在,我正在编写一个程序,要求用户将10个数字输入到数组中,然后它将计算出数组中的最大数字。但是,我的问题是,除非最大的数字恰好是输入的最后一个数字,否则该程序将崩溃并形成无限循环。我检查了ecx的内容,看来它去了... 10 9 8 7 6 5 4 3 2 1 -1 -2 -3,所以它只是跳过0。我有点迷失了,而不是真的确定我在做什么错。请原谅我的编码风格,因为我对此还很陌生,但只是想了解一下。谢谢!
INCLUDE Irvine32.inc
.data
currentNum DWORD ?
largestNum DWORD ?
numbers DWORD 10 DUP(0)
prompt BYTE "Enter a number: ", 0
message BYTE "The largest number is: ", 0
.code
main PROC
mov ecx, LENGTHOF numbers
mov esi, OFFSET numbers
mov eax, esi
L1 :
mov edx, OFFSET prompt
call WriteString
call ReadInt
mov[esi], eax
add esi, TYPE numbers
loop L1
mov ecx, LENGTHOF numbers
mov esi, OFFSET numbers
mov eax, [esi]
mov largestNum, eax
mov currentNum, eax
L2:
mov eax, [esi]
mov currentNum, eax
add esi, TYPE numbers
cmp eax, largestNum
ja setNewMax
loop L2
setNewMax:
mov eax, currentNum
mov largestNum, eax
loop L2
mov eax, largestNum
mov edx, OFFSET message
call WriteString
call WriteDec
call Crlf
call Crlf
exit
main ENDP
END main```
...
ja setNewMax
loop L2
setNewMax:
mov eax, currentNum
mov largestNum, eax
loop L2
第一个循环(在setNewMax
标签之前,这里递减ecx
,发现它为零并执行
not跳转。因此,它仅继续执行下一条指令,即mov eax, currentNum
。三条指令稍后,它将遇到另一个loop
指令,它会减小ecx
(现在为-1
而不是零),因此开始循环。您将不得不像这样插入一个跳出此循环:
... ja setNewMax loop L2 jmp exitLoop setNewMax: mov eax, currentNum mov largestNum, eax loop L2 exitLoop: ...