組合語言:編寫子程式(下)課程設計1
阿新 • • 發佈:2018-12-17
題目:
彙編程式碼:
assume cs:codesg 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 345980,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 sumn ne ?? ') table ends data_string segment db 10 dup (0) data_string ends stack segment db 16 dup (0) stack ends codesg segment start: ;################之前的那個程式碼################## mov ax,data mov ds,ax mov ax,table mov es,ax mov di,0 mov bx,0 mov si,0 mov cx,21 s: ;複製年份 year mov ax,[si] mov es:[bx],ax mov ax,[si+2] mov es:[bx+2],ax ;複製總收入 summ mov ax,[si+84] mov es:[bx+5],ax mov dx,[si+84+2];高位直接存在dx mov es:[bx+5+2],dx ;複製僱員人數 ne mov bp,[di+168] mov es:[bx+10],bp div word ptr es:[bx+10] ;商,餘數在dx中 mov es:[bx+13],ax add bx,16 add si,4 add di,2 loop s ;################################################ ;################新增加顯示在螢幕上############## ;##################寫成四個迴圈################## mov ax,data_string mov ds,ax mov si,0 ;ds:[si]指向字串首地址 mov ax,stack mov ss,ax mov sp,10H mov di,1 mov bx,0 mov si,0 mov cx,21 year: push cx mov si,0 mov cx,2 s_year: mov ax,es:[bx+si] mov ds:[si],ax inc si inc si loop s_year inc di mov ax,di mov dh,al ;列號 mov dl,12 ;行號 mov cl,08h mov si,0 call show_str pop cx add bx,10H loop year ;************************************************ ;************************************************ mov di,1 mov bx,0 mov si,0 mov cx,21 sumn: push cx mov ax,es:[bx+5] mov dx,es:[bx+7] call dtoc inc di mov ax,di mov dh,al mov dl,23 mov cl,0ah mov si,0 call show_str pop cx add bx,10H loop sumn ;************************************************ ;************************************************ mov di,1 mov bx,0 mov si,0 mov cx,21 ne: push cx mov ax,es:[bx+0aH] mov dx,0 call dtoc inc di mov ax,di mov dh,al mov dl,35 mov cl,0ch mov si,0 call show_str pop cx add bx,10H loop ne ;************************************************ ;************************************************ mov di,1 mov bx,0 mov si,0 mov cx,21 xx: push cx mov ax,es:[bx+0dH] mov dx,0 call dtoc inc di mov ax,di mov dh,al mov dl,45 mov cl,06h mov si,0 call show_str pop cx add bx,10H loop xx ;************************************************ ;************************************************ mov ax,4c00H int 21H ; ############################################### ; #### #### ; #### 子 程 序 #### ; #### #### ; ############################################### ;###################show_str##################### ;名稱:show_str ;功能:在指定位置,用指定顏色,顯示一個用0結束的字串 ;引數:(dh)=行號(取值範圍0-24),(dl)=列號(取值範圍0-79) ; (cl)=顏色,ds:si指向字串首地址 ;返回:無 show_str: push ax push bx push cx push dx push si push es show_str_start: mov ax,0b800h mov es,ax ; 計算行偏移 ,結果在ax中 mov al,160 mul dh ; 計算列偏移 ,結果在dx中 mov dh,0 add dx,dx ;計算總偏移,結果放在bx中 mov bx,ax add bx,dx ;到目前,es:[bx]指向目標視訊記憶體 mov dl,cl string_copy: mov cl,[si] mov ch,0 jcxz string_copy_ok ;當(ds:[si])==0時跳出迴圈 mov es:[bx],cl mov es:[bx+1],dl inc si add bx,2 jmp short string_copy string_copy_ok: pop es pop si pop dx pop cx pop bx pop ax ret ;####################divdw####################### ;名稱:divdw ;功能:進行不會產生溢位的除法運算,被除數為dword型,除數為word型,結果為dword型 ;引數:(ax)=dword型資料低16位,(dx)=dword型資料高16位,(cx)=除數 ;返回:(dx)=結果的高16位,(ax)=結果的低16位,(cx)=餘數 ;應用舉例:計算1000000/10(f4240H/0aH) divdw: push bx push ax ; 被除數高位除CX 27/2 --> AX 商 DX 餘數 mov ax,dx mov dx,0 div cx mov bx,ax ;商的高16位暫時存放在BX中 ; 商在AX中,餘數在DX中 ; 餘數就是最終的餘數放到CX中去,商就是最終的商的低16位,不用動! pop ax div cx mov cx,dx mov dx,bx pop bx ret ;###################dtoc######################### ;名稱:dtoc ;功能:將dword型資料轉變為表示十進位制數的字串,字串以0為結尾符。 ;引數:(ax)=dword型資料的低16位,(dx)=dword型資料的高16位,ds:si指向字串的首地址 ;返回:無 dtoc: push ax push bx push cx push dx push si push di dtoc_start: mov di,0 ; 用di 存放壓入的資料個數 pick: mov dx,0 mov bx,10 div bx ; 商在ax中 餘數在dx中,直接進棧 add dx,30h push dx inc di mov cx,ax jcxz pick_ok jmp short pick pick_ok: mov cx,di ; 確定彈出的資料個數 ; 堆疊中的資料出棧,送到目標記憶體位置 dtoc_move: pop ax mov ds:[si],al inc si loop dtoc_move ; 在字串末尾新增一個結束符0 mov byte ptr [si],0 pop di pop si pop dx pop cx pop bx pop ax ret ;####################################################### codesg ends end start