2017-06-21 47 views
0

從大會地區開始,很難找到一個體面的教程。 想找一本「Assembly for Dummies」的書。彙編:何時會測試%esi,%esi返回不等於?

我遇到以下問題,'test'命令總是使用相同的地址或註冊表運行。

0x08048e14 <+21>: test %esi,%esi 
0x08048e16 <+23>: jne 0x8048e4b <main+76> 

由於相同的註冊表或地址正在和AND何時不會返回這些是相同的?

+2

它不檢查「相同」,它不是'cmp'。它檢查按位「和」的結果是否爲零,反過來又意味着「esi」爲零或不是。 – Jester

+1

[測試點%eax%eax]的可能重複(https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax) –

回答

6
test reg, reg 

(其中reg是兩個操作數是相同的)是什麼,你會總是看到的,而不是:

cmp reg, 0 

在優化代碼。兩條指令都以相同的方式設置標誌,但前者需要更少的字節進行編碼,因此速度稍快。

因此,您的代碼只是測試以查看esi寄存器是否爲零。如果它不是零,則需要分支;如果它爲零,則執行不經過分支。


爲什麼這樣嗎?那麼,正如你似乎已經知道的那樣,TEST指令只是對它的操作數進行按位AND操作。那麼真值表對於按位與和?

|===============================| 
| Bit 1 | Bit 2 || AND | 
|---------|---------||----------| 
| 0 | 0 || 0  | 
| 1 | 0 || 0  | 
| 0 | 1 || 0  | 
| 1 | 1 || 1  | 
|===============================| 

中間兩種情況可以忽略,因爲在這個特例中,我們知道兩個操作數都是相同的值。因此,當esi爲0時,TEST將設置零標誌(ZF)爲1,因爲按位AND的結果爲0.相反,當esi非零時,TEST將關閉零標誌,因爲結果如果按位AND不爲零。

+0

單擊。你聽到了嗎?有一點點亮了。謝謝。你的回答非常明確和有幫助。 –

+0

至少未拋出未處理的異常!別客氣。 –