我的作业代码有问题。它是一个被引用来计算数组中的数字以获得平均值的函数。它被传递给下面的函数。我只是无法从数组中获取实际值,并且在尝试查找有关汇编中数组使用情况的信息时遇到了困难。看起来我刚刚获取参考/地址数据。帮忙????
**下面的一些代码取自我在课堂上做的笔记,其余的是我试图填补的空白。遵循起来可能很糟糕,所以提前抱歉。
.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
跟随可能会很糟糕
不要这样想。这是我在这个论坛上看到的更好的代码之一。
inc edi
指令,您一次只跨过双字数组 1 个字节,因此您根本不会移动到下一个数组元素。元素占用 4 个字节,这就是您需要的步幅。
adc edx, 0
进行级联添加来防范这种情况。
jecxz
。
NoOfElemenstsDW EQU 8
ArrayAddrStartPtr EQU 12
push ebp
mov ebp, esp
push edi
push edx
push ecx
mov ecx, [ebp + NoOfElemenstsDW]
mov edi, [ebp + ArrayAddrStartPtr]
xor eax, eax ; EDX:EAX Total=0
xor edx, edx
jecxz L2 ; Empty array, return EAX=0
L1:
add eax, [edi] ; Add value to Total
adc edx, 0
add edi, 4 ; Go to next dword in the array
dec ecx
jnz L1
div dword ptr [ebp + NoOfElemenstsDW]
L2:
pop ecx
pop edx
pop edi
pop ebp
ret