好多人問我如何轉換機器碼,今天我來寫心得了......(請大蝦指點改進的地方) (6千字)
作者: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日
相關文章
- 我期待 Vue 改進的一些地方2017-05-05Vue
- 請教資料庫併發訪問的問題!望各位大蝦指點!2006-04-24資料庫
- blowfish大蝦,請問能否解決掉此pcode的NAG? (5千字)2001-04-26
- 蘋果在40年前的今天如何改變了我們的世界2015-06-30蘋果
- 我眼中的指標 (轉)2007-12-15指標
- 當我寫程式碼時 我寫的是2012-09-09
- 我的破解心得(6) (3千字)2001-03-13
- 不錯的軟體,我來寫過程。:) (2千字)2001-05-13
- 請教大蝦:有關JComboBox控制元件的焦點問題?2004-08-19控制元件
- 我們來動手編寫計算機模擬器2012-12-28計算機
- 我的第3篇破文 cr--CJSFormater 高手請指導、指導!! (4千字)2001-11-24JSORM
- 我如何轉行為程式設計師:心態支撐著我2019-02-22程式設計師
- 我是初學者,請老師指點我該怎麼學JAVA,謝謝啦2007-12-05Java
- 這是一篇老文章今天拿來翻譯一下,我的水平很差~請指正!for新手
(4千字)2015-11-15
- 請問誰有用tcp ip寫的點到點的檔案傳輸的程式碼。能給我一份嗎2003-05-09TCP
- 今天我們來聊一聊Java中的Semaphore2024-04-13Java
- 我是如何從 php 轉型寫 go 的2021-02-06PHPGo
- 請教各位大蝦:在JBoss下使用JMS通訊機制遇到的問題2006-12-30
- 關於在linux中顯示漢字的問題請教大蝦(轉)2007-08-11Linux
- 今天好多人 phpstrom 編譯器註冊碼失效了,最新可用註冊碼2019-12-24PHP編譯
- 改進我們的 Laravel Nova CRM(三)2019-02-02Laravel
- 誰動了我的指標? (轉)2007-08-14指標
- 誰來關心我們這些程式設計師 (轉)2007-12-13程式設計師
- 今天,我們來探一探WebSocket原理2020-02-10Web
- 我要去做程式設計師,我吃得了苦2019-04-03程式設計師
- 我寫的jQuery程式碼2012-08-27jQuery
- 閉眼寫程式碼給我帶來的啟示2015-02-09
- 註釋,今晚我不關心程式碼,我只想你2021-03-02
- 我是如何將業務程式碼寫優雅的2019-04-30
- 問一個jdbc和oracle字符集問題?請大蝦救命2002-11-17JDBCOracle
- asp.net 寫一個RMB金額大寫轉換器(原始碼)2011-11-08ASP.NET原始碼
- 我寫了一個TypeScript虛擬機器。2020-09-01TypeScript虛擬機
- 課時4:改進我們的小遊戲2018-07-24遊戲
- 我今天要去面試了2014-03-25面試
- 我初學,請教幾個驅動的問題。(轉)2007-08-12
- 天天聊爬蟲,今天我們來聊聊反爬2018-12-19爬蟲
- 我來寫UltraEdit 9.00 簡繁雙語第二版的破解過程,誰來寫序號產生器 (3千字)2002-01-26
- 這樣的CMS如何製作!大蝦們給點思路!2008-09-19