匯編入門學習筆記 (十二)—— int指令、port


瘋狂的暑假學習之  匯編入門學習筆記 (十二)——  int指令、port


參考: 《匯編語言》 王爽 第13、14章


一、int指令


1. int指令引發的中斷


int n指令,相當於引發一個n號中斷。

運行過程相當於:

(1)取中斷類型嗎n。

(2)標志寄存器入棧;設置IF=0,TF=0。

(3)CS,IP入棧

(4)(IP)=(n*4),(CS)=(n*4+2)



樣例1:編寫、安裝中斷7ch。實現求一個word型數據的平方,用ax存放這個數據。

 assume cs:code
 
 code segment
 start:
	mov ax,cs
	mov ds,ax
	mov si,offset sqr
	mov ax,0
	mov es,ax
	mov di,200h
	mov cx,offset sqrend - offset sqr
	cld
	rep movsb
	
	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0
	
	mov ax,4c00h
	int 21h
	
sqr:
	mul ax
	iret
sqrend:
	nop
	
 code ends
 
 end start


assume cs:code

code segment
start:	
	mov ax,3
	int 7ch
	mov ax,4c00h
	int 21h
code ends

end start



樣例2:編寫、安裝7ch中斷。實現將data段中的字符串轉化為大寫。

assume cs:code

code segment

start:
	mov ax,cs
	mov ds,ax
	mov si,offset change
	
	mov ax,0
	mov es,ax
	mov di,200h
	
	mov cx,offset changeend - offset change
	cld
	rep movsb
	
	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0
	
	mov ax,4c00h
	int 21h

change:
	push cx
	push si
s:	mov ch,0
	mov cl,ds:[si]
	jcxz ok
	and cl,11011111b
	mov ds:[si],cl
	inc si
	jmp short s
ok:
	pop si
	pop cx
	iret
changeend:
	nop
	
code ends

end start

assume cs:code

data segment
	db 'conversation',0
data ends

code segment

start:
	mov ax,data
	mov ds,ax
	mov si,0
	int 7ch
	
	mov ax,4c00h
	int 21h
	
code ends

end start


樣例3:使中斷7ch實現loop指令的功能。

assume cs:code

code segment

start:
	mov ax,cs
	mov ds,ax
	mov si,offset lp
	
	mov ax,0
	mov es,ax
	mov di,200h
	
	mov cx,offset lpend - offset lp
	cld
	rep movsb
	
	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0
	
	mov ax,4c00h
	int 21h

lp:
	push bp
	mov bp,sp
	dec cx
	jcxz lpret
	add [bp+2],bx
lpret:
	pop bp
	iret
lpend:
	nop
	
code ends

end start

assume cs:code

code segment

start:
	mov ax,0b800h
	mov es,ax
	mov di,160*12
	mov bx,offset s - offset se
	mov cx,80
s:	
	mov byte ptr es:[di],'!'
	add di,2
	int 7ch
se:	
	nop
	
	mov ax,4c00h
	int 21h

code ends

end start


2. BIOS和DOS的中斷例程


BIOS中主要包括:

(1)硬件系統的檢測和初始化程序

(2)外部中斷和內部中斷的中斷例程

(3)用於對硬件設備進行I/O操作的中斷例程

(4)其它和硬件系統相關的中斷例程


BIOS和DOS提供的中斷例程安裝過程

(1)開機。初始化CS=0FFFFH。IP=0,運行FFFF:0程序。FFFF:0程序有一條跳轉指令。運行完后。CPU會去運行BIOS中的硬件系統檢測和初始化程序。

(2)初始化程序將建立BIOS所支持的中斷向量。即將BIOS中提供的中斷例程的入口地址登記在中斷向量表中。注意:BIOS所提供的中斷例程。僅僅須要將入口地址登記在中斷向量表中就可以,由於它們是固化在ROM中的。

(3)硬件系統檢測和初始化完畢后,調用int 19h進行操作系統的引導。從此將計算機交給操作系統控制

(4)DOS啟動后,除了完畢其它工作外,還將他所提供的中斷例程裝入內存中。並建立對應的中斷向量。



一般來說。一個中斷例程包括了多個子程序,用ah來傳遞內部子程序的編號


int 10h中斷

它是BIOS提供的中斷例程,當中包括了多個和屏幕輸出有關的子程序


ah=2   設置光標位置,此時bh存放 第幾頁;dh存放行號;dl存放列號

ah=9  在光標位置顯示字符,此時al存放字符;bl存放顏色屬性;bh存放第幾頁。cx存放這個字符反復顯示幾


樣例:

assume cs:code

code segment

start:
	mov ah,2
	mov bh,0
	mov dh,5
	mov dl,12
	int 10h
	
	
	mov ah,9
	mov al,'a'
	mov bl,11001010b
	mov bh,0
	mov cx,3
	int 10h
	
	mov ax,4c00h
	int 21h

code ends

end start



int 21h中斷

它是DOS提供的中斷例程,包括了DOS提供給程序猿在編程時調用的子程序。

前面我們一直用以下的代碼返回

mov  ax,4c00h
int 21h


事實上這是用了21號 中斷 例程的4ch號子程序,al是用來存放程序返回值的,上面的代碼即0

本質就是:

mov ah,4ch
mov al,0
int 21h


21h號 中斷 例程的9 號子程序功能是在光標位置顯示字符串,用ds:dx指定字符串的首地址,字符串要以‘$’結尾

樣例:

assume cs:code

data segment
	db 'Welcome to masm!','$'
data ends

code segment

start:
	mov ah,2
	mov bh,0
	mov dh,5
	mov dl,12
	int 10h
	
	mov ax,data
	mov ds,ax
	mov dx,0    ;ds:dx指向字符串的首地址 data:0
	mov ah,9
	int 21h
	
	mov ax,4c00h
	int 21h
	

code ends

end start



二、port


     各種芯片(網卡,顯卡等)都有一組能夠由CPU讀寫的寄存器。CPU能夠通過這些寄存器讀取數據,或者操控芯片。

CPU把這些寄存器當做port,對這些寄存器進行統一編址。

每一個port宅地址空間中都有一個地址。


1. in和out指令


訪問port用in和out

假設:

in al,60h  ; 從60hport讀取數據放到al中

注意:僅僅能用ax或者al來存放從port中讀入的數據或要發送到port的數據。


對0~255以內的port進行讀寫時:

in al,20h

out 20h,al


對256~65535的port進行讀寫時,port號放在dx中:

mov dx,3f8h

in al.dx

ou dx,al


2. shl和shr指令


shl:左移指令,最低位補0,將移出的追后以為寫入CF中


假設是移1位就:

shl  al,1


假設移動大於1位,必須將移動的位數放在cl中

mov cl,3

shl al,cl


shr是右移。其它與shl一樣


3. CMOS RAM芯片


PC中有一個靠電池供電CMOS RAM芯片,它包括一個實時種和一個有128個存儲單元的RAM存儲器。


它有兩個port:

70h:保存要讀取內存單元的地址

71h:讀取內存單元


CMOS RAM中存儲的時間信息


0:秒。2:分。

4:時;7:日。

8:月;9:年;


樣例:在屏幕顯示月份。

assume cs:code

code segment

start:
	mov al,8
	out 70h,al
	in al,71h
	
	mov ah,al
	mov cl,4
	shr ah,cl
	and al,00001111b
	
	add ah,30h   ;'0' 的ASCII值
	add al,30h
	
	mov bx,0b800h
	mov es,bx
	mov byte ptr es:[160*12+40*2],ah
	mov byte ptr es:[160*12+40*2+2],al
	
	mov ax,4c00h
	int 21h

code ends

end start





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM