概括:Intel的晶片具有良好的相容性,8086和80386是兩個典型的代表,以下介紹8086的程式設計模型。
一、寄存器
寄存器是對CPU硬體的抽象,指令系統是CPU功能的抽象。
1.1、以下是CPU寄存器組結構圖:

1.2、寄存器概述
不同的寄存器配合不同的指令來完成各種操作,所有的寄存器都是16位,其中AX,BX,CX,DX的高低8位可以單獨通路。
AX,BX,CX,DX是資料寄存器,CS,DS,SS,ES是段寄存器,IP是指令指針寄存器,SP,BP,SI,DI是資料指針寄存器,FLAG 是運算結果标志寄存器。
二、存儲器接口
8086隻能工作在實模式下,也就是不提供虛拟位址的機制,有20根位址線,是以能通路的位址範圍是1M,而寄存器是16位,無法直接尋址1M的位址範圍,是以用兩個寄存器來通路,具體的方法如下:
2.1、把1M的空間分成段,每段的粒度是16位元組,每段最大為64KB。
2.2、這樣就可以通過CS,DS,SS,ES來存儲段号,而用SP,BP等來存儲偏移,就可以達到尋址1MB空間的目的。
2.3、為什麼粒度必須是16位元組?
因為如果粒度小于16位元組的話,段号就有可能超過64KB,無法用16bit的寄存器表示,而如果粒度大于16位元組的話,則很有可能會造成空間浪費,如果粒度設定為可變的話,則還需要另外的寄存器來存儲粒度,會造成效率和空間的極大浪費。
三、尋址方式
3.1、立即數尋址,操作數位于代碼段中,mov ax,1234h
3.2、寄存器尋址,操作數位于寄存器中,mov ax,bx
3.3、存儲器尋址,操作數位于存儲器中
★直接尋址,直接給出位址,mov ax,[1234h];mov ax,es:[1234h],如果沒有指明位址所在段,則預設為DS。
★寄存器間接尋址,位址偏移量在寄存器中,和直接尋址類似,mov ax,es:[bx]
★寄存器相對尋址,mov ax,es:[bx+1234h] 可以實作通路一維數組的某一進制素
★基址加變址方式,mov ax,[bx+di] 可以實作周遊一維數組
★相對基址加變址,mov ax,[bx+di+1234h] 可以實作通路二維數組的某一進制素
基址隻能使用 bx,bp,bp預設對應ss段,變址隻能使用si,di
3.4、尋址方式總結
★存儲器内部不能直接的傳輸資料是顯而易見的,因為必須要CPU的參與才能完成資料的傳輸。
★存儲器的尋址就是段的指定和偏移量的指定,其中偏移量的指定有幾種方式,靈活應用即可。
四、指令系統 [Label:] Operator [Operand1[,Operand2]][;comment]
4.1、指令總結如下圖:
4.2、條件跳轉
條件跳轉指令根據FLAG的相關标志位的結果進行跳轉,跳轉範圍在-126-129之間,總結如下圖:
五、僞指令
所謂僞指令就是不直接對應80x86的一條特定的指令,它的作用是為彙編器或者連結器提供程式的輔助資訊,總結如下圖:
5.1、段定義詳解
六、dos功能調用
assume cs:codeseg
codeseg segment
mov al,97 ;參數
mov ah,2 ;功能号
int 21h ;dos調用
mov ah,4ch
int 21h
codeseg ends
end
七、中斷
7.1、中斷向量表大小為1024byte,每4byte代表一個中斷入口位址,低字表示偏移,高字表示段号,為了容易尋址中斷向量表,中斷向量表位于位址0處。
7.2、通過 dos的35号調用,入口參數為中斷号,es,bx将得到中斷入口位址的段号和偏移。(當然也可以自己查)
7.3、中斷傳回用iret