天天看點

8086程式設計模型

概括:Intel的晶片具有良好的相容性,8086和80386是兩個典型的代表,以下介紹8086的程式設計模型。

一、寄存器

寄存器是對CPU硬體的抽象,指令系統是CPU功能的抽象。

1.1、以下是CPU寄存器組結構圖:

8086程式設計模型

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、指令總結如下圖: 

8086程式設計模型

4.2、條件跳轉

條件跳轉指令根據FLAG的相關标志位的結果進行跳轉,跳轉範圍在-126-129之間,總結如下圖:

8086程式設計模型

五、僞指令

所謂僞指令就是不直接對應80x86的一條特定的指令,它的作用是為彙編器或者連結器提供程式的輔助資訊,總結如下圖:

8086程式設計模型

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

繼續閱讀