dalvik指令格式
一段dalvik彙編**由一系列dalvik指令組成,指令語法由指令的位描述與指令格式 標識來決定。位描述約定如下:
每16位的字採用空格分隔開來
每個字母表示四位,每個字母按順序從高位元組開始,排列到低位元組。每四位之間可 能使用豎線「丨」來表示不同的內容
順序採用a〜z的單個大寫字母作為乙個4位的操作碼,op表示乙個8位的操作碼
¢來表示這欄位所有位為0值
以指令格式「a|g|op bbbb f|e|d|c」為例:
指令中間有兩個空格,每個分開的部分大小為16位,所以這條指令由三個16位的字組 成。第乙個16位是「a|g|op」,高8位由a與g組成,低位元組由操作碼op組成。第二個16 位由bbbb組成,它表示乙個16位的偏移值。第三個16位分別由f、e、d、c共四個4 位元組組成,在這裡它們表示暫存器引數
單獨使用位標識還無法確定一條指令,必須通過指令格式標識來指定指令的格式編碼。 它的約定如下:
指令格式標識大多由三個字元組成,前兩個是數字,最後乙個是字母
第乙個數字是表示指令有多少個16位的字組成
第二個數字是表示指令最多使用暫存器的個數。特殊標記「r」標識使用一定範圍內的暫存器
第三個字母為型別碼,表示指令用到的額外資料的型別
例子:22x
第乙個數字2表示指令有兩個16位字組成,第二個數字2表示指令使用到2個暫存器, 第三個字母x表示沒有使用到額外的資料
dalvik指令對語法約定
每條指令從操作碼開始,後面緊跟引數,引數個數不定,每個引數之間採用逗號分開
每條指令的引數從指令第一部分開始,op位於低8位,高8位可以是乙個8位的 引數,也可以是兩個4位的引數,還可以為空,如果指令超過16位,則後面部分 依次作為引數
如果引數採用「vx」的方式表示,表明它是乙個暫存器,如v0、v1等。這裡採用v而不用r是為了避免與基於該虛擬機器架構本身的暫存器命名產生衝突,如arm 架構暫存器命名採用i開頭
如果引數採用「#+x」的方式表示,表明它是乙個常量數字
如果引數採用「+x」的方式表示,表明它是乙個相對指令的位址偏移
如果引數採用「kind@x」的方式表示,表明它是乙個常量池索引值。其中kind表 示常量池型別,它可以是「string」(字串常量池索引)、「type」(型別常量池索引)、「field」(字段常量池索引)或者「meth」(方法常量池索引)
例子:op vaa, string@bbbb
指令用到了 1個暫存器引數vaa,並且還附加了乙個字串常量池索引string@bbbb
android 原始碼 dalvik/docs 目錄下提供了乙份文件 insmction-formats.html,裡面詳細列舉了dalvik指令的所有格式
在android dex檔案格式(二)中有詳細的指令格式解析, 通過解析hello.dex的指令格式還原出smali**
intel 指令格式
總結下一下免得白白被 intel manual 降低了視力。下面說的是32位的intel cpu。intel指令的格式就是intel機器碼的格式,跟彙編的語法格式不是一回事。每條intel指令由六部分組成,如圖 英語不好,就不直接翻譯。1.指令字首 2.操作碼 3.mor r m 4.sib 5.d...
ARM指令格式
一 arm指令基本格式 1.指令的基本格式及說明 其中 號內的項是必須的,號內的項是可選的。各項說明如下 opcode 指令助記符 cond 執行條件 s 是否影響cpsr暫存器的值 rd 目標暫存器 rn 第乙個運算元的暫存器 operand2 第二個運算元 條件碼 cond 的使用可以實現高效的...
RISC V 指令格式
risc v 指令集架構 isa 作為新一代開源指令集架構,是乙個最新的 簡約的 清晰的 開源的指令集架構。risc v 指令集架構的目標是讓它在最小的到最快的所有計算機裝置上都能夠有效工作。risc v 指令集架構強調簡潔性來保證它的低成本,同時有著大量的暫存器和透明的指令執行速度,從而幫助編譯器...