共找到3條詞條名為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 *)

舉例


計算機test
計算機test
翻譯過來就是:
將兩個操作數進行按位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跳轉。