8086的指令使用的是1-6byte(s)的變長指令。由3個部分組成:
舉幾個例子,下圖是1byte-6bytes不同長度指令的劃分:
先來翻譯一下上面的各個部分:d(destination)目的運算元,w(word)字,mod 模式/方式,reg(register)暫存器,r/m(register/memery)記憶體或暫存器
根據解釋可以看到,上面這種格式的指令,有源運算元和目的運算元,其中乙個是暫存器變數,另乙個是儲存器/暫存器變數。
抽象為:
option reg, reg
option reg, m
option m, reg
解釋各個部分所表示的內容:
第一位元組的中的d和w與第二位元組中的reg有很大的關係,d表示指令中的reg部分是否為目的運算元,d=1表示reg表示目標運算元;w表示運算元的型別(長度),w=1表示是乙個字資料。
第二位元組中的mod表示定址的方式,共有4中:
第二位元組中的reg表示乙個暫存器:
第二位元組中的m/reg表示乙個記憶體或暫存器,這個字段需要和mod結合起來看,如圖:
第一位元組的前6位我們不必糾結,先不管他,首先來看一下,指令中的暫存器是ah是,因為ah表示乙個位元組資料,所以w=0;通過查reg的表我們可以看到,表示ah的reg(在第二個位元組中)值為100;
因為ah是目的運算元,所以d=1。
第一位元組分析完畢,****** 10
另乙個運算元,使用儲存器定址,所以mod是00,01,10中的某乙個,它們三個的區別就是偏移量,根據指令我們可以看到,使用了8位的偏移量,所以mod=01,這次再進行查表,可以看到對應的r/m=001。
第二位元組分析完畢,01 100 001
因為有乙個8位偏移量,使用第三個位元組表示。
第三位元組,50h(注意,低位元組在前) 0101 0000
所以,我們可以推知,這條指令的機器碼為
***x xx10 0110 0001 0101 0000
在dosbox+masm的環境下編譯以下這條語句看一下
將8a6150h寫成2進製
1000 1010 0110 0001 0101 0000
可見,我們的分析是正確的
還按面的例子一樣分析,由dx以及它是乙個源運算元可以直到d=0,w=1
,通過查reg的表可以得到ax的reg的值為000。
第乙個位元組:******01
第二個位元組還有mod和r/m沒確定,這兩個值是根據目標運算元得到,目標運算元使用基址變址相對定址的方式,而且偏移量是乙個16位的,基址暫存器位bx,變址暫存器位di,通過查表可以得到r/m=001,mod=10
第二個位元組:10 000 001
第三個位元組:偏移量低8位 45h 0100 0101
第三個位元組:偏移量高8位 23h 0010 0011
所以,我們推知,這條指令的機器碼為
***x xx01 1000 0001 0100 0101 0010 0011
接下來再跟編譯結果作比較驗證一下:
將89914523h轉換成2進製
1000 1001 1001 0001 0100 0101 0010 0011
可見我們的推導是正確的。
上面舉的兩個例子並不能涵蓋所有編碼的推導方式,但是提供給大家乙個推導的思路。
8086指令速查
一 資料傳輸指令 它們在存貯器和暫存器 暫存器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓...
4 1 指令格式
返回目錄 計算機組成原理筆記目錄 2019 王道考研 4.1 指令格式 本章總覽 1.指令格式 如何用二進位制 表示指令 2.指令定址方式 給出要操作的物件的位址 3.cisc和risc 兩種設計方向 1.指令 又稱機器指令 是提示計算機執行某種操作的命令,是計算機執行的最小功能單位 一台計算機的所...
8086指令系統資料傳送指令
1.一般傳送指令mov 格式 mov 目標運算元 源運算元 功能 mov主要實現內容就是各種傳送 目標運算元可以為暫存器運算元 儲存器運算元 源運算元可以為立即數運算元 暫存器運算元 儲存器運算元 根據彙編規定指令的兩個運算元不能同時為儲存器運算元所以有共有5種傳送操作 1 立即數到暫存器 例 mo...