今天小天来给大家分享一些关于汇编test指令作用方面的知识吧,希望大家会喜欢哦
汇编test指令(汇编test指令作用)
汇编test指令(汇编test指令作用)
1、test执行的就是and的指令,只不过不会保存and执行的结果,而是根据and的结果设置flags寄存器的各种标志test al, 08h 就是测试al的第4位是不是1,8h = 0000 1000同理test ax, 0200h 测试ax的第10位, 0200h = 0000 0010 0000 0000test cl, 01h 测试cl的第1位,01h = 0000 0001比如test al, 01hjz zero ; al的位是0jnz one ; al的位是1test指令是测试指令,用于测试某些位是否为0,执行的是与运算,并且会将CF和OF置0,并且影响SF,ZF。
2、若测试的位均为0,则SF=0,ZF=1。
3、举个例子吧。
4、MOV AL,40HTEST AL,08H执行起来就是0100 0000(40H)0000 1000(08H)意思就是测试40H的左起第四位是否为0.测试的结果是为0,所以各标志位的状态是:CF=0,OF=0,SF=0,CF=1看过教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,下决心找了很多资料,和大家一起把它们弄清楚.首先看看:状态寄存器(即标志寄存器)PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF条件码:①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.②SF(Sign Flag)符号标志,结果为负时置1,否则置0.③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
5、有进位时1,否则置0.⑥PF(Parity Flag)奇偶标志.结果作数中1的个数为偶数时置1,否则置0.控制标志位:⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
6、⑧IF(Interrupt Flag)中断标志。
7、⑨TF(Trap Flag)陷井标志。
8、为举例方便说一下jnz和jz测试条件JZ ZF=1JNZ ZF=0即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)Jnz=jump if not zero好,接着来看test和cmptest属于逻辑运算指令功能: 执行BIT与BIT之间的逻辑运算测试(两作数作与运算,仅修改标志位,不回送结果).Test对两个参数(目标,源)执行AND逻辑作,并根据结果设置标志寄存器,结果本身不会保存。
9、TEST AX,BX 与 AND AX,BX 命令有相同效果语法: TEST r/m,r/m/data影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0)运用举例:1.Test用来测试一个位,例如寄存器:test eax, 100b; b后缀意为二进制jnz ; 如果eax右数第三个位为1,jnz将会跳转我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:test ecx, ecxjz somewhere如果ecx为零,设置ZF零标志为1,Jz跳转CMP属于算术运算指令功能: 比较两个值(寄存器,内存,直接数值)语法: CMP r/m,r/m/data标志位: C,P,A,Z,OCMP比较.(两作数作减法,仅修改标志位,不回送结果).cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).零标志很像carry,也是内部标志寄存器的一位.例如:Cmp eax, 2; 如果eax-2=0即eax=2就设置零标志为1Jz ; 如果设置了零标志就跳转我得出的结论test逻辑与运算结果为零,就把ZF(零标志)置1;cmp 算术减法运算结果为零,就把ZF(零标志)置1。
本文到这结束,希望上面文章对大家有所帮助。