Test[彙編指令]

Test[彙編指令]
Test[彙編指令]
更多義項 ▼ 收起列表 ▲

Test命令將兩個運算元進行邏輯與運算,並根據運算結果設定相關的標誌位。但是,Test命令的兩個運算元不會被改變。運算結果在設定過相關標記位後會被丟棄。

介紹

Test屬於邏輯運算指令

功能

測試(兩運算元作與運算,僅修改標誌位,不回送結果)。

用法

Test對兩個參數(目標,源)執行AND邏輯操作,並根據結果設定標誌暫存器,結果本身不會保存。

TEST AX,BX 與 AND AX,BX 命令有相同效果,只是Test指令不改變AX和BX的內容,而AND指令會把結果保存到AX中。

詳細介紹

語法:TEST r/m,r/m/data

影響標誌:C,O,P,Z,S(其中C與O兩個標誌會被設為0)

Intel的技術手冊上是這么寫的:

TEMP ←SRC1 AND SRC2;
SF ←MSB(TEMP);

IF TEMP = 0
THEN ZF ←1;
ELSE ZF ←0;
FI:
PF ←BitwiseXNOR(TEMP[0:7]);
CF ←0;
OF ←0;
(* AF is undefined *)

舉例

翻譯過來就是:
將兩個運算元進行按位AND,設結果是TEMP
SF = 將結果的最高位賦給SF標誌位,例如結果最高位是1,SF就是1
看TEMP是不是0
如果TEMP是0,ZF位置1
如果TEMP不是0,ZF位置0
PF = 將TEMP的低8位,從第0位開始,逐位取同或。也就是第0位與第1位的同或結果,去和第2位同或,結果再去和第3位同或....直到和第7位同或。
CF位置0
OF位置0
AF位是未定的,鬼知道是什麼
下面我們來看看這么做是否合理:
SF位是符號位。對於有符號的數據,最高位正好是符號位,合理。
ZF位記錄操作的結果是否是0, 合理。

PF位是奇偶校驗位,如果結果低8位中1的個數是偶數,PF=1;否則PF=0.
一個8位數有2^8 = 256種可能,而且這個操作這么複雜,一個一個地驗算會死人的!!
幸好,高數老師教了我們歸納證明法!
明:對於2,4,6,8這種偶數長度的數據,對其從低位到高位進行按位同或操作。如果數據的二進制表示中,有偶數個1,結果為1;反之結果為0
當長度=2的時候,有4種可能,00,01,10,11
對其進行同或運算,
00 = 1,有0個1,0也是偶數,合理。
01 = 0,有1個1,合理。
10 = 0,有1個1,合理。
11 = 1,有2個1,合理。
現在,將長度擴展為4,根據低2位的結果,有8種可能:
00 + 奇 = 00 + 0 = 000 = 01 = 0, 0 + 奇 = 奇數,合理。
00 + 偶 = 00 + 1 = 001 = 00 = 1, 0 + 偶 = 偶數,合理。
01 + 奇 = 01 + 0 = 010 = 00 = 1, 注意,此處 1 + 奇 = 偶數,合理。
01 + 偶 = 01 + 1 = 011 = 01 = 0, 1 + 偶 = 奇數,合理。
10 + 奇 = 10 + 0 = 100 = 11 = 1, 不解釋。
10 + 偶 = 10 + 1 = 101 = 10 = 0, 不解釋。
11 + 奇 = 11 + 0 = 110 = 10 = 0, 不解釋。
11 + 偶 = 11 + 1 = 111 = 11 = 1, 不解釋。
推廣下去,證畢。
CF是進位標誌,對於test來講,沒啥子意義,置0,合理。
OF是溢出標誌,對於test命令來講,沒啥子意義,置0,合理。
AF未定義,自然合理。

運用舉例

1.Test用來測試一個位,例如暫存器:

test eax,100b;b後綴意為二進制

jnz ******;如果eax右數第三個位為1,jnz將會跳轉

我是這樣想的,jnz跳轉的條件是ZF=0,ZF=0意味著ZF(零標誌)沒被置位,即邏輯與結果為1。

2.Test的一個非常普遍的用法是用來測試一方暫存器是否為空:

test ecx, ecx

jz somewhere

如果ecx為零,設定ZF零標誌為1,jz跳轉。

相關詞條

相關搜尋

熱門詞條

聯絡我們