做網(wǎng)站很累官方網(wǎng)站怎么注冊
一、int 指令
int 指令的格式為:int n,n 為中斷類型碼,它的功能是引發(fā)中斷過程
CPU 執(zhí)行 intn 指令,相當(dāng)于引發(fā)一個n號中斷的中斷過程,執(zhí)行過程如下:
(1) 取中斷類型碼 n;
(2) 標(biāo)志寄存器入棧,IF=0,TF=0;
(3) CS、IP 入棧;
(4) (IP)=(n*4),(CS)=(n*4+2)。
從此處轉(zhuǎn)去執(zhí)行n號中斷的中斷處理程序。?
二、BIOS 和 DOS 提供的中斷例程?
系統(tǒng) ROM 中存放著一套程序,稱為 BIOS,除此之外還有 DOS 都提供了一套可以供我們調(diào)用的中斷例程,不同歷程有不同的中斷類型碼,并且還能根據(jù)傳入的參數(shù)不同而實現(xiàn)不同的功能,也就是說同一個類型碼的中斷例程可以實現(xiàn)很多不同功能,如 int 10h 是 BIOS 提供的包含了多個和屏幕輸出相關(guān)子程序的中斷例程
BIOS 和 DOS 安裝歷程的過程是,開機后 CPU 一加電,自動初始化 CS 為 0FFFFH,IP為 0 ,而在這個地方有一個跳轉(zhuǎn)指令,挑戰(zhàn)到 BIOS 和系統(tǒng)檢測初始化程序。在 BIOS 系統(tǒng)檢測初始化程序中會設(shè)置中斷向量表中的值?
三、端口
從 CPU 的角度,將這些寄存器都當(dāng)作端口,對它們進行統(tǒng)一編址,從而建立了一個統(tǒng)一的端口地址空間。每一個端口在地址空間中都有一個地址。?
四、端口的讀寫
在訪問端口的時候,CPU 通過端口地址來定位端口
端口的讀寫指令只有兩條:in 和 out,分別用于從端口讀取數(shù)據(jù)和往端口寫入數(shù)據(jù)?
in al 60h ;從 60h 號端口讀入一個字節(jié)
注意,在 in 和 out 指令中,只能使用 ax 或 al 來存放從端口中讀入的數(shù)據(jù)或要發(fā)送到端口中的數(shù)據(jù)。訪問 8 位端口時用 al,訪問 16 位端口時用 ax。
五、shl 和 shr 指令
shl 是邏輯左移指令,它的功能為:
? ? ? ? 1. 將一個寄存器或內(nèi)存單元中的數(shù)據(jù)向左移位
? ? ? ? 2. 將最后移出的一位寫入 CF 中
? ? ? ? 3. 最低位用 0?補充
mov al,01001000b
shl al,1 ;將 a1 中的數(shù)據(jù)左移一位
執(zhí)行后 (al)=10010000b,CF=0?
shr 是邏輯右移指令,它和 shl 所進行的操作剛好相反
? ? ? ? 1. 將一個寄存器或內(nèi)存單元中的數(shù)據(jù)向右移位
? ? ? ? 2. 將最后移出的一位寫入 CF 中
? ? ? ? 3. 最高位用 0 補充
mov al,10000001b
shr al,1 ;將 al 中的數(shù)據(jù)右移一位
執(zhí)行后(al)=01000000b,CF=1
六、外中斷信息
在 PC 系統(tǒng)中,外中斷源一共有以下兩類:
? ? ? ? 1. 可屏蔽中斷(CPU 可以不響應(yīng)的外中斷)
? ? ? ? 2. 不可屏蔽中斷(CPU 必須響應(yīng)的外中斷)
CPU 是否響應(yīng)可屏蔽中斷,要看標(biāo)志寄存器的 IF 位的設(shè)置
當(dāng) CPU 檢測到可屏蔽中斷信息時,如果 IF=1,則 CPU 在執(zhí)行完當(dāng)前指令后響應(yīng)中斷,引發(fā)中斷過程;如果 IF=0,則不響應(yīng)可屏蔽中斷
當(dāng)然,如果在中斷處理程序中需要處理可屏蔽中斷,可以用指令將 IF 設(shè)置為 1。8086 CPU 提供的設(shè)置 IF 的指令如下:
????????1. sti,設(shè)置 IF=1
????????2. cli,設(shè)置 IF=0
七、PC 機鍵盤的處理過程
鍵盤上有一個芯片對鍵盤中每一個鍵盤的狀態(tài)進行掃描,開關(guān)按下生成一個掃描碼——通碼,記錄按下的按鍵位置,開關(guān)抬起也會產(chǎn)生一個掃描——斷碼,碼記錄松開的位置,都是送入60h端口。通碼的第7位為0,斷碼第7位為1,也就是說斷碼=通碼+80h
BIOS中鍵盤緩沖區(qū)能存儲15個鍵盤輸入,每個鍵盤輸入兩字節(jié),高位存放掃描碼,低位存放字符。此外,0040:17單元存放鍵盤狀態(tài)字節(jié),記錄了控制鍵和切換鍵的狀態(tài),記錄信息如下:
位 | 含義 |
---|---|
0 | 右shift,1表示按下 |
1 | 左shift,1按下 |
2 | Ctrl,1按下 |
3 | Alt,1按下 |
4 | ScrollLock狀態(tài),1表示指示燈亮 |
5 | NumLock狀態(tài),1表示小鍵盤輸入的是數(shù)字 |
6 | CapsLock狀態(tài),1表示大寫字母 |
7 | Insert狀態(tài),1表示處于刪除狀態(tài) |
八、描述了單元長度的標(biāo)號
下面的程序?qū)?code 段中的a標(biāo)號處的8個數(shù)據(jù)累加,結(jié)果存儲到b標(biāo)號處的字中
code segmenta: db 1,2,3,4,5,6,7,8b: dw 0start: mov si offset amov bx,offset bmov cx,8s: mov al,cs:[si]mov ah,0add cs:[bx],axinc siloop smov ax,4c00hint 21hcode endsend start
九、在其他段中使用數(shù)據(jù)標(biāo)號
注意,在后面加有“:”的地址標(biāo)號,只能在代碼段中使用,不能在其他段中使用
data seqmenta: db 1,2,3,4,5,6,7,8b: dw 0data endscode seqmentstart: mov ax,datamov ds,ax……………………
十、直接定址表
使用查表的方法編寫相關(guān)程序,如輸出一個字節(jié)型數(shù)據(jù)的16進制形式(子程序):
showbyte jmp short show
table db '0123456789ABCDEF'
show:push bx
push es
mov ah,al
she ah,1
she ah,1
she ah,1
she ah,1 ;右移四位,位移子程序限制使用的寄存器數(shù),只能這么移
and al,00001111b
mov bl,al
mov bh,0
mov ah,table[bx] ;高四位作為相對于table的偏移,取得對應(yīng)字符
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah
mov bl,al
mov bh,0
mov al,table[bx]
mov es:[160*12+40*2+2],al
pop es
pop bx
ret