assume cs:codesg,ss:stack data segment db ‘1975‘,‘1976‘,‘1977‘,‘1978‘,‘1979‘,‘1980‘,‘1981‘,‘1982‘,‘1983‘ db ‘1984‘,‘1985‘,‘1986‘,‘1987‘,‘1988‘,‘1989‘,‘1990‘,‘1991‘,‘1992‘ db ‘1993‘,‘1994‘,‘1995‘ ;以上是表示21年的21个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 245980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 ;以上是表示21年公司雇员人数的21个word型数据 data ends table segment db 21 dup (‘year summ ne ?? ‘) table ends stack segment dw 32 dup (0) stack ends buffer segment db 32 dup (0) buffer ends codesg segment start: mov ax,data mov ds,ax mov di,0 mov si,4*21+4*21 ;指向员工 mov ax,table mov es,ax ;es存表 mov bx,0 call finishing ;将data段格式化到es段了 mov ax,stack mov ss,ax mov sp,64 mov ax,buffer ;数据缓冲区,接受转换后的每一个字符 mov ds,ax mov si,0 ;ds:si指向缓冲区 mov ax,table mov es,ax mov bx,0 ;ex:bx指向table mov dh,5 ;第一行 mov cx,21 s: push cx mov ax,es:[bx] mov ds:[si],ax mov ax,es:[bx+2] mov ds:[si+2],ax ;向缓冲区中写入一条年信息 mov byte ptr ds:[si+4],0 mov dl,20 ;显示年份 mov cl,2 call show_str push dx mov ax,es:[bx+5] ;读取一条总收入信息 mov dx,es:[bx+7] call dtoc ;调用dtoc将数值转换成字符串到缓冲区中 pop dx mov dl,30 ;显示员工 call show_str push dx mov ax,es:[bx+0ah] ;读取一条总人数信息 mov dx,0 call dtoc ;调用dtoc将数值转换成字符串到buffer中 pop dx mov dl,40 ;显示字符串 call show_str push dx mov ax,es:[bx+0dh] ;读取一条人均收入信息 mov dx,0 call dtoc ;调用dtoc将数值转换成字符串到buffer中 pop dx mov dl,50 ;显示字符串 call show_str add dh,2 ;每隔一行打印一条数据 add bx,10h ;让es:bx指向table的下一行数据 pop cx loop s mov ax,4c00h int 21h dtoc: push ax push bx push cx push dx push bp push si mov bp,0 dtoc_s0: mov cx,10d call divdw push cx inc bp mov cx,ax ;除到商为0为止 inc cx loop dtoc_s0 mov cx,bp dtoc_s: pop bx add bl,30h mov ds:[si],bl inc si loop dtoc_s mov byte ptr ds:[si],0 pop si pop bp pop dx pop cx pop bx pop ax ret divdw: ;子程序定义开始 push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret show_str: push ax push bx push cx push dx push es push bp push si mov ax,0b800H mov es,ax mov al,80*2 ;一行160个字节 mul dh ;刚开始是第五行;高位是行,低位是列 mov dh,0 add ax,dx ;列数*2 add ax,dx mov bp,ax mov al,cl ;颜色 mov cx,0 mov cl,ds:[si] ;ds:[si]为缓冲区指针 inc si show_str_s: mov es:[bp],cl ;低位ascii inc bp mov es:[bp],al ;高位属性 inc bp mov cl,ds:[si] ;如果这个字节是0,退出循环 inc si inc cx loop show_str_s pop si pop bp pop es pop dx pop cx pop bx pop ax ret finishing: push ax push bx push cx push di push si push bp mov cx,21 finishing_s: ;填充时间 mov ax,ds:[di] mov es:[bx],ax mov ax,ds:[di+2] mov es:[bx+2],ax ;填充收入,收入是双字节的 mov ax,ds:[di+4*21] mov dx,ds:[di+4*21+2] ;高位 mov es:[bx+5],ax mov es:[bx+5+2],dx ;填充人数 mov bp,ds:[si] mov es:[bx+0aH],bp ;填充人均收入 div bp mov es:[bx+0dH],ax add bx,16 ;table换一行 add di,4 ;年份换一个 add si,2 ;员工修改两个字节 loop finishing_s pop bp pop si pop di pop cx pop bx pop ax ret codesg ends end start
时间: 2024-10-08 12:07:44