從大會地區開始,很難找到一個體面的教程。 想找一本「Assembly for Dummies」的書。彙編:何時會測試%esi,%esi返回不等於?
我遇到以下問題,'test'命令總是使用相同的地址或註冊表運行。
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>
由於相同的註冊表或地址正在和AND何時不會返回這些是相同的?
從大會地區開始,很難找到一個體面的教程。 想找一本「Assembly for Dummies」的書。彙編:何時會測試%esi,%esi返回不等於?
我遇到以下問題,'test'命令總是使用相同的地址或註冊表運行。
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <main+76>
由於相同的註冊表或地址正在和AND何時不會返回這些是相同的?
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不爲零。
單擊。你聽到了嗎?有一點點亮了。謝謝。你的回答非常明確和有幫助。 –
至少未拋出未處理的異常!別客氣。 –
它不檢查「相同」,它不是'cmp'。它檢查按位「和」的結果是否爲零,反過來又意味着「esi」爲零或不是。 – Jester
[測試點%eax%eax]的可能重複(https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax) –