機器語言我們只要重點理解一下幾個概念:
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 <PS:部分資料> 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 <PS:部分資料> rrr : Index Register
000 : EAX
001 : ECX
010 : EDX
011 : EBX
100 : No Index
101 : EBP
110 : ESI
111 : EDI
______________________________________________________________________________
表3 <PS:部分資料> 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 <PS:部分資料>
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的解法,請大家等待,或者大家研究一下,把解法貼出來,給大家參考哦!