計算機通過執(zhí)行命令來處理各種數(shù)據(jù),所以在指示如何處理數(shù)據(jù)的同時,還必須指出數(shù)據(jù)的來源、操作結果的去向。(大衛(wèi)亞設)。
一般來說指令是由兩部分組成,即操作碼和操作數(shù)。操作碼給出該指令應完成何種操作。
操作數(shù)用來描述該指令的操作對象。
在指令中操作碼是不可缺少的,但操作數(shù)可以沒有,也可以有一個操作數(shù)或兩個操作數(shù)。
操作碼表示計算機執(zhí)行什么操作,由一組二進制代碼表示,在匯編語言中用助記符代表。
操作數(shù)可能指明了參與操作的數(shù)的本身,或規(guī)定了操作數(shù)的地址。如何尋找操作數(shù),這就是指令的尋址方式,也是由指令編碼格式指出。
根據(jù)操作數(shù)的個數(shù),指令格式可分為以下幾種:
I 無操作數(shù)
控制類指令,比如“HLT”暫停指令。
II 單操作數(shù)
只給出一個操作數(shù)地址。該操作數(shù)可在寄存器或存儲器中,或指令中直接給出立即數(shù)。比如“INC CX”
III 雙操作數(shù)指令
指令中有兩個操作數(shù),其中一個為目的操作數(shù),另一個為源操作數(shù)。一個操作數(shù)在寄存器中,另一個在寄存器或存儲器中,或指令中直接給出立即數(shù)。不允許兩個都在存儲器中。
IV 三操作數(shù)指令
ADC AX, BX ;該指令完成操作數(shù)AX、BX和CF位相加。
由此可見,操作數(shù)可分為源操作數(shù)和目的操作數(shù)。
源操作數(shù):只能讀取的操作數(shù)。
目的操作數(shù):即可讀取又可寫入(存放操作結果)的操作數(shù)。
操作數(shù)還可分為數(shù)據(jù)操作數(shù)和地址操作數(shù)。
指令的長度主要取決于指令操作碼的長度、操作數(shù)的長度和操作數(shù)的個數(shù)。通常指令字長位數(shù)越多,所能表示的操作信息也就越多,指令功能就越豐富。但位數(shù)多則指令所占的存儲空間就多,讀取指令的時間就增加。
字長(一般是指CPU的機器字長)是指CUP—次能夠處理的二進制數(shù)位數(shù),它都是字節(jié)長度(8位二進制數(shù))的1、2、4或8倍,也就是8、16、32或64位。因此,指令字長也是字節(jié)的簡單倍數(shù),如一字節(jié)指令,二字節(jié)指令、三字節(jié)指令......。
一條指令中的信息按其含義分成若干個信息段,每一信息段占一個字節(jié)或多個字節(jié),且按一定的順序排列,這便于CPU解釋執(zhí)行。如8086/8088CPU的指令系統(tǒng),它釆用1-6個指令字節(jié)的變字長,它包括:
第1字節(jié):操作碼;
第2字節(jié):尋址方式;
第3-6字節(jié):操作數(shù);
三部分組成。
指令格式如下:
其中,第一個字節(jié):
高6位是操作碼。
W位說明傳遞數(shù)據(jù)的類型是字(W=1)還是字節(jié)(W=0)(Word);
D位標明數(shù)據(jù)傳送的方向:D=0,數(shù)據(jù)從寄存器傳出; D=1,數(shù)據(jù)傳至寄存器;(Destination)。
其中,第二個字節(jié):
REG字段:寄存器號,用3位編碼尋址8種不同的寄存器,再根據(jù)第一字節(jié)中W位,選擇8位或16位寄存器。如下圖所示。(對使用段寄存器的指令,REG字段占2位)
8086指令的二進制編碼非常多,很難以一張表實現(xiàn)指令與機器語言的對照。
為每種基本指令類型給出一個編碼格式,對照格式填上不同的數(shù)字表示不同的尋址方式、數(shù)據(jù)類型,即可求得每條指令的機器碼。
8086指令系統(tǒng)采用變長指令,指令的長度可由1~6字節(jié)組成。
機器指令的長度:變長,由操作碼+尋址方式+操作數(shù)所需字節(jié)數(shù)來決定;
匯編指令的長度:匯編指令對應的機器指令的長度。
指令執(zhí)行的過程就要考慮到指令長度:
① CPU從CS:IP所組成的地址中讀取指令,將這個指令存放到指令緩存器中;
② IP = IP + 所讀指令的字節(jié)數(shù);
③ 執(zhí)行指令緩存器中的內容,回到步驟1,重復這個過程。
1 寄存器間傳送指令的編碼
MOV SP,BX
該指令的功能是將BX寄存器的內容送到SP寄存器中。
MOV指令從10001000(ox88)開始編碼。
該指令的編碼格式為:100010DW MOD REG R/M.
W=1:表示傳送的是字數(shù)據(jù);
REG字段:選擇SP,則REG字段編碼=100;
D位=1:表示數(shù)據(jù)傳至所選的寄存器(SP);
MOD=11:因另一個操作數(shù)BX也是寄存器。
根據(jù)W=1及寄存器名稱為BX,從上圖查得R/M=011。
所以,該指令的2字節(jié)編碼為8B E3H。
2 寄存器與存儲器間傳送指令的編碼
MOV CL, [BX+l234H]
該指令的功能是將有效地址為(BX+1234H)存儲單元中的數(shù)據(jù)字節(jié)傳送到CL中。
指令的編碼格式為:100010DW MOD REG R/M 數(shù)據(jù).
第1、2字節(jié)可通過查表得到;第3字節(jié)存放16位位移量的低字節(jié)34H; 第4字節(jié)存放高字節(jié)12H 。
所以該指令的4字節(jié)編碼為8A 8F 34 12H 。
3 立即數(shù)尋址指令的編碼
MOV [BX+2100H], 0FA50H
指令的功能是將16位立即數(shù)送到指定有效地址的字存儲單元中;其中低字節(jié)50H送列[BX+2100H]單元,高字節(jié)FAH送到(BX+2101H)單元。
該指令的編碼格式為:110011W MOD 000 R/M 數(shù)據(jù) 數(shù)據(jù)(若W=1).
指令中不但有16位立即數(shù),還有16位位移量;
所以,該指令的6字節(jié)編碼為C7 87 00 21 50 FA H。
4 包含段寄存器的指令的編碼
MOV DS, AX
指令的功能是將AX寄存器的內容傳送到數(shù)據(jù)段寄存器DS。
該指令的編碼格式為:10001110 MOD 0 REG R/M .
段寄存器DS的編碼為11,即REG字段為11;另一個操作數(shù)也是寄存器,所以MOD=11,而R/M字段應填上AX的三位代碼000 .
所以,該指令的2字節(jié)編碼為8E D8H。
5 段超越前綴指令的編碼
MOV [BX], DL
指令的功能是將DL寄存器的內容傳送到有效地址為(BX)的字節(jié)存儲單元。
該指令(不帶段超越前綴)的編碼格式為:100010DW MOD 0 REG R/M .
數(shù)據(jù)從寄存器傳出,則D=0;傳遞數(shù)據(jù)為字節(jié),則W=0;進而,REG=010;另一個操作數(shù)是存儲器,所以MOD=00,而R/M=111 .該指令的編碼是在不帶段超越前綴的指令代碼為88 17H.
在指令代碼前加一個8位的段超越的綴代碼,代碼的格式為001××110,其中××位表明段超越寄存器。由于段寄存器CS的代碼為01,所以指令的第1個字節(jié)的編碼為00101110,即 2EH.
所以,該指令的機器碼為2E 88 17H。
6 重點匯編指令
7 主要尋址方式
8 機器碼匯編指令與ASCII
再來一段機器碼、匯編代碼、C語言代碼對照:
-End-
1.《關于100010我想說計算機系統(tǒng)指令的機器碼表示方法及8086的尋址方式和指令系統(tǒng)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《關于100010我想說計算機系統(tǒng)指令的機器碼表示方法及8086的尋址方式和指令系統(tǒng)》僅供讀者參考,本網(wǎng)站未對該內容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉載時請保留本站內容來源地址,http://f99ss.com/gl/2086791.html