記得前面提到過這個問題,幾句話就給帶過了。為什麼還要囉裡囉嗦的再說一下呢?
呵呵,是這樣的,我在看一本彙編的資料時,懷疑上面的乙個語句弄錯了。想知道是不是他的彙編指令**裡包含「印刷錯誤」。我想如果是印刷錯誤的話,很可能他的二進位制**跟看得懂的指令碼對不上。那麼我如何自己將那個二進位制**轉換成彙編指令碼呢?
語句如下:00401046 51 push ecx ; make room for
local
問題:請問如何知道51就是push ecx呢?
學友研究起細節來有時跟神經病一樣,明知道這玩意兒是反彙編器的活,唉。如果水平高的話,這應該根本就不是乙個值得寫在blog上的問題。:)
通過搜尋,知道了乙個叫做opcode的概念。一查push的opcode就是50。那麼1就代表ecx囉?最後通過查intel architecture software developer』s manual volume 2: instruction set reference,確認了這點。
摘抄一些資訊在這裡,算是給個路標,給其他學習彙編的朋友乙個方便。
以下內容摘抄並翻譯自《intel architecture software developer』s manual volume 2: instruction set reference》查表後發現push的opcode是50, ecx的modr/m的值是1.所有的intel架構的指令編碼都是下表列出的格式的子集。指令由以下元素組成:任意順序排列的字首,乙個或兩個位元組的opcode,定址方式指示部分(包括乙個由modr/m(register/memory mode)位元組,有時還包括乙個sib(scale-index-base)位元組),乙個偏移量(可選),和乙個立即數部分(可選)。
包括鎖字首和重複字首:
— f0h—lock prefix.
— f2h—repne/repnz prefix (used only with string instructions).
段覆蓋字首:
— 2eh—cs segment override prefix.
— 36h—ss segment override prefix.
• operand-size override, 66h
• address-size override, 67h
2.3 opcode
2.4 modr/m和sib位元組
多數涉及記憶體中的運算元的指令中都有乙個緊隨在opcode之後的位元組,它被用來指定定址方式。modr/m包括三部分資訊:
模式部分:有32種可能的值-8個暫存器加24種定址模式
reg/opcode部分:要麼指定乙個暫存器的值,要麼指定opcode中額外的三個bit的資訊。
r/m部分可以指定乙個暫存器作為運算元,或者和mod部分合起來表示乙個定址模式。
sib位元組包括三個部分:
scale部分-指定scale因子。
index部分-指定索引暫存器的號碼
base部分-指定記暫存器的號碼
等等。。。。。
彙編(三)組合語言的指令格式
本篇介紹匯程式設計序功能 偽操作及組合語言的指令格式。一 匯程式設計序的主要功能 1.檢查源程式 2.檢測源程式中的語法錯誤,並給出錯誤資訊 3.產生源程式的目標程式,並給出列表檔案 lst檔案,同時給出組合語言和機器語言的檔案 4.展開巨集檔案 二 偽操作 硬指令 使cpu產生動作 並在程式執行時...
組合語言 彙編指令
功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...
組合語言 傳送指令
一.傳送指令 1.通用傳送指令mov mov dst,src 將src傳送到dst中 dstsrc操作位數 mem reg imm8 16 mem reg seg reg8 16 reg seg mem 8 16 mem reg seg 8 16 imm是立即數,reg是暫存器,seg是段暫存器,m...