詳解 指令尋址方式

1、指令的一般格式:

一條指令通常由兩個部分組成:

  • 第一部分爲操作碼(指令碼)用於指出指令要進行何種操作;
  • 另一部分是指令操作的對象,稱爲操作碼;

在這裏插入圖片描述
8086 指令的長度在 1~7個字節之間。操作碼佔一個字節或兩個字節。
指令的長度主要決定於操作數的個數及其採用的尋址方式。

指令在格式上就有以下3種形式:

  • 零操作數指令,指令在形式上只有操作碼,操作數是隱含存在的;
  • 單操作數指令,指令中僅給出一個操作數,另一個操作數隱含存在;
  • 雙操作數指令,指令中給出一個目標操作數,一個源操作數;

指令中的操作數類型

8086指令中的操作數主要有3種類型:立即數操作數、寄存器操作數、存儲器操作數;

  • 立即數操作數:
    具有固定數值的操作數,即常數;在指令中,立即數操作數只能用作源操作數,而不能用作目標操作數;

  • 寄存器操作數:
    8086CPU 的 8個通用寄存器和 4個段寄存器可以作爲指令中的寄存器操作數,可作爲源操作數和目標操作數;通用寄存器存放參加運算的數據或數據所在存儲器單元的偏移地址;段寄存器存放當前操作數的段基地址;

  • 存儲器操作數:
    存儲器操作數是指參加運算的數據,存放在內存中的,可作爲源操作數、目標操作數;

指令的執行時間

一條指令的執行時間應包括 :取指令、取操作數、執行指令、傳送結果;

三種類型的操作數中,寄存器操作數的指令執行速度最快,立即數操作數次之,存儲器操作數指令的執行速度最慢;


2、尋址方式

尋址方式,是指獲得操作數所在的地址的方法。一般將尋址方式分爲兩種:

  • 尋找操作數的地址;
  • 尋找要執行的下一條指令的地址;

@1 立即尋址

指令格式:
MOV  AX , 1234H

立即數主要是給寄存器賦初始值;

立即尋址方式只針對源操作數,此時源操作數是一個立即數,它作爲指令的一部分,緊跟在指令的操作碼之後、存放於內存的代碼段中;

立即數:通常把在立即尋址方式指令中給出的數稱爲立即數。立即數可以是8位、16位或32位,該數值緊跟在操作碼之後。如果立即數爲16位或32位,那麼,它將按“高高低低”的原則進行存儲。


@2 直接尋址

指令格式:
MOV  AX ,[1234H]

直接尋址方式表示參加運算的數據存放在內存中,指令中給出的是數據存放的偏移地址;

注意:
直接尋址指令中的數值是操作數的 16 位偏移地址,而不是數據本身,爲了區分,指令系統規定偏移地址必須用方括號括起來;在此,可以理解爲 C語言的 指針符號 ‘*’ ——解析指針,將其類比爲解析其中的偏移地址;


@3 寄存器尋址

指令格式:
MOV  SI , AX

在寄存器尋址方式下,指令的操作數爲 CPU 的內部寄存器,可以是數據寄存器(8位或16位),也可以是地址指針、變址寄存器、段寄存器;

EA={AXBXCXDXCSDSESSSBPSPSIDIEA = \begin{cases} 數據寄存器 \quad AX、BX、CX、DX \\ 段寄存器 \qquad CS、DS、ES、SS \\ 基址寄存器 \quad BP、SP \\ 變址寄存器 \quad SI、DI \end{cases}
EA:effective address 偏移地址(有效地址)

採用寄存器尋址方式,雖然指令操作碼在代碼段中,但操作數在內部寄存器中,指令執行時不必通過訪問內存就可以取到操作數,故執行速度較快;


@4 寄存器間接尋址

指令格式:
MOV  AX , [SI]

寄存器間接尋址是用寄存器的內容表示操作數的偏移地址。

寄存器間接尋址方式中存放操作數偏移地址的寄存器只允許是 SI、DI、BX、BP;
選擇不同的間接尋址寄存器涉及的段寄存器不同。在默認情況下:

  • 選擇SI、DI、BX 作間接尋址寄存器時,操作數在數據段,段基地址由 DS決定;
  • 選擇 BP 作間接尋址寄存器時,則操作數在堆棧段,段基地址由 SS 決定;


@5 寄存器相對尋址

指令格式:
MOV  BX , [BP - 8]

在寄存器相對尋址方式中,操作數在內存中的偏移地址由間接地址寄存器的內容加上指令中給出的一個 8 位或 16 位的位偏移量組成;

EA={BXBPSIDI}+{8&16}EA=\begin{Bmatrix} BX \\ BP \\ SI \\ DI \end{Bmatrix}+ \begin{Bmatrix} 8位 \& 16位 \\位移量 \end{Bmatrix}

寄存器相對尋址常用於存取表格或一維數組中的元素 —— 把表格的起始地址作爲作爲位移量,元素的下標值放在間接地址寄存器中(反過來也可以);

如果有效地址超過 64KB ,則取64KB 的模;


@6 基址 - 變址 尋址

指令格式:
MOV AX , [BX - SI]

基址 - 變址尋址方式由一個基址寄存器(BX 或 BP)的內容和一個變址寄存器(SI 或 DI)的內容相加而形成操作數的偏移地址;

EA={BXBP}+{SIDI}EA=\begin{Bmatrix} BX \\ BP \end{Bmatrix}+ \begin{Bmatrix} SI \\ DI \end{Bmatrix}

在默認情況下

  • 指令中若用 BX 作基址寄存器,則段地址在 DS 中;
  • 指令中若用 BP 作基址寄存器,則段地址在 SS 中;


@7 基址 - 變址 - 相對尋址

指令格式:
MOV  AX , [BX + DI +5]

基址 - 變址 - 相對尋址方式是 基址 - 變址尋址方式的擴充;

EA={BXBP}+{SIDI}+{8&16}EA=\begin{Bmatrix} BX \\ BP \end{Bmatrix} + \begin{Bmatrix} SI \\ DI \end{Bmatrix} + \begin{Bmatrix} 8位 \& 16位 \\位移量 \end{Bmatrix}

指令中指定一個基址寄存器和一個變址寄存器,還給出一個 8位 或 16位 的位移量,將三者相加就得到操作數的偏移地址;

使用這種尋址方式可以很方便地訪問二維數組;
與寄存器間接尋址方式類似,基址 - 變址 - 相對尋址 指令也可以表示成多種形式;
同樣地,基址 - 變址 - 相對尋址 也不允許在指令中同時出現兩個基址寄存器或兩個變址寄存器;


@8 隱含尋址

有些指令的操作碼中不僅包含了操作的性質,還隱含了部分操作數的地址;這種將一個操作數隱含在指令碼中的尋址方式就是隱含尋址;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章