彙編第三版 王爽 課程設計1
阿新 • • 發佈:2022-04-01
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' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827 dd 803530,1183000,1843000,2759000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 data ends table segment db 21 dup('year summ ne ?? ') table ends show segment db 20 dup(0) show ends code segment start: ;初始化資料 call copy ;思路:一行可以顯示80個字元 每列中間空10個字元 每列使用10個字元,靠左 左邊空10個字元 mov ax,table mov ds,ax mov ax,show mov es,ax mov bx,0 mov dh,3 ;列印行 mov cx,21 start_s: push cx ;顯示年份 mov cx,2 start_s1: mov ax,ds:[bx] mov es:[0],ax mov ax,ds:[bx+2] mov es:[2],ax loop start_s1 mov es:[4],0 mov dl,10 ;列數 mov cl,2 ;字元屬性 call show_str ;公司總收入 push dx mov ax,ds:[bx+5] mov dx,ds:[bx+7] call dtoc pop dx mov dl,30 ;列數 mov cl,2 ;字元屬性 call show_str ;員工人數 push dx mov ax,ds:[bx+10] mov dx,0 call dtoc pop dx mov dl,50 ;列數 mov cl,2 ;字元屬性 call show_str ;人均收入 push dx mov ax,ds:[bx+13] mov dx,0 call dtoc pop dx mov dl,70 ;列數 mov cl,2 ;字元屬性 call show_str inc dh add bx,16 pop cx loop start_s ; mov ax,12345 ;資料低位 ; mov dx,1 ;資料高位 ; call dtoc ; mov dh,8 ;行數 ; mov dl,1 ;列數 ; mov cl,2 ;字元屬性 ; call show_str mov ax,4c00h int 21h ;數字轉字元 dtoc: push cx push si mov si,0 s1: mov cx,10 ;除數 ;返回值:dx 結果高16位 ; ax 結果低16位 ; cx 餘數 call divdw add cx,30H push cx ;暫存餘數 inc si ;判斷結果是否為 0 mov cx,dx ;商為0停止 jcxz ok1 jmp short s1 ok1:mov cx,ax jcxz ok2 jmp short s1 ok2: mov cx,si ;有多少個元素 mov si,0 s2: pop ax mov es:[si],ax add si,1 loop s2 mov es:[si],0 pop si pop cx ret ;螢幕列印 show_str: push ds push es push ax push bx push cx push si push di mov ax,show ;字元列印地址 mov ds,ax mov si,0 mov ax,0b800h mov es,ax ;找到行位置 mov al,160 mov ah,dh mul ah mov bx,ax mov al,2 mov ah,dl mul ah mov di,ax sub di,2 mov al,cl s: mov cl,ds:[si] mov ch,0 jcxz ok mov ah,ds:[si] mov es:[bx+di],ah mov es:[bx+di+1],al add di,2 inc si jmp short s ok: pop di pop si pop cx pop bx pop ax pop es pop ds ret ;通用除法 divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax ;儲存 int(H/N) 被除數高16位 / 除數 pop ax div cx mov cx,dx mov dx,bx ;結果高位 pop bx ret ;資料初始化 copy: ;ds指向資料段 mov ax,data mov ds,ax ;es指向table段 mov ax,table mov es,ax mov cx,21 mov di,0 mov si,0 mov bx,0 copy_s: ;年份1 mov ax,ds:[di] mov es:[bx],ax ;收入1 mov ax,ds:[di+84] mov es:[bx+5],ax ;僱員數 mov ax,ds:[si+168] mov es:[bx+10],ax add si,2 add di,2 ;年份2 mov ax,ds:[di] mov es:[bx+2],ax ;收入2 mov ax,ds:[di+84] mov es:[bx+7],ax ;計算人均收入 mov ax,es:[bx+5] mov dx,es:[bx+7] mov bp,es:[bx+10] div bp mov es:[bx+13],ax add di,2 add bx,16 loop copy_s ret code ends end start