匯編課程設計
阿新 • • 發佈:2017-06-08
cal add dword sta bsp 定義 codes 格式化 click
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,97479View Code,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
匯編課程設計