複製鏈接
請複製以下鏈接發送給好友

test

(彙編指令)

鎖定
Test命令將兩個操作數進行邏輯與運算,並根據運算結果設置相關的標誌位。但是,Test命令的兩個操作數不會被改變。運算結果在設置過相關標記位後會被丟棄。
中文名
test
類    型
邏輯運算指令
功    能
測試
語    法
TEST r/m,r/m/data

test基本信息

Test屬於邏輯運算指令

test功能

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

test用法

Test對兩個參數(目標,源)執行AND邏輯操作,並根據結果設置標誌寄存器,結果本身不會保存。
TEST AX,BX 與 AND AX,BX 命令有相同效果,只是Test指令不改變AX和BX的內容,而AND指令會把結果保存到AX中。

test詳細介紹

語法: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 *)

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, 合理。
計算機test
計算機test(3張)
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未定義,自然合理。

test運用舉例

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跳轉。