访问汇编 x86 中的数组元素

问题描述 投票:0回答:1

我的作业代码有问题。它是一个被引用来计算数组中的数字以获得平均值的函数。它被传递给下面的函数。我只是无法从数组中获取实际值,并且在尝试查找有关汇编中数组使用情况的信息时遇到了困难。看起来我刚刚获取参考/地址数据。帮忙????

**下面的一些代码取自我在课堂上做的笔记,其余的是我试图填补的空白。遵循起来可能很糟糕,所以提前抱歉。

.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
arrays assembly x86 average
1个回答
0
投票

跟随可能会很糟糕

不要这样想。这是我在这个论坛上看到的更好的代码之一。

这些是错误

  • 如果您的 AverageFunc 应该仅返回 EAX ,那么您仍然需要保留 EBX 和 EDX 寄存器。
  • 使用
  • inc edi
     指令,您一次只跨过双字数组 1 个字节,因此您根本不会移动到下一个数组元素。元素占用 4 个字节,这就是您需要的步幅。
  • 添加大量双字值很容易使 32 位 EAX 寄存器溢出。使用
  • adc edx, 0
     进行级联添加来防范这种情况。
  • 并考虑如果数组为空会发生什么!然后,您的代码将处理一个不存在的数组元素,然后除以零,从而导致 CPU 生成异常。作为预防措施,在 L1 标签之前放置一个合适的
  • 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
    
© www.soinside.com 2019 - 2024. All rights reserved.