1

我有一个用汇编语言编写的简单 findAverage 过程,我试图从 C 主程序中调用它。我让它工作了一段时间,但是当程序运行时突然它给了我这个错误ret

Unhandled exception at 0x0000001E in projOne.exe: 0xC0000005:
Access violation executing location 0x0000001E.v

我已经在互联网上寻找答案,但我似乎找不到答案。这是我的 C 文件:

#include<stdio.h>
void printGrades(float grades[]){
    //Print the grades
    for (int i = 0; i < 30; i++){
        printf("Grade %d: %.2f\n", i, grades[i]);
    }
}


void  findAverage(float* grades, float* average, int count);
void  findVariance(float* grades, float* variance, float average, int count);



int main(void){
    float average = 0.0f;
    float variance = 0.0f;
    float grades[] = { 60.0f, 66.4f, 76.6f, 67.9f, 98.4f, 76.3f, 89.0f, 90.5f, 87.4f, 66.9f, 56.7f, 79.1f, 89.2f, 91.3f, 92.5f, 91.1f, 94.2f, 99.5f, 100.0f, 76.6f, 88.4f, 99.8f, 79.8f, 86.5f, 81.3f, 82.1f, 83.1f, 81.1f, 99.1f, 88.0f };
    int count = 30;
    int i = 0;

    printf("Running Program...\n");

    //print original grades
    printGrades(grades);

    //find the average by calling asm proc
    findAverage(&grades[30], &average, count);

    //print average
    printf("The average is: %.2f\n", average);

    findVariance(&grades[30], &variance, average, count);

    //print variance
    printf("The variance is: %.2f\n", variance);


    return 0;
}

这是我的 .asm 文件:

.586
.MODEL FLAT
.DATA

nbrElts DWORD ?
one     DWORD 1
average DWORD ?

.CODE
_findAverage PROC NEAR32
    ;parameter 1 = source
    ;parameter 2 = dest
    ;parameter 3 = size of source

            push    ebp                         ;stack setup
            mov     ebp, esp
            finit                               ;initialize FPU
            fldz                                ;get ready for adding
            mov     eax, REAL4 PTR [ebp +8]     ;source
            mov     ebx, REAL4 PTR [ebp +12]    ;dest
            mov     ecx,[ebp+16]                ;size of source
            mov     nbrElts, ecx                ;count

    sumALL: ;FIND THE AVERAGE
            fadd    REAL4 PTR [eax]             ;ST += source[eax]
            add     eax, 4                      ;next element in source
            loop    sumAll              

            fidiv   nbrElts                     ;ST / count             
            fstp    REAL4 PTR[ebx]              ;dest <- ST                         

            pop     eax                         ;restore registers
            pop     ebx
            pop     ecx
            pop     ebp
            ret

_findAverage    ENDP
END

如何正确地将控制权返回给调用程序,以便它可以执行下一条语句?

我对汇编语言很陌生,所以如果有任何非常规/奇怪的做事方式,我深表歉意。也请随时纠正我。

4

0 回答 0