MASM32. Cреднее арифметическое

Рейтинг: 0Ответов: 1Опубликовано: 24.03.2023

Написал код для нахождения среднего арифметического числа без знака, но 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