一个简单的汇编问题
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;
}