2014-11-12 3 views
0

У меня возникла проблема с кодом для назначения. Это функция, на которую ссылаются вычисления чисел в массиве, чтобы получить среднее значение. Он передается функции ниже. У меня просто возникают проблемы с получением фактических значений из массива, и у меня есть ужасное время, пытаясь найти информацию об использовании массива в сборке. Похоже, я просто получаю справочные/адресные данные. Помогите????Доступ к элементам массива в сборке x86

** Некоторые из приведенного ниже кода взяты из заметок, которые я принимал во время занятий, а остальное - это попытка заполнить пробелы. Скорее всего, это ужасно, потому что извините заранее.

.586    

.MODEL FLAT, C 

.STACK 
.DATA 

.CODE 

AverageFunc PROC 

NoOfElemenstsDW EQU 08 ArrayAddrStartPtr EQU 12 

push ebp 

mov ebp, esp 

push edi 

push ecx 

mov ecx, [ebp + NoOfElemenstsDW ] 

mov edi, [ebp + ArrayAddrStartPtr] 

sub ebx, ebx ;set ebx to 0 

sub eax, eax ;set eax to 0 

sub edx, edx ;must set to 0 to get accurate division 

L1: 

add eax, [edi] ;add value to total 

inc edi ;go to next point in the array 

add ebx, 1 ;add 1 to the counter 

cmp ebx, ecx ;compare ecx and ebx 

jl L1 ;If ebx < ecx, loop again 

div ecx ;divide sum by total numbers 

pop ecx 

pop edi 

pop ebp 

ret 

AverageFunc ENDP 

END 
+0

Вы не показали нам, как вы вызываете эту функцию (то есть то, что вы передаете как фактические параметры). – Michael

ответ

0

Если ваш AverageFunc должен возвращать EAX только тогда, вам все равно придется нажать и поместить EDX.

Эти 2 не идут вместе

add eax, [edi] ;add value to total 
inc edi ;go to next point in the array 

С точек ЭОД в двойное слово вам нужно поднять ЭОД на 4 в смену 1.

Также добавление в скором времени переполнения. Решить ее

add eax,[edi] 
adc edx,0 

Как предусмотрительно поместили подходящее jecxz прямо перед меткой L1.

ps Это, вероятно, ужасно, если следовать Не думайте так. Это один из лучших кодов, которые я видел на этом форуме.

+0

Спасибо! Я попробую это и посмотрю, исправляет ли она проблему. Мы просто перешли к процедурам вызова из отдельных файлов .asm с использованием C++ (а не только с встроенным кодом), и я все равно привык к тому, чтобы использовать стек, так что это заставило меня перепутаться. – Brittney

Смежные вопросы