我有一个用汇编语言编写的简单 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
如何正确地将控制权返回给调用程序,以便它可以执行下一条语句?
我对汇编语言很陌生,所以如果有任何非常规/奇怪的做事方式,我深表歉意。也请随时纠正我。