You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:45:32