汇编笔记一
匯編語言發展至今,由以下3類指令組成:
1.匯編指令:機器碼的助記符,有對應的機器碼;
2.偽指令:沒有對應的機器碼,由編譯器執行,計算機并不執行;
3.其他符號:如:+、-等,由編譯器識別,沒有對應的機器碼。
CPU要想進行數據的讀寫,必須和外部器件(標準說是芯片)進行3類信息的交互:
1.存儲單元的地址(地址信息)
2.器件的選擇,讀或寫的命令(控制信息)
3.讀或寫的數據(數據信息)
8086 ?16位字長 20位地址總線 ?80386 32地址總線
第二章
CPU:運算器、寄存器、控制器、內部總線
寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
物理地址=段地址*16+偏移地址 16位字長 20位地址總線
16位偏移地址,所以一個段的長度最大為64KB
8086E 4個側寄存器:CS、DS、SS、ES。
CS:代碼段寄存器,IP:指令指針寄存器
任意時刻:CS*16+IP單元中讀取指令并執行
8086CPU的工作過程可以簡要描述如下:
1、從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩沖器;
2、IP=IP+所讀取指令的長度,從而指向下一條指令;
3、執行指令。轉到1,重復這個過程。
8086CPU加電后被設置為CS:F000H IP:FFFFH
8086CPU能夠改變CS、IP的有JMP指令 jmp ?段地址:偏移地址
jmp 某一合法寄存器 功能:用寄存器中的值修改IP
Debug是DOS、WINDOWS都提供的實模式(8086方式)程序的調試工具。DEBUG功能如下:
R:查看、改變CPU寄存器的內容;
D:查看內存中的內容;
E:改寫內存中的內容;
U:將內存中的機器指令翻譯成匯編指令;
T:執行一條機器指令;
A:以匯編指令的格式在內存中寫入一條機器指令;
第三章
mov: 1、將數據直接送入一個寄存器中; 2、將一個寄存器中的內容送入另一個寄存器。
mov al,[0] []表示一個內存單元,[0]中的0表示內存單元的偏移地址,段地址自動去DS中取。
8086CPU不支持將數據直接送入段寄存器的操作,只能通過通用寄存器中轉。
MOV 寄存器,數據 比如:MOV AX,8
MOV 寄存器,寄存器 比如:MOV AX,BX
MOV 寄存器,內存單元 比如:MOV AX,[0]?
MOV 內存單元,寄存器 比如:MOV [0],AX
MOV 段寄存器,寄存器 比如:MOV DS,AX
8086CPU中,有兩個寄存器,段寄存器SS和寄存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。
任意時刻,SS:SP指向棧頂元素。push and pop時CPU從SS和SP中得到棧頂的地址。
8086CPU不保證我們對棧的操作不會越界。
第四章
assume cs:codesg //假設某個段寄存器與下面定義的段相關聯
codesg segment ? ?//***segment與*** ends偽指令定義一個段
start: mov ax,0123H
mov bx,0456H //數據最前面如果是字母的話,要在之前再補個0
add ax,bx
add ax,ax
mov ax,4c00H //這兩行用于程序的返回
int 21H
codesg ends
end //匯編程序的結束標志 也可以end start //可以告訴程序的入口在哪里。
Debug和編譯對指令中的"[idata]"有不同的解釋:
Debug:將它解釋為一個內存單元,idata是內存單元的偏移地址;
編譯器:將[idata]解釋為直接數"idata".可能把偏移地址先送入BX中,再用[bx]就可以當偏移地址來用。
在一般的PC機中,DOS方式下,DOS和其他合法的程序一般都不會 使用0:200-0:300(00200h-00300h)的256個字節空間。正常情況下是0.
第六章 包含多個段的程序
在代碼段中存放數據
assume cs:code
code segment
dw 1234H,1343H,0112h ? //dw define word定義字類型,因為在最前面,其偏移地址為0,2,4
start:
? ...
code ends
end start
assume cs:code
code segment
dw 1234H,1343H,0112h ? //dw define word定義字類型,因為在最前面,其偏移地址為0,2,4
dw 0,0,0,0 //這部分空間可以當棧來用。
start:
? ...
code ends
end start
代碼段、數據段、棧放到一個源程序中:
assume cs:code,ds:data,ss:stack
data segment
? dw 0123H,0456H,0789H,0abcH
data ends
stack segment
?dw 0,0,0,0 //db字節單元 dw字單元 dd 雙字單元(dword)double word
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,8 //ss:sp指向棧頂
mov ax,data
mov ds,ax
mov bx,0 //ds:bx指向數據段第一個單元
mov cx,4
? ? ? s:push [bx]
? ? ? ....
code ends
end start
第七章 更靈活的定位內存地址的方法
SI和DI是8086CPU中和BX功能相近的寄存器, SI和DI不能夠分成兩個8位寄存器來使用。
第八章 數據處理的兩個基本問題
自定義的描述性符號:reg(表示一個寄存器)和sreg(表示一個段寄存器)
reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,cl,sp,bp,si,di;
sreg的集合包括:ds,ss,cs,es.
1、在8086CPU中,只有bx,si,di,bp這4個寄存器可以用在"[...]"中來進行內存單元的尋址。
2、只要d [...]中使用寄存器bp,而指令中沒有顯性地給出段地址,段地址就默認在SS中。
在沒有寄存器名存在的情況下,用操作符byte ptr或word ptr指明內存單元的長度
mov word ptr ds:[0],1
inc byte ptr [bx]
div指令 //除法指令
dup指令 //用于數據的重復
db 3 dup (0,1,2) ? 等效 db 0,1,2,0,1,2,0,1,2
第九章 轉移指令的原理
可以修改IP,或同時修改CS和IP的指令統稱為轉移指令。
8086CPU的轉移指令分為以下幾類:
1)無條件轉移指令(如:jmp是)
2)條件轉移指令
3)循環指令(如:loop)
4)過程
5)中斷
9.1 操作符offset
操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。
start:mov ax,offset start ;相當于mov ax,0
由于轉移指令對IP的修改范圍不同,段內轉移又分為:短轉移和近轉移。
短轉移IP的修改范圍為-128 to 127
近轉移IP的修改范圍為-32768 to 32767
jmp short 標號 //段內短轉移
jmp near ptr 標號 //段內近轉移
jmp far ptr 標號 //實現段間轉移
jmp 16位寄存器
轉移地址在內存中的jmp指令
(1) jmp word ptr 內存單元地址(段內轉移)
(2) jmp dword ptr 內存單元地址(段間轉移)
jcxz指令 為有條件轉移指令,所有的有條件轉移指令都是短轉移。
jcxz 標號(如果(cx)=0,轉移到標號處執行。)
loop 標號 ((cx)=(cx)-1,如果(cx)不等于0,轉移到標號處執行
第十章 call和ret指令
這兩指令都是轉移指令,它們都修改IP,或同時修改CS和IP,它們經常被共同用來實現子程序的設計。
ret 相當 pop IP
retf 相當 pop IP ?pop CS
CALL指令執行時進行兩步操作:(1)將當前的IP或CS和IP壓入棧中;(2)轉移。
mul指令
第十一章 標志寄存器
標志寄存器:(1)用來存儲相關指令的某些執行結果; (2)用來為CPU執行相關指令提供行為依據;
? ?(3)用來控制CPU的相關工作方式。
標志寄存器中存儲的信息通常被稱為程序狀態字(PSW)
8086CPU的flag寄存器的結構如圖
15 ?14 ?13 ?12 ?11 ?10 ?9 ?8 ?7 ?6 ?5 ?4 ?3 ?2 ?1 ?0
? ? ? ? ? ? ? ? OF ?DF ?IF TF SF ZF ? ?AF ? ?PF ? ?CF
PF標志:奇偶標志位
SF標志:符號標志位
CF標志:進位標志位
OF標志:溢出標志位
adc opt1,opt2 //opt1=opt1+opt2+CF 帶進位加法指令
sbb opt1,opt2 //opt1=opt1-opt2-CF 帶借位減法指令
cmp opt1,opt2 //opt1-opt2 但并不保存結果,只影響標志寄存器
DF標志:方向標志位
DF=0 每次操作后SI,DI遞增
DF=1 每次操作后SI,DI遞減
pushf的功能是將標志寄存器的值壓棧
popf從棧中彈出數據,送入標志寄存器中。
第十二章 內中斷
當cpu內部有以下事件發生就會產生相應的中斷信息:
(1)除法錯誤 0
(2)單步執行 1
(3)執行int0指令 4
(4)執行int指令 int n n為字節型立即數
中斷向量,就是中斷處理程序的入口地址,中斷向量表,就是中斷處理程序的入口地址的列表。
中斷處理程序編寫步驟:
(1)保存乃至的寄存器
(2)處理中斷
(3)恢復用到的寄存器
(4)用iret指令返回
iret指令的功能用匯編語法描述為:
POP IP
POP CS
POSF
8086中 內存0000:0000-0000:03E8,大小約1KB的空間是系統存中斷處理程序入口地址的中斷向量表。8086支持256個中斷,實際上很少。
rep movsb指令從一處復制到另一處
第十三章 int指令
int n
(1) 取中斷類型碼n;
(2) 標志寄存器入棧,IF=0,TF=0
(3) CS,IP入棧;
(4) (IP)=(n*4),(CS)=(n*4+2)
例子:
編寫、安裝中斷7ch的中斷例程,功能:求一word型數據的平方。
參數:(ax)=要計算的數據
返回值:dx,ax中存放結果的高16位和低16位
應用舉例:求2*3456^2
assume cs:code
code segment
? start:mov ax,3456
int 7ch
add ax,ax
adc dx,dx
mov ax,4c00h
int 21h
? code ends
? end start
安裝程序如下:
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,0ffset sqrend-offset sqrend
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 //程序返回 調用第21h號中斷例程的4ch號子程序,功能為程序返回。
int 21h
? ? sqr: mul ax
iret
? sqrend:nop
pop IP
pop CS
popf
BIOS 和 DOS所提供的中斷例程
? 在系統板的ROM存放著一套BIOS(基本輸入輸出系統),BIOS主要包含以下幾部分內容:
? (1)硬件系統的檢測和初始化程序;
? (2)外部中斷和內部中斷的中斷例程;
? (3)用于對硬件設備進行I/O操作的中斷例程;
? (4)其他和硬件系統相關的中斷例程。
?操作系統DOS也提供了中斷例程,從操作系統的角度來看, DOS的中斷例程就是操作系統向程序員提供的編程資源。
?
?第十四章 端口
?PC機系統中,和CPU通過總線相連的芯片除各種存儲器外,還有以下3種芯片:
?1、各種接口卡(比如:網卡,顯卡)上的接口芯片,它們控制接口卡進行工作;
?2、主板上的接口芯片,CPU通過它們對部分外設進行訪問;
?3、其他芯片,用來存儲相關的系統信息,或進行相關的輸入輸出處理。
?在這些芯片中,都有一組可以由CPU讀寫的寄存器。可見,從CPU的角度,將這些寄存器都當作端口,對它們進行統一編址,從而建立了一個統一的端口
?地址空間,每一個端口在地址空間中都有一個地址。
CPU可以直接讀寫3個地方的數據:
1、CPU內部的寄存器;
2、內存單元;
3、端口
端口地址和內存地址一樣,端口的讀寫指令只有兩條:in 和 out ,分別用于從端口讀取數據和往端口寫入數據。
在in和out指令中,只能使用ax或al來存放從端口中讀入的數據或要發送到端口的數據,訪問8位端口時用al,訪問16位端口時用ax。
CMOS RAM芯片,一般簡稱為CMOS.其特征如下:
1、包含一個實時鐘和一個128個存儲單元的RAM存儲器;
2、該芯片靠電池供電;
3、128個字節的RAM中,內部實時鐘占用0-0DH單元來保存時間信息,其余大部分單元用于保存系統配置信息,
? ? 供系統啟動時BIOS程序讀取,BIOS也提供了相關的程序,使我們可以在開機的時候配置CMOS RAM中的系統信息;
4、該芯片內部有兩個端口,70H為地址端口,71H為數據端口。
shl shr邏輯左移/邏輯右移,移出位放入CF中,用0遞補。
第十五章 外中斷
1、可屏蔽中斷:CPU可以不響應的外中斷。當CPU檢測到可屏蔽中斷信息時,如果IF=1,則CPU在執行完當前指令后響應中斷,
引發中斷過程;如果IF=0,則不響應可屏蔽中斷。
2、不可屏蔽中斷:CPU必須響應的外中斷。對于8086CPU,不可屏蔽中斷的中斷類型碼固定為2,所以中斷過程中,不需要取中斷類型碼。
鍵盤輸入:一般將按下一個鍵時產生的掃描碼稱為通碼,松開一個鍵產生的掃描碼稱為斷碼。掃描碼長度為一個字節,通碼最高位是0,斷碼是1.
斷碼=通碼+80H
1、數據傳送指令:MOV、PUSH、POP、PUSHF、POPF、XCHG。。。
2、算術運算指令:ADD SUB ADC SBB INC DEC CMP IMUL IDIV AAA。。。
3、邏輯指令:AND OR NOT XOR TEST SHL SHR SAL SAR ROL ROR RCL RCR 。。
4、轉移指令:無條件轉移指令JMP、條件轉移指令JCXZ、JE、JB、JA、JNB、JNA。。、循環指令LOOP、過程CALL、RET、RETF、中斷INT、IRET
5、處理機控制指令:這些指令對標志寄存器或其他處理機狀態進行設置,比如:CLD、STD、CLI、STI、NOP、CLC、CMC。。
6、串處理指令:這些指令對內存中的批量數據進行處理。MOVSB、MOVSW。。。
第十六章 直接定址表
? 在標號后面加有“:"的地址標號,只能在代碼段中使用,不能在其他段中使用。
通過依據數據,直接計算出所要找的元素的位置的表,我們稱其為:直接定址表
第十七章 使用BIOS進行鍵盤軟件和磁盤讀寫
鍵盤輸入執行INT 9中斷嗸,從60H端口讀出掃描碼,并將其轉化為相應的ASCII碼或狀態信息,
存儲在內存的指定空間(鍵盤緩沖區或狀態字節)中。
BIOS提供了INT 16H中斷例程供程序員調用。INT 16H中斷例程中包含的一個最重要的功能是從鍵盤緩沖區中讀取一個鍵盤輸入,該功能的編號為0.
MOV AH,0
INT 16H 這兩條指令完成從鍵盤緩沖區中讀取一個鍵盤輸入,并且將其從緩沖區中刪除。
附注:
? 8086/8088不具備實現一個完善的多任務操作系統的功能;
? 80386劃時代,它可以在3個模式下工作:(80386之后都支持這3種方式)
? 1)實模式:工作方式相當于一個8086;
? 2)保護模式:提供支持多任務環境的工作方式,建立保護機制(這與VAX等小球鞋機類似);
? 3)虛擬8086模式:可從保護模式切換至其中的一種8086工作方式,這種方式的提供使用戶可以方便地在保護模式下運行一個或多個原8086程序。
? DOS加載后CPU仍以實模式工作,WINDOWS加載后CPU就以保護模式運行,在WIDOWS中運行一個DOS下的程序,那WINDOWS將CPU切換到虛擬8086模式下運行該程序。
??
? ? ? ?
1.匯編指令:機器碼的助記符,有對應的機器碼;
2.偽指令:沒有對應的機器碼,由編譯器執行,計算機并不執行;
3.其他符號:如:+、-等,由編譯器識別,沒有對應的機器碼。
CPU要想進行數據的讀寫,必須和外部器件(標準說是芯片)進行3類信息的交互:
1.存儲單元的地址(地址信息)
2.器件的選擇,讀或寫的命令(控制信息)
3.讀或寫的數據(數據信息)
8086 ?16位字長 20位地址總線 ?80386 32地址總線
第二章
CPU:運算器、寄存器、控制器、內部總線
寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
物理地址=段地址*16+偏移地址 16位字長 20位地址總線
16位偏移地址,所以一個段的長度最大為64KB
8086E 4個側寄存器:CS、DS、SS、ES。
CS:代碼段寄存器,IP:指令指針寄存器
任意時刻:CS*16+IP單元中讀取指令并執行
8086CPU的工作過程可以簡要描述如下:
1、從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩沖器;
2、IP=IP+所讀取指令的長度,從而指向下一條指令;
3、執行指令。轉到1,重復這個過程。
8086CPU加電后被設置為CS:F000H IP:FFFFH
8086CPU能夠改變CS、IP的有JMP指令 jmp ?段地址:偏移地址
jmp 某一合法寄存器 功能:用寄存器中的值修改IP
Debug是DOS、WINDOWS都提供的實模式(8086方式)程序的調試工具。DEBUG功能如下:
R:查看、改變CPU寄存器的內容;
D:查看內存中的內容;
E:改寫內存中的內容;
U:將內存中的機器指令翻譯成匯編指令;
T:執行一條機器指令;
A:以匯編指令的格式在內存中寫入一條機器指令;
第三章
mov: 1、將數據直接送入一個寄存器中; 2、將一個寄存器中的內容送入另一個寄存器。
mov al,[0] []表示一個內存單元,[0]中的0表示內存單元的偏移地址,段地址自動去DS中取。
8086CPU不支持將數據直接送入段寄存器的操作,只能通過通用寄存器中轉。
MOV 寄存器,數據 比如:MOV AX,8
MOV 寄存器,寄存器 比如:MOV AX,BX
MOV 寄存器,內存單元 比如:MOV AX,[0]?
MOV 內存單元,寄存器 比如:MOV [0],AX
MOV 段寄存器,寄存器 比如:MOV DS,AX
8086CPU中,有兩個寄存器,段寄存器SS和寄存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。
任意時刻,SS:SP指向棧頂元素。push and pop時CPU從SS和SP中得到棧頂的地址。
8086CPU不保證我們對棧的操作不會越界。
第四章
assume cs:codesg //假設某個段寄存器與下面定義的段相關聯
codesg segment ? ?//***segment與*** ends偽指令定義一個段
start: mov ax,0123H
mov bx,0456H //數據最前面如果是字母的話,要在之前再補個0
add ax,bx
add ax,ax
mov ax,4c00H //這兩行用于程序的返回
int 21H
codesg ends
end //匯編程序的結束標志 也可以end start //可以告訴程序的入口在哪里。
Debug和編譯對指令中的"[idata]"有不同的解釋:
Debug:將它解釋為一個內存單元,idata是內存單元的偏移地址;
編譯器:將[idata]解釋為直接數"idata".可能把偏移地址先送入BX中,再用[bx]就可以當偏移地址來用。
在一般的PC機中,DOS方式下,DOS和其他合法的程序一般都不會 使用0:200-0:300(00200h-00300h)的256個字節空間。正常情況下是0.
第六章 包含多個段的程序
在代碼段中存放數據
assume cs:code
code segment
dw 1234H,1343H,0112h ? //dw define word定義字類型,因為在最前面,其偏移地址為0,2,4
start:
? ...
code ends
end start
assume cs:code
code segment
dw 1234H,1343H,0112h ? //dw define word定義字類型,因為在最前面,其偏移地址為0,2,4
dw 0,0,0,0 //這部分空間可以當棧來用。
start:
? ...
code ends
end start
代碼段、數據段、棧放到一個源程序中:
assume cs:code,ds:data,ss:stack
data segment
? dw 0123H,0456H,0789H,0abcH
data ends
stack segment
?dw 0,0,0,0 //db字節單元 dw字單元 dd 雙字單元(dword)double word
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,8 //ss:sp指向棧頂
mov ax,data
mov ds,ax
mov bx,0 //ds:bx指向數據段第一個單元
mov cx,4
? ? ? s:push [bx]
? ? ? ....
code ends
end start
第七章 更靈活的定位內存地址的方法
SI和DI是8086CPU中和BX功能相近的寄存器, SI和DI不能夠分成兩個8位寄存器來使用。
第八章 數據處理的兩個基本問題
自定義的描述性符號:reg(表示一個寄存器)和sreg(表示一個段寄存器)
reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,cl,sp,bp,si,di;
sreg的集合包括:ds,ss,cs,es.
1、在8086CPU中,只有bx,si,di,bp這4個寄存器可以用在"[...]"中來進行內存單元的尋址。
2、只要d [...]中使用寄存器bp,而指令中沒有顯性地給出段地址,段地址就默認在SS中。
在沒有寄存器名存在的情況下,用操作符byte ptr或word ptr指明內存單元的長度
mov word ptr ds:[0],1
inc byte ptr [bx]
div指令 //除法指令
dup指令 //用于數據的重復
db 3 dup (0,1,2) ? 等效 db 0,1,2,0,1,2,0,1,2
第九章 轉移指令的原理
可以修改IP,或同時修改CS和IP的指令統稱為轉移指令。
8086CPU的轉移指令分為以下幾類:
1)無條件轉移指令(如:jmp是)
2)條件轉移指令
3)循環指令(如:loop)
4)過程
5)中斷
9.1 操作符offset
操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址。
start:mov ax,offset start ;相當于mov ax,0
由于轉移指令對IP的修改范圍不同,段內轉移又分為:短轉移和近轉移。
短轉移IP的修改范圍為-128 to 127
近轉移IP的修改范圍為-32768 to 32767
jmp short 標號 //段內短轉移
jmp near ptr 標號 //段內近轉移
jmp far ptr 標號 //實現段間轉移
jmp 16位寄存器
轉移地址在內存中的jmp指令
(1) jmp word ptr 內存單元地址(段內轉移)
(2) jmp dword ptr 內存單元地址(段間轉移)
jcxz指令 為有條件轉移指令,所有的有條件轉移指令都是短轉移。
jcxz 標號(如果(cx)=0,轉移到標號處執行。)
loop 標號 ((cx)=(cx)-1,如果(cx)不等于0,轉移到標號處執行
第十章 call和ret指令
這兩指令都是轉移指令,它們都修改IP,或同時修改CS和IP,它們經常被共同用來實現子程序的設計。
ret 相當 pop IP
retf 相當 pop IP ?pop CS
CALL指令執行時進行兩步操作:(1)將當前的IP或CS和IP壓入棧中;(2)轉移。
mul指令
第十一章 標志寄存器
標志寄存器:(1)用來存儲相關指令的某些執行結果; (2)用來為CPU執行相關指令提供行為依據;
? ?(3)用來控制CPU的相關工作方式。
標志寄存器中存儲的信息通常被稱為程序狀態字(PSW)
8086CPU的flag寄存器的結構如圖
15 ?14 ?13 ?12 ?11 ?10 ?9 ?8 ?7 ?6 ?5 ?4 ?3 ?2 ?1 ?0
? ? ? ? ? ? ? ? OF ?DF ?IF TF SF ZF ? ?AF ? ?PF ? ?CF
PF標志:奇偶標志位
SF標志:符號標志位
CF標志:進位標志位
OF標志:溢出標志位
adc opt1,opt2 //opt1=opt1+opt2+CF 帶進位加法指令
sbb opt1,opt2 //opt1=opt1-opt2-CF 帶借位減法指令
cmp opt1,opt2 //opt1-opt2 但并不保存結果,只影響標志寄存器
DF標志:方向標志位
DF=0 每次操作后SI,DI遞增
DF=1 每次操作后SI,DI遞減
pushf的功能是將標志寄存器的值壓棧
popf從棧中彈出數據,送入標志寄存器中。
第十二章 內中斷
當cpu內部有以下事件發生就會產生相應的中斷信息:
(1)除法錯誤 0
(2)單步執行 1
(3)執行int0指令 4
(4)執行int指令 int n n為字節型立即數
中斷向量,就是中斷處理程序的入口地址,中斷向量表,就是中斷處理程序的入口地址的列表。
中斷處理程序編寫步驟:
(1)保存乃至的寄存器
(2)處理中斷
(3)恢復用到的寄存器
(4)用iret指令返回
iret指令的功能用匯編語法描述為:
POP IP
POP CS
POSF
8086中 內存0000:0000-0000:03E8,大小約1KB的空間是系統存中斷處理程序入口地址的中斷向量表。8086支持256個中斷,實際上很少。
rep movsb指令從一處復制到另一處
第十三章 int指令
int n
(1) 取中斷類型碼n;
(2) 標志寄存器入棧,IF=0,TF=0
(3) CS,IP入棧;
(4) (IP)=(n*4),(CS)=(n*4+2)
例子:
編寫、安裝中斷7ch的中斷例程,功能:求一word型數據的平方。
參數:(ax)=要計算的數據
返回值:dx,ax中存放結果的高16位和低16位
應用舉例:求2*3456^2
assume cs:code
code segment
? start:mov ax,3456
int 7ch
add ax,ax
adc dx,dx
mov ax,4c00h
int 21h
? code ends
? end start
安裝程序如下:
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,0ffset sqrend-offset sqrend
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 //程序返回 調用第21h號中斷例程的4ch號子程序,功能為程序返回。
int 21h
? ? sqr: mul ax
iret
? sqrend:nop
pop IP
pop CS
popf
BIOS 和 DOS所提供的中斷例程
? 在系統板的ROM存放著一套BIOS(基本輸入輸出系統),BIOS主要包含以下幾部分內容:
? (1)硬件系統的檢測和初始化程序;
? (2)外部中斷和內部中斷的中斷例程;
? (3)用于對硬件設備進行I/O操作的中斷例程;
? (4)其他和硬件系統相關的中斷例程。
?操作系統DOS也提供了中斷例程,從操作系統的角度來看, DOS的中斷例程就是操作系統向程序員提供的編程資源。
?
?第十四章 端口
?PC機系統中,和CPU通過總線相連的芯片除各種存儲器外,還有以下3種芯片:
?1、各種接口卡(比如:網卡,顯卡)上的接口芯片,它們控制接口卡進行工作;
?2、主板上的接口芯片,CPU通過它們對部分外設進行訪問;
?3、其他芯片,用來存儲相關的系統信息,或進行相關的輸入輸出處理。
?在這些芯片中,都有一組可以由CPU讀寫的寄存器。可見,從CPU的角度,將這些寄存器都當作端口,對它們進行統一編址,從而建立了一個統一的端口
?地址空間,每一個端口在地址空間中都有一個地址。
CPU可以直接讀寫3個地方的數據:
1、CPU內部的寄存器;
2、內存單元;
3、端口
端口地址和內存地址一樣,端口的讀寫指令只有兩條:in 和 out ,分別用于從端口讀取數據和往端口寫入數據。
在in和out指令中,只能使用ax或al來存放從端口中讀入的數據或要發送到端口的數據,訪問8位端口時用al,訪問16位端口時用ax。
CMOS RAM芯片,一般簡稱為CMOS.其特征如下:
1、包含一個實時鐘和一個128個存儲單元的RAM存儲器;
2、該芯片靠電池供電;
3、128個字節的RAM中,內部實時鐘占用0-0DH單元來保存時間信息,其余大部分單元用于保存系統配置信息,
? ? 供系統啟動時BIOS程序讀取,BIOS也提供了相關的程序,使我們可以在開機的時候配置CMOS RAM中的系統信息;
4、該芯片內部有兩個端口,70H為地址端口,71H為數據端口。
shl shr邏輯左移/邏輯右移,移出位放入CF中,用0遞補。
第十五章 外中斷
1、可屏蔽中斷:CPU可以不響應的外中斷。當CPU檢測到可屏蔽中斷信息時,如果IF=1,則CPU在執行完當前指令后響應中斷,
引發中斷過程;如果IF=0,則不響應可屏蔽中斷。
2、不可屏蔽中斷:CPU必須響應的外中斷。對于8086CPU,不可屏蔽中斷的中斷類型碼固定為2,所以中斷過程中,不需要取中斷類型碼。
鍵盤輸入:一般將按下一個鍵時產生的掃描碼稱為通碼,松開一個鍵產生的掃描碼稱為斷碼。掃描碼長度為一個字節,通碼最高位是0,斷碼是1.
斷碼=通碼+80H
1、數據傳送指令:MOV、PUSH、POP、PUSHF、POPF、XCHG。。。
2、算術運算指令:ADD SUB ADC SBB INC DEC CMP IMUL IDIV AAA。。。
3、邏輯指令:AND OR NOT XOR TEST SHL SHR SAL SAR ROL ROR RCL RCR 。。
4、轉移指令:無條件轉移指令JMP、條件轉移指令JCXZ、JE、JB、JA、JNB、JNA。。、循環指令LOOP、過程CALL、RET、RETF、中斷INT、IRET
5、處理機控制指令:這些指令對標志寄存器或其他處理機狀態進行設置,比如:CLD、STD、CLI、STI、NOP、CLC、CMC。。
6、串處理指令:這些指令對內存中的批量數據進行處理。MOVSB、MOVSW。。。
第十六章 直接定址表
? 在標號后面加有“:"的地址標號,只能在代碼段中使用,不能在其他段中使用。
通過依據數據,直接計算出所要找的元素的位置的表,我們稱其為:直接定址表
第十七章 使用BIOS進行鍵盤軟件和磁盤讀寫
鍵盤輸入執行INT 9中斷嗸,從60H端口讀出掃描碼,并將其轉化為相應的ASCII碼或狀態信息,
存儲在內存的指定空間(鍵盤緩沖區或狀態字節)中。
BIOS提供了INT 16H中斷例程供程序員調用。INT 16H中斷例程中包含的一個最重要的功能是從鍵盤緩沖區中讀取一個鍵盤輸入,該功能的編號為0.
MOV AH,0
INT 16H 這兩條指令完成從鍵盤緩沖區中讀取一個鍵盤輸入,并且將其從緩沖區中刪除。
附注:
? 8086/8088不具備實現一個完善的多任務操作系統的功能;
? 80386劃時代,它可以在3個模式下工作:(80386之后都支持這3種方式)
? 1)實模式:工作方式相當于一個8086;
? 2)保護模式:提供支持多任務環境的工作方式,建立保護機制(這與VAX等小球鞋機類似);
? 3)虛擬8086模式:可從保護模式切換至其中的一種8086工作方式,這種方式的提供使用戶可以方便地在保護模式下運行一個或多個原8086程序。
? DOS加載后CPU仍以實模式工作,WINDOWS加載后CPU就以保護模式運行,在WIDOWS中運行一個DOS下的程序,那WINDOWS將CPU切換到虛擬8086模式下運行該程序。
??
? ? ? ?
總結
- 上一篇: c与c++遗漏点
- 下一篇: UNIX环境高级编程第二版_扫描 版笔记