2011-08-06 85 views
3

我正在查看指令及其相應的操作碼。指令,如「乙腦」和「JZ」具有相同的操作碼:爲什麼多個指令具有相同的操作碼並且工作?

je,jz - 0x74 (8 bit) 
je,jz - 0x0f84 (16/32 bit). 

爲什麼我們有這樣多餘的指令?

這是因爲它使彙編代碼更容易嗎?也就是說,在某些情況下,更容易理解「如果相等,跳轉」,在其他情況下,更容易理解「跳轉零」。但是這些日子我們並沒有真正的組裝代碼,它有幫助嗎?

回答

1

雖然不是當今使用最廣泛的編程語言,但它仍被使用。 g ++可以編譯彙編代碼。如果你知道你在做什麼,那麼它給你一個確定的速度優勢。

關於你的問題,你是對的。根據不同的情況,有助於以某種方式思考導致具有相同操作碼的不同指令。

+0

爲什麼downvote?看起來像對我來說合法的答案。 –

+0

謝謝魯迪。我也可以看到不好的一面。 –

+1

我不是倒票選者,但我的猜測是倒票是因爲答案並沒有真正解決實際問題 - 這只是對OP末尾沒有人提問的最後部分的評論再寫一個asm?無論哪種方式,在沒有給出理由的情況下進行倒票都是糟糕的形式,但這一切都很常見。 –

5

它們只是同一條指令的不同同義詞。該指令只是基於Z標誌分支。如果比較相等指令的結果爲真,則Z標誌置位。它也被設置爲你測試一個恰好爲零的值。

7

從我們在學校裏所有的計算機體系結構書中得到的舊引用是什麼? 「x86沒有什麼問題,只是它很多都沒有意義。」

回答你的問題:可能是因爲「跳到零」和「如果相等跳」都跳轉到基於前一個指令結果的目標地址。也就是說,前一條指令的結果將零標誌(ZF)設置爲1. JZ可能用於「數學」,而JE可能用於「比較」。所以從程序員的角度來看,必須有兩個助記符纔有意義。也許早期的彙編作家試圖模仿另一種流行的彙編語言。我們可以看到,JZ和JE實質上意味着「如果相等(ZF = 1)時跳轉近似」。然後文檔實際上提到這對於某些跳轉指令集很常見。

由於狀態標誌的特定狀態有時可以用兩種方式解釋,所以爲一些操作碼定義了兩個助記符。 例如,JA(如果跳過上面的指令)和JNBE(跳轉,如果 不低於或等於)指令是操作碼 77H的備用助記符。

+0

所以從本質上講,它只從程序員的角度來看是有用的,否則它是一樣的。 –

2

即使現在使用不多,英特爾彙編語言也很舊。請記住,最初的8086個8088處理器是從1970年的...

曾幾何時,當我們在組裝仍然寫的東西像IBM PC/XT它使一個很大的意義,有一個像

幾個指令
CMP AX, BX 
JE Somewhere 

AND AX, BX 
JZ somewhere_else 

,他們正好映射到相同的硬件指令並不重要。

2

爲什麼一些英語人士說卡車和其他人說卡車?我們是否應該強迫每個人遵守一個標準?所有的漢堡都是大蘋果......

首先我們還是在組裝程序。足夠的人這樣做,別人不必。你的編譯器非常依賴它。如果沒有它,很難開發和調試編譯器和處理器。沒有編譯器和處理器,我們會做什麼?

讓彙編語言分析程序接受跳轉(如果等於vs跳轉,如果設置了零位)是微不足道的,它們是相同的函數,相同的指令。理解和使用這些標誌的人(授予z標誌很容易,但是有符號和無符號進位不是)喜歡使用標誌跳轉如果進位,跳轉,如果是零等等。根據這些具體數字的關係對於那個特定的操作,如果跳躍比平均跳躍大,則跳躍小於等等。如果平等,我寧願擺脫跳躍,如果跳躍小於等等,只是有標誌,跳轉如果c跳轉如果c清除,跳轉如果n == v跳轉如果n!= v等。

英特爾不是第一個或最後一個架構,你會看到這一點。我假設出於同樣的原因,一些人認爲狀態寄存器中的位是打開或關閉的,而其他人認爲這比這更大。只要處理器擁有z標誌,知道z標誌意味着平等就已經存在了,但它與x86系列的時代以及它的愚蠢指令集沒有任何關係。以這種方式讓開發人員友好,吸引開發人員加入你的處理器,在這些工具中實現是微不足道的。

如果你真的想得到解決這個問題的原因,那麼爲什麼在同一個指令集中有intel語法和AT語法?如果相等(零位設置),則跳躍超出跳躍;如果零位設置爲零,則跳躍如果零位設置指令,編碼跳轉至跳轉。

相關問題