計算機是通過執行指令來處理各種數據的,因此,一條指令即要指出如何處理數據,同時還應指出數據的來源、操作結果的去向。一般來說指令是由兩部分組成,即操作碼和操作數。
操作碼給出該指令應完成何種操作。
操作數用來描述該指令的操作對象。
在指令中操作碼是不可缺少的,但操作數可以沒有,也可以有一個操作數或兩個操作數。
操作碼錶示計算機執行什麼操作,由一組二進位代碼表示,在彙編語言中用助記符代表。
操作數可能指明了參與操作的數的本身,或規定了操作數的地址。如何尋找操作數,這就是指令的尋址方式,也是由指令編碼格式指出。
根據操作數的個數,指令格式可分為以下幾種:
I 無操作數
控制類指令,比如「HLT」暫停指令。
II 單操作數
只給出一個操作數地址。該操作數可在寄存器或存儲器中,或指令中直接給出立即數。比如「INC CX」
III 雙操作數指令
指令中有兩個操作數,其中一個為目的操作數,另一個為源操作數。一個操作數在寄存器中,另一個在寄存器或存儲器中,或指令中直接給出立即數。不允許兩個都在存儲器中。
IV 三操作數指令
ADC AX, BX ;該指令完成操作數AX、BX和CF位相加。
由此可見,操作數可分為源操作數和目的操作數。
源操作數:只能讀取的操作數。
目的操作數:即可讀取又可寫入(存放操作結果)的操作數。
操作數還可分為數據操作數和地址操作數。
指令的長度主要取決於指令操作碼的長度、操作數的長度和操作數的個數。通常指令字長位數越多,所能表示的操作信息也就越多,指令功能就越豐富。但位數多則指令所占的存儲空間就多,讀取指令的時間就增加。
字長(一般是指CPU的機器字長)是指CUP—次能夠處理的二進位數位數,它都是字節長度(8位二進位數)的1、2、4或8倍,也就是8、16、32或64位。因此,指令字長也是字節的簡單倍數,如一字節指令,二字節指令、三字節指令......。
一條指令中的信息按其含義分成若干個信息段,每一信息段占一個字節或多個字節,且按一定的順序排列,這便於CPU解釋執行。如8086/8088CPU的指令系統,它釆用1-6個指令字節的變字長,它包括:
第1字節:操作碼;
第2字節:尋址方式;
第3-6字節:操作數;
三部分組成。
指令格式如下:
其中,第一個字節:
高6位是操作碼。
W位說明傳遞數據的類型是字(W=1)還是字節(W=0)(Word);
D位標明數據傳送的方向:D=0,數據從寄存器傳出; D=1,數據傳至寄存器;(Destination)。
其中,第二個字節:
REG欄位:寄存器號,用3位編碼尋址8種不同的寄存器,再根據第一字節中W位,選擇8位或16位寄存器。如下圖所示。(對使用段寄存器的指令,REG欄位占2位)
8086指令的二進位編碼非常多,很難以一張表實現指令與機器語言的對照。
為每種基本指令類型給出一個編碼格式,對照格式填上不同的數字表示不同的尋址方式、數據類型,即可求得每條指令的機器碼。
8086指令系統採用變長指令,指令的長度可由1~6字節組成。
機器指令的長度:變長,由操作碼+尋址方式+操作數所需字節數來決定;
彙編指令的長度:彙編指令對應的機器指令的長度。
指令執行的過程就要考慮到指令長度:
① CPU從CS:IP所組成的地址中讀取指令,將這個指令存放到指令緩存器中;
② IP = IP + 所讀指令的字節數;
③ 執行指令緩存器中的內容,回到步驟1,重複這個過程。
1 寄存器間傳送指令的編碼
MOV SP,BX
該指令的功能是將BX寄存器的內容送到SP寄存器中。
MOV指令從10001000(ox88)開始編碼。
該指令的編碼格式為:100010DW MOD REG R/M.
W=1:表示傳送的是字數據;
REG欄位:選擇SP,則REG欄位編碼=100;
D位=1:表示數據傳至所選的寄存器(SP);
MOD=11:因另一個操作數BX也是寄存器。
根據W=1及寄存器名稱為BX,從上圖查得R/M=011。
所以,該指令的2字節編碼為8B E3H。
2 寄存器與存儲器間傳送指令的編碼
MOV CL, [BX+l234H]
該指令的功能是將有效地址為(BX+1234H)存儲單元中的數據字節傳送到CL中。
指令的編碼格式為:100010DW MOD REG R/M 數據.
第1、2字節可通過查表得到;第3字節存放16位位移量的低字節34H; 第4字節存放高字節12H 。
所以該指令的4字節編碼為8A 8F 34 12H 。
3 立即數尋址指令的編碼
MOV [BX+2100H], 0FA50H
指令的功能是將16位立即數送到指定有效地址的字存儲單元中;其中低字節50H送列[BX+2100H]單元,高字節FAH送到(BX+2101H)單元。
該指令的編碼格式為:110011W MOD 000 R/M 數據 數據(若W=1).
指令中不但有16位立即數,還有16位位移量;
所以,該指令的6字節編碼為C7 87 00 21 50 FA H。
4 包含段寄存器的指令的編碼
MOV DS, AX
指令的功能是將AX寄存器的內容傳送到數據段寄存器DS。
該指令的編碼格式為:10001110 MOD 0 REG R/M .
段寄存器DS的編碼為11,即REG欄位為11;另一個操作數也是寄存器,所以MOD=11,而R/M欄位應填上AX的三位代碼000 .
所以,該指令的2字節編碼為8E D8H。
5 段超越前綴指令的編碼
MOV [BX], DL
指令的功能是將DL寄存器的內容傳送到有效地址為(BX)的字節存儲單元。
該指令(不帶段超越前綴)的編碼格式為:100010DW MOD 0 REG R/M .
數據從寄存器傳出,則D=0;傳遞數據為字節,則W=0;進而,REG=010;另一個操作數是存儲器,所以MOD=00,而R/M=111 .該指令的編碼是在不帶段超越前綴的指令代碼為88 17H.
在指令代碼前加一個8位的段超越的綴代碼,代碼的格式為001××110,其中××位表明段超越寄存器。由於段寄存器CS的代碼為01,所以指令的第1個字節的編碼為00101110,即 2EH.
所以,該指令的機器碼為2E 88 17H。
6 重點彙編指令
7 主要尋址方式
8 機器碼彙編指令與ASCII
再來一段機器碼、彙編代碼、C語言代碼對照:
-End-