程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 匯編指令與機器碼的相互轉換

匯編指令與機器碼的相互轉換

編輯:匯編語言

機器語言我們只要重點理解一下幾個概念:

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的解法,請大家等待,或者大家研究一下,把解法貼出來,給大家參考哦!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved