В настоящее время я учусь на уроке компьютерной организации и архитектуры в своем университете, и мы много работали с 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```
loop L2
будет выполняться в ecx раз, верно? Как вы думаете, что произойдет, когда эта инструкция достигнет нуля? Поскольку он не возвращается к L2, он просто переходит к следующему оператору, который называется setNewMax. Вероятно, не то, что вы хотели. К вашему сведению, когда он достигает второй инструкции цикла, он снова уменьшает ecx, уменьшая значение до 0xffffffff. Это означает, что он будет работать в течение длительного времени. - person David Wohlferd   schedule 21.05.2020currentNum
. Просто используйте регистры; вот для чего они. Регистры похожи на локальные переменные в C (вы также можете использовать пространство стека, если у вас закончились регистры). - person Peter Cordes   schedule 21.05.2020cmp eax, [esi]
/jna
поверхmov eax, [esi]
для обновления максимума, затем приращение указателя + цикл. - person Peter Cordes   schedule 21.05.2020