1. 程式人生 > >組合語言:編寫子程式(上)

組合語言:編寫子程式(上)

編寫三個子程式,通過他們來認識幾個常見的問題和掌握解決這些問題的方法

1、顯示字串

 ; 顯示字串子程式show_str
	  ; 引數1 ds:si指向要顯示的字串首地址,字串以0結尾
	  ; 引數2 行號dh(0~24) 
	  ; 引數3 列號dl(0~79)
	  ; 引數4 顏色屬性 cl 
	  
	  
	  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

2、解決除法溢位的問題

  ; 解決除法溢位的子程式divdw
	  ; 引數1 被除數 dx+ax 32位組合
	  ; 引數2 除數 cx
	  ; 返回值 商:dx+ax   餘數: cx
	  
	  
	  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
	  
	 

3、數值顯示

      ;   dtoc   
	  ;  引數1  ds:si 指向最終字串首地址
	  ;  引數2  待轉換的word型資料  ax
	  
	  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