《计算机组成技术-大作业-第2题程序说明》由会员分享,可在线阅读,更多相关《计算机组成技术-大作业-第2题程序说明(8页珍藏版)》请在金锄头文库上搜索。
1、第2题程序说明题目有一组八位无符号数,求出其中的最大值max,最小值min,以及平均值avg(不考虑余数),请画出框图并编写完整程序。程序简单说明程序中number和DataSource(0)表示数组长度(以字型进行访问)。程序核心是一个循环找出最大数、最小数、数组总和。输出中用到了八位无符号二进制数转化为ascii码。代码流程图中同一行中的代码,是可以并行的、不分先后顺序的。程序执行结果此结果是对24,100,35,67,78,96,57,18,39,10,11,132,13,14来说的。程序流程图bx=数据源首地址di=0;dx=0;ax=0;cx=0;bp=0000ffffhclbx+s
2、i;si-ax=ax+cxadc dx,0算平均数;保存min、ax、avg开始判断数组是否合法比较bp与cx否结束提示否是主程序流程图:是di大比较di与cxbp小于等于di=cxbp小bp大于等于bp=cx判断zf是否为0call dbxout(输出)dbxout子程序(输出)流程图。输出max、min、avg存储单元中内容。开始siMaxString(三个提示)地址;dimax(三个数据)地址;cx=3;dx=si;输出dx指向的字符串;al=di;bxmaxminavg(临时数据区)地址;dx=bx;call EBinaryAscii(八位无符号二进制数转化为ascii码);bx=09
3、h;bx+;bx=$;输出dx指向的字符串si=si+5di+cx-否判断zf是否为0是退出EBinaryAscii子程序(八位无符号二进制数转化为ascii码)流程图。al为目标操作数,bx为结果存放位置,结束时bx为结果存放位置的下一个有效位置。第一个循环:除10取余,第二个循环:去掉数字中可能有的0。cx-否开始di=2;dx=10h小比较al与10大于等于ah=0;除dl(10);ah=ah+30hbx+di=ah;di-al=al+30h;bx+di=al;cx=3;cx=cx-di;si=0al=bx+di;bx+si =alsi+di+判断zf是否为0是bx=bx+si退出代码d
4、ata segment number db 14 ;高字节存在DataSource(0)中,number子操作 DataSource db 00,24,100,35,67,78,96,57,18,39,10,11,132,13,14 ;DataSource+1指向第一个元素位置 max db 0 min db 0 avg db 0 MaxString db max:,$ MinString db min:,$ AvgString db avg:,$ maxminavg db 5 dup(?) Index dw 0 ;错误提示 y db The number of array elements
5、is 0 !,$data endsstack segment db 100 dup(?)stack endscode segment assume ds:data,cs:code,ss:stack begin: dbxprint macro ;输出字符串宏 mov ah,09h int 21h endm dbxprint mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,100 mov bx,offset DataSource ;数据源地址 mov si,word ptr number ;数组最大为65535 cmp si,0 ;判断数组是
6、否合法 jnz CanStart mov ax,0 ;错误提示 call dbxerror jmp exit CanStart: xor di,di ;di存最大值 or bp,0000ffffh ;bp存最小值 xor dx,dx ;dx:ax存所有元素之和,最大为 xor ax,ax xor cx,cx ;循环找数暂存器 lop: ;循环找数 mov cl,bx+si cmp di,cx ja RelativelyLarge mov di,cx RelativelyLarge: cmp bp,cx jb RelativelySmall mov bp,cx RelativelySmall:
7、add ax,cx adc dx,0 dec si jnz lop mov bx,word ptr number div bx mov cx,bp ;保存max、min、avg mov bx,di mov max,bl mov min,cl mov avg,al call dbxout exit: mov ax,4c00h int 21h dbxout proc near ;输出 mov si,offset MaxString mov di,offset max mov cx,3 outlop: mov dx,si ;输出max dbxprint mov al,byte ptr di mov
8、bx,offset maxminavg mov dx,bx call EBinaryAscii mov byte ptr bx,09h inc bx mov byte ptr bx,$ dbxprint add si,5 inc di loop outlop ret dbxout endp dbxerror proc near ;错误提示,ax错误编号 push dx push bx shl ax,1 mov bx,ax mov ax, Indexbx mov dx, offset y add dx,ax mov ah,09h int 21h pop bx pop dx ret dbxerro
9、r endp EBinaryAscii proc near ;八位无符号二进制数转化为ascii码 ;al为目标操作数,bx为结果存放位置,输出bx为后一个位置 push di push cx push dx push si mov di,2 mov dx,10 ebalop1: cmp al,0ah jb ebaok1 xor ah,ah div dl add ah,30h mov bx+di,ah dec di jmp ebalop1 ebaok1: add al,30h mov bx+di,al mov cx,03h sub cx,di xor si,si ebalop2: ;去掉数字中前面可能有的零 mov al,bx+di mov bx+si,al inc si inc di loop ebalop2 add bx,si pop si pop dx pop cx pop di ret ret EBinaryAscii endpcode ends end begin