2013-03-20 469 views
1

SPARC彙編有一個cmp指令,它比較兩個數字(如果我理解正確,使用減法)。它也有subcc,addcc,andcc等。執行計算後使用cmp與設置條件代碼比較兩個數字有什麼區別?我無法理解這個概念。cmp和subcc /其他彙編

回答

2

執行計算後,使用cmp比較兩個數字並設置條件代碼有什麼區別?

通常(例如,在x86或68000個型處理器)cmp僅設置狀態標誌,而無需修改的操作數或任何存儲結果。

sub等也正在改變目標操作數(他們需要存儲結果的地方),這是做比較操作時不必要的。

本質上,cmp是一個sub操作,其結果被簡單地丟棄(可能保存指令週期)。在進行比較時,您不需要結果,只需要知道結果是否爲零,以及是否爲負值。

在SPARC,特別cmp是「合成指令」的更好的可讀性,其最終由彙編器轉換成subcc指令。請參閱http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/sparc.html上的「合成說明」。因此,cmp %reg1,%reg2由彙編器轉換爲subcc %reg1,%reg2,%g0。這減去了兩個寄存器,並且通過將結果存儲在寄存器%g0中來有效地丟棄結果。 %g0是一個在讀取時總是返回0的寄存器,寫入時不會改變。因此,在指令級別上,cmpsubcc(換句話說,SPARC沒有單獨的cmp指令,但使用subcc和特殊目標寄存器進行比較)之間沒有任何差異。

+0

我希望cmp是subcc與g0作爲目標寄存器,所以結果不會覆蓋任何值只註冊硬連線的零寄存器。我懷疑它可以節省任何週期,除非實施很不尋常。 – cb88 2013-03-21 12:39:08

+0

這不是我在SPARC('cmp'轉換爲'subcc')的情況下基本上所說的嗎? – 2013-03-21 13:01:21

+0

是的,但你只有什麼發生,而不是如何發生。雖然鏈接的文字確實覆蓋了它,但需要一段時間才能達到該部分。理解g0的使用是有幫助的,以及如何構建綜合指令。當你考慮如何實現cmp時,它可能不會保存指令週期,而是通過簡化指令集使它們更快。 – cb88 2013-03-21 14:13:39