基于现有max/min汇编函数修改实现数组平均值函数的咨询
问题:将最值汇编函数修改为求平均值函数的两处修改点
我有一项学校作业,要求实现以下功能:编写C程序声明任意大小的整数数组,调用三个x86汇编函数分别计算数组的平均值、最大值、最小值,最后在C中输出结果,三个汇编函数需分别放在不同文件中。目前我已完成C++代码及求最大值(_max)、最小值(_smallest)的汇编函数,其中_max与_smallest汇编函数仅跳转指令不同(max用jg,min用jl)。教授提示仅需修改两处即可将现有汇编函数改为求平均值的函数,请求指出具体修改点。
已完成的代码
C++代码
#include <iostream> using namespace std; int main() { int sz; cout << "How many numbers do you want the array to generate?:"; cin >> sz; int randArray[sz]; for (int i = 0; i < sz; i++) randArray[i] = rand() % 1000; cout << "\nnumbers in array:" << endl; for (int i = 0; i < sz; i++) cout << "number " << i + 1 << "::" << randArray[i] << endl; return 0; }
求最大值的汇编函数
.686 .model flat .code _max PROC; named _max because C automatically prepends an underscode, it is needed to interoperate push ebp mov ebp, esp; stack pointer to ebp mov ebx, [ebp + 8]; address of first array element mov ecx, [ebp + 12] mov ebp, 0 mov edx, 0 mov eax, [ebx] loopMe: cmp ebp, ecx je allDone cmp eax, [ebx + edx] jg continue mov eax, [ebx + edx] continue: add edx, 4 add ebp, 1 jmp loopMe allDone : pop ebp ret _max ENDP END
求最小值的汇编函数
.model flat .code _smallest PROC push ebp mov ebp,esp ;stack pointer to ebp mov ebx,[ebp+8] ; address of first array element mov ecx,[ebp+12] mov ebp,0 mov edx,0 mov eax,[ebx] loopMe: cmp ebp,ecx je allDone cmp eax,[ebx+edx] jl continue mov eax,[ebx+edx] continue: add edx,4 add ebp,1 jmp loopMe allDone: pop ebp ret _smallest ENDP END
解答
按照教授提示的两处修改点,具体修改如下:
修改点1:替换循环内的比较替换逻辑为累加操作
原最值函数中,循环内通过比较替换更新eax为当前最值,需要将这部分逻辑改为累加数组元素:
; 原代码(以_max为例) cmp eax, [ebx + edx] jg continue mov eax, [ebx + edx]
替换为:
add eax, [ebx + edx]
这一步将原本的“比较-替换”逻辑改成直接把当前数组元素累加到eax中,让eax逐步累积数组的总和。
修改点2:添加总和除以元素个数的计算
在循环结束的allDone标签前,添加除法指令计算平均值(注意32位除法需要先清零edx,因为div指令会使用edx:eax作为被除数):
; 添加在allDone标签之前 mov edx, 0 div ecx
这一步将eax中存储的数组总和除以ecx中存储的元素个数,最终eax中就是数组的整数平均值。
内容的提问来源于stack exchange,提问作者chrisward
相关产品推荐
相关产品推荐

