
test(彙编指令)
Test命令将两个运算元进行逻辑与运算,并根据运算结果设定相关的标誌位。但是,Test命令的两个运算元不会被改变。运算结果在设定过相关标记位后会被丢弃。
基本介绍
- 中文名:test
- 类型:逻辑运算指令
- 功能:测试
- 语法:TEST r/m,r/m/data
介绍
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);
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 *)
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跳转。
转载请注明出处海之美文 » test(彙编指令)