1. 程式人生 > >組合語言:編寫子程式(下)課程設計1

組合語言:編寫子程式(下)課程設計1

題目:

彙編程式碼:

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

執行截圖: