好多人問我如何轉換機器碼,今天我來寫心得了......(請大蝦指點改進的地方) (6千字)

看雪資料發表於2015-11-15

作者: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日

相關文章