2012-10-25 66 views
76

可能重複:
x86 Assembly - ‘testl’ eax against eax?測試的關鍵%EAX%EAX

我非常非常新的彙編語言程序設計,目前我正在閱讀組裝從二進制生成的語言。我碰到過

test %eax,%eax 

test %rdi, %rdi等等等等。我對這件事很困惑。 %eax, %eax中的值是不是相同?它是什麼測試?我在某處讀到它正在執行AND操作.....但是由於它們的值相同,是不是隻返回%eax

下面就是一個例子,我發現這種用法:

400e6e:  85 c0     test %eax,%eax 
    400e70:  74 05     je  400e77 <phase_1+0x23> 

我想如果進行比較的兩個值相等je跳躍......好,因爲%eax很好,本身,在什麼情況下我們不會跳?

我是一般的初學者,所以如果有人能向我解釋這一點,我會非常感激。謝謝!

+4

由於有些答案看起來有點不清楚,讓我指出'TEST'除了'ZF'外還更新了其他標誌。請參閱指令集參考。 – Jester

+0

@Jester修復了(在我的回答中),對不起。 –

+0

另一個可能的重複:?什麼是'test'指令做(http://stackoverflow.com/q/6002079) – jww

回答

95

CMP減去操作數並設置標誌。即,如果差值爲零(操作數相等),則它設置零標誌。

TEST設置零標誌,ZF,當AND操作的結果爲零時。如果兩個操作數相等,則當它們都爲零時,它們的位AND爲零。 TEST也設置符號標誌SF,當結果中設置最高有效位時,並且設置位數爲偶數時奇偶標誌PF

JE [如果等於則跳轉]測試零標誌並在標誌置位時跳轉。 JEJZ的別名[Jump if Zero],所以反彙編器不能根據操作碼選擇一個。 JE被命名爲這樣,因爲如果參數CMP相等,則設置零標誌。

所以,

TEST %eax, %eax 
JE 400e77 <phase_1+0x23> 

跳轉如果%eax爲零。

+3

我在哪裏可以找到這樣的信息? –

+5

即? x86指令列表[位於維基百科](http://en.wikipedia.org/wiki/X86_instruction_listings),它也鏈接[英特爾規格](http://www.intel.com/content/www/) (http://web.archive.org/web/20100407092131/http://home.com/us/en/developers/architecture-software- developer-manuals.html)以及[另一個可讀的參考資料] .comcast.net /〜fbui/intel.html)。 [教程](http://en.wikibooks.org/wiki/X86_Assembly)也可在Wikibooks上找到。 –

+0

沒錯,這就是如果'%eax'爲零,我一直在尋找 –

9

這會檢查EAX是否爲零。指令test在參數之間進行按位AND,如果EAX包含0,則結果設置ZF或ZeroFlag。

+3

這是做它的標準方式。對於「初學者清晰」,也可以使用cmp%eax,0(立即數),但是這會編碼爲更長的指令(即效率較低)。 –

2

你是對的,那test「和」兩個操作數。但是結果被拋棄了,唯一停留的東西,那就是重要的部分,就是旗幟。它們被設置,這就是爲什麼test指令被使用(和存在)的原因。

JE當不相等時跳轉(它具有以前的指令是比較時的含義),它確實做了什麼,它會在設置標誌ZF時跳轉。因爲它是由test設置的標誌之一,所以該指令序列(測試x,x; je ...)具有當x爲0時跳躍的含義。

對於這樣的問題(和更多細節)我可以推薦一本關於x86指令的書,例如即使它真的很大,英特爾的文檔也非常精確。

3

test是一個非破壞性的and,它不返回操作的結果,但它相應地設置標誌寄存器。要知道它真正測試的是什麼,你需要檢查下面的指令。經常用來檢查一個寄存器是否爲0,可能還會加上一個jz條件跳轉。

32

一些x86指令被設計成離開操作數(寄存器),因爲它們是與只設置/復位具體的內部CPU標誌像零標誌(ZF)的含量。您可以將ZF視爲駐留在CPU內的真/假布爾標誌。根據邏輯和的結果

在此特定情況下 ,TEST指令按位進行邏輯AND,丟棄該實際結果和設置/取消設置ZF:如果結果是零它設置ZF = 1,否則它設置ZF = 0

像JE 條件跳轉指令被設計來看看ZF跳躍/ notjumping所以使用TEST和JE一起相當於基於特定寄存器的值來執行一個條件跳轉:

例如:

TEST EAX,EAX
JE some_address

CPU將跳轉到 「some_address」 當且僅當ZF = 1,換言之當且僅當AND(EAX,EAX)= 0,這在轉當且僅當EAX == 0

等效C代碼是它可以發生:

if(eax == 0) 
{ 
    goto some_address 
}