作者:HSLY 網站:http://www.x86asm.com E-MAIL: pliceman_110@163.com
HI,歡迎進入Assembly Language into Mechine Code 教程。
首先你得從80x86彙編小站下載
下載地址:http://www.x86asm.com/Soft_Show.asp?SoftID=8
機器語言我們只要重點理解一下幾個概念:
1. 機器語言指令有操作碼(OP)和地址碼兩部分組成
|_____________OP_______________|__d__|__w__|
|_____________OP_______________|__s__|__w__| <--此格式用於立即定址方式
在多數操作碼中,常使用某些位來指示某些資訊:
如圖上結構裡的: w=1 時 對字來操作
w=0 時 對位元組來操作
d值在雙運算元指令中才有效
當 d=1 時 有且只有一個暫存器用於目的運算元
d=0 時 有且只有一個暫存器用於源運算元
s=1 時 立即數為8位,但要求擴充套件成16位數
s=0 時 當指令作位元組操作/有16位立即數
由於彙編的指令格式很多,這裡我只作一些基本情況介紹,必要時讀者可以下載/查閱80x86彙編小站http://www.x86asm.com提供的OPCODES手冊來查閱。
2. 定址方式的機器語言表示:
| mod | reg | r/m |
|_____|_____|_____|_____|_____|_____|_____|
reg 表示暫存器方式,在不包括立即數的雙運算元指令的情況下,規定必須有一個運算元在暫存器中,該暫存器由reg欄位指定,並與操作碼位元組中的w位相組合確定的暫存器
mod欄位與r/m(register/memory)欄位結合在一起確定另一個運算元的定址方式現在你們下載了80x86彙編小站(http://www.x86asm.com)提供的OPCODES 手冊了嗎?
下載好了,請解壓後開啟裡面的:opcodes.html 檔案,然後熟悉裡面的表格:
現在熟悉簡單的:
______________________________________________________________________________
表1 rrr : W=0 : W=1 : reg32
000 : AL : AX : EAX
001 : CL : CX : ECX
010 : DL : DX : EDX
011 : BL : BX : EBX
100 : AH : SP : ESP
101 : CH : BP : EBP
110 : DH : SI : ESI
111 : BH : DI : EDI
______________________________________________________________________________
表2 rrr : Index Register
000 : EAX
001 : ECX
010 : EDX
011 : EBX
100 : No Index
101 : EBP
110 : ESI
111 : EDI
______________________________________________________________________________
表3 mmm : Function 11
w=1
000 : DS:[BX+SI]
001 : DS:[BX+DI]
010 : SS:[BP+SI]
011 : SS:[BP+DI] BX
100 : DS:[SI]
101 : DS:[DI]
110 : SS:[BP]
111 : DS:[BX]
______________________________________________________________________________
表4
oo : Function
00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used
01 : An 8-bit signed displacement follows the opcode
10 : A 16-bit signed displacement follows the opcode
11 : mmm specifies a register, instead of an addressing mode
______________________________________________________________________________
上面的表,你都看明白了嗎? 現在我就教你們如何利用這樣的表格來把彙編指令翻譯機器碼
3.指令格式簡介
8086所用的16位指令格式:
________ _____________ ________ ________
|操作碼| + |mod-reg-r/m| + |位移量| + |立即數|
1~2位元組 0~1位元組 0~2位元組 0~2位元組
OK!以上就是基本知識,下面我們來實踐吧:
―――――――――――――――――――――――――――――――――――――――
問題:
MOV AX,1234H 對應的機器碼為:B83412
MOV EBX,0 對應的機器碼為:66BB00000000
MOV CL,55H 對應的機器碼為: B155
MOV AX,BX 對應的機器碼為:8BC3
我在問一下,機器碼的資料格式是什麼? 好像是 機器指令+運算元(高位存放在地址高位,低位存放在地址低位),但是前面MOV AX,怎麼就變成了B8,弄不明白,請指教。
PS: 上面的題目是一個網友問的,現在我來實踐一遍給你們看。
―――――――――――――――――――――――――――――――――――――――
指令1 -> MOV AX,1234H 對應的機器碼為:B83412
解法: 判斷-> 這個是8086彙編16位彙編指令格式,並且是立即定址方式
查表-> 開啟opcodes.html檔案,找到標題為“Main Instructions”,單擊“M”字母,然後對應檢視 “MOV Reg,Imm”格式的“OpCode”項為:1011wrrr
再判斷-> 由於暫存器是AX, 立即數是1234H,明顯是“對字操作”,所以w=1
在檢視本文章上面的“表1”,對應的查到rrr的值為000
組合結果-> w=1
rrr=000
1011wrrr=1011 1000B ->B8H
根據“ 3.指令格式簡介” -> B8H + |立即數(低位在前高位在後)|= B83412H
PS: "+" 符號不為“加號”
好了,已經解完第一題了,機器碼為 B83412H
―――――――――――――――――――――――――――――――――――――――
指令4 -> MOV AX,BX 對應的機器碼為:8BC3
解法: 判斷-> 這個是8086彙編16位彙編指令格式,並且是暫存器定址方式
查表-> 開啟opcodes.html檔案,找到標題為“Main Instructions”,單擊“M
”字母,然後對應檢視 “MOV Reg,Reg”格式的“OpCode”項為:1000101woorrrmmm
再判斷-> 由於暫存器是AX, BX 明顯是“對字操作”,所以w=1
在檢視本文章上面的“表4”,對應查到oo=11 因為是暫存器定址方式
在檢視本文章上面的“表1”,對應查到rrr的值為000 ,因為當兩個操
作數都是暫存器,那麼一般要以目的運算元為準
在檢視本文章上面的“表3”, 對應查到mmm的值為011 ,因為當兩個運算元都是暫存器,那麼一般要以源運算元為準
組合結果-> w=1
oo=11
rrr=000
mmm=011
1000101woorrrmmm=1000 1011 1100 0011B ->8BC3H
好了,已經解完第二題了,機器碼為8BC3H
―――――――――――――――――――――――――――――――――――――――
呵呵,不錯吧,很簡單吧,有了80X86 OPCODES 查詢表一切都是那麼簡單,如果還有什麼問題,大家都來這裡提問!
剩下的:
指令2 -> MOV EBX,0 對應的機器碼為:66BB00000000
指令3 -> MOV CL,55H 對應的機器碼為: B155
大家來練練手,注意指令2 需要用到32位指令格式,請查閱相關的80x86組合語言書籍的機器語言部分,應該有解釋的。
指令2的解法,請大家等待,或者大家研究一下,把解法貼出來,給大家參考哦!
----待續
2004 2月14日