一个简单的汇编问题
3、 按如下要求编写程序:设4000H单元开始有10个数,编程计算这十个数的平均值(存放在DH中),并统计这十个数中,大于平均值的个数(存放在DL中)。找出这十个数的最大值和最小值(存在在BH和BL中)
#include<dos.h> #include<stdio.h> int sum(char*,int); int great(char*,int,char); char max(char*,int); char min(char*,int); int main(void) { union REGS reg,reg2,reg3; struct SREGS sreg; int i; char s[]="Press any key to continue!$"; char* a=(char*)0x4000; reg.h.dh=sum(a,10); reg.h.dl=great(a,10,reg.h.dh); reg.h.bh=max(a,10); reg.h.bl=min(a,10); printf("dh=%d,dl=%d,bh=%d,bl=%d\n",reg.h.dh,reg.h.dl,reg.h.bh,reg.h.bl); reg2.x.dx=FP_OFF(s); reg2.h.ah=9; sreg.ds=FP_SEG(s); intdosx(®2,®3,&sreg); getch(); return 0; } int sum(char* addr,int size) { int sum2=0,i; char temp; asm mov si,addr for(i=0;i<size;i++) { asm lodsb asm mov temp,al sum2+=temp; } return sum2/size; } int great(char* addr,int size,char aver) { int num=0,i; char temp; asm mov si,addr for(i=0;i<size;i++) { asm lodsb asm mov temp,al if(temp>aver) num++; } return num; } char max(char* addr,int size) { char m,temp; int i; asm mov si,addr asm lodsb asm mov m,al for(i=1;i<size;i++) { asm lodsb asm mov temp,al if(temp>m) m=temp; } return m; } char min(char* addr,int size) { char m,temp; int i; asm mov si,addr asm lodsb asm mov m,al for(i=1;i<size;i++) { asm lodsb asm mov temp,al if(temp<m) m=temp; } return m; }