MASM X86汇编程序中发生无限循环

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

我目前在我所在大学的计算机组织和架构课程中学习,我们一直在与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```
assembly x86 masm irvine32
1个回答
0
投票
... 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: ...
© www.soinside.com 2019 - 2024. All rights reserved.