MASM32. Cреднее арифметическое
Написал код для нахождения среднего арифметического числа без знака, но ollydbg выдает мне ошибку
, не могу понять в чем проблема, если кто то подскажет буду благодарен.
.386
.model flat, stdcall
includelib kernel32.lib
ExitProcess PROTO, :DWORD
.data
inpdd dd 4, -13, 2, 5
sum dd ?
res dd ?
.code
Winmain PROC
mov eax, inpdd ; load the array into EAX
mov ecx, 0
; loop through the array and sum up the values
sum_loop:
add ecx, [eax]
add eax, 4
loop sum_loop
mov sum, ecx ; save the sum as sum
mov eax, sum
mov ebx, 4
cdq ; sign-extend EAX into EDX
div ebx ; divide sum by 4
mov res, eax ; save the result in res
push 0
call ExitProcess
Winmain endp
end winmain
Ответы (1 шт):
Проблема в том, что для операции loop регистр ecx задает количество итераций. loop уменьшает значение ecx на 1, проверяет результат: если 0, то выходит из цикла, если не ноль, то переходит по указанной метке (на начало цикла). Т.е. loop можно представить как:
dec ecx
jnz sum_loop
А вы ecx используете для хранения суммы, в цикле его наоборот увеличиваете, в итоге выход из цикла не происходит, и вылетает из-за того что происходит попытка чтения за границами секции .data.
Решение - использовать какой-то другой регистр для накопления суммы, а в ecx указать размер обрабатываемого массива:
mov eax, inpdd ; адрес начала массива
mov edx, 0 ; здесь будет накапливаться сумма
mov ecx, 4 ; цикл должен выполниться 4 раза
; loop through the array and sum up the values
sum_loop:
add edx, [eax]
add eax, 4
loop sum_loop
mov sum, edx