體會Java虛擬機和Dalvik虛擬機的架構(gòu)不同之處

本文繼續(xù)跟隨書上所學進行實踐妨猩。
Jvm是基于棧架構(gòu)潜叛、Dalvik是基于寄存器架構(gòu)。
還是寫一段簡單的代碼計算(a + b) * (a - b)來理解下⊥担看看二者的不同的之處销斟。

public class Hello{
    public int foo(int a, int b){
        return (a + b) * (a - b);
    }

    public static void main(String[] argc){
        Hello hello = new Hello();
        System.out.println(hello.foo(5, 3));
    }
}
JVM

先來看Jvm:javac先編譯一下,生成java字節(jié)碼椒舵。然后用javap -c對代碼進行反匯編

$ javap -c /Users/johnhao/Downloads/Train/Hello.class
Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int foo(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: iload_1
       4: iload_2
       5: isub
       6: imul
       7: ireturn

可以看到foo函數(shù)一共占用了8個字節(jié)蚂踊,索引值從0開始,一直到7逮栅。iload_1其實是兩部分悴势,表示指令q前綴,表示操作類型是整數(shù)int型措伐;load表示將局部變量壓入棧中特纤。
過程也很清晰,iload_1先將參數(shù)1壓入棧侥加,iload_2再將參數(shù)2壓入棧捧存,iadd從棧頂彈出兩個int類型值,將值相加担败,然后把結(jié)果壓回棧頂昔穴。下面的第四條和第五條同樣分別將參數(shù)1和參數(shù)2分別壓入棧頂,isub從棧頂彈出兩個int類型值提前,將值相減吗货,然后把結(jié)果壓回棧頂。到這里棧頂就有兩個計算好的結(jié)果的int類型值了狈网,分別是(參數(shù)1 + 參數(shù)2)的結(jié)果和(參數(shù)1 - 參數(shù)2)的結(jié)果宙搬。第七條指令imul,從棧頂彈出兩個int類型值拓哺,將值相乘勇垛,然后把結(jié)果壓回棧頂。最后一條ireturn返回一個int類型值士鸥,到此foo函數(shù)就執(zhí)行完了闲孤。

Dalvik

先用dx命令生成Dalvik字節(jié)碼。因為我用的java8編譯的烤礁,所以需要更高版本的buildtools才能編譯成功讼积。

$ sh /Users/johnhao/Documents/android-sdk-macosx/build-tools/26.0.0/dx --dex --output=Hello.dex Hello.class

接下來使用dexdump -d來反編譯代碼

$ /Users/johnhao/Documents/android-sdk-macosx/build-tools/26.0.0/dexdump -d /Users/johnhao/Downloads/Train/Hello.dex
Processing '/Users/johnhao/Downloads/Train/Hello.dex'...
Opened '/Users/johnhao/Downloads/Train/Hello.dex', DEX version '035'
。鸽凶。币砂。省略一些其他的。玻侥。。
  Virtual methods   -
    #0              : (in LHello;)
      name          : 'foo'
      type          : '(II)I'
      access        : 0x0001 (PUBLIC)
      code          -
      registers     : 5
      ins           : 3
      outs          : 0
      insns size    : 6 16-bit code units
000198:                                        |[000198] Hello.foo:(II)I
0001a8: 9000 0304                              |0000: add-int v0, v3, v4
0001ac: 9101 0304                              |0002: sub-int v1, v3, v4
0001b0: b210                                   |0004: mul-int/2addr v0, v1
0001b2: 0f00                                   |0005: return v0

相對于Jvm亿蒸,Dalvik的字節(jié)碼要簡潔一些凑兰,只有4條就完成了以上操作掌桩。第一條add-int,將v3和v4寄存器的值相加姑食,然后保存結(jié)果到v0寄存器波岛。這里的v3和v4就是foo函數(shù)的第一個和第二個參數(shù)。第二條sub-int音半,將v3和v4寄存器的值相減则拷,然后把結(jié)果保存到v1寄存器中。第三條指令mul-int/2addr曹鸠,將v0和v1寄存器的值相乘煌茬,然后把結(jié)果存到v0寄存器。第四條指令返回v0寄存器的值彻桃。

詳細的v0坛善、v1這些參數(shù)的介紹:
了解Dalvik寄存器的v和p命名方式

借由這個簡單代碼,可以淺顯體會出基于棧和基于寄存器的不同之處邻眷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眠屎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肆饶,更是在濱河造成了極大的恐慌改衩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驯镊,死亡現(xiàn)場離奇詭異葫督,居然都是意外死亡,警方通過查閱死者的電腦和手機阿宅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門候衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洒放,你說我怎么就攤上這事蛉鹿。” “怎么了往湿?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵妖异,是天一觀的道長。 經(jīng)常有香客問我领追,道長他膳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任绒窑,我火速辦了婚禮棕孙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蟀俊,他們只是感情好钦铺,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肢预,像睡著了一般矛洞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烫映,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天沼本,我揣著相機與錄音,去河邊找鬼锭沟。 笑死抽兆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的冈钦。 我是一名探鬼主播郊丛,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞧筛!你這毒婦竟也來了厉熟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤较幌,失蹤者是張志新(化名)和其女友劉穎揍瑟,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍炉,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡绢片,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岛琼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底循。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖槐瑞,靈堂內(nèi)的尸體忽然破棺而出熙涤,到底是詐尸還是另有隱情,我是刑警寧澤困檩,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悼沿,受9級特大地震影響等舔,放射性物質(zhì)發(fā)生泄漏糟趾。R本人自食惡果不足惜慌植,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涤浇。 院中可真熱鬧鳖藕,春花似錦魔慷、人聲如沸只锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邀摆。三九已至纵顾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栋盹,已是汗流浹背施逾。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留例获,地道東北人汉额。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓榨汤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親收壕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容