汇编中的TEST指令

TESTAL,08HTESTAX,0200HTESTCL,01H请问这三个指令是什么意思,能不能详细分析下?谢谢!!... TEST AL,08HTEST AX,0200HTEST CL,01H请问这三个指令是什么意思,能不能详细分析下?谢谢!! 展开
 我来答
优雅的小六
高粉答主

2019-06-08 · 关注我不会让你失望
知道小有建树答主
回答量:271
采纳率:100%
帮助的人:4万
展开全部

test属于逻辑运算指令,其功能为功能执行BIT与BIT之间的逻辑运算和测试功能(两操作数作与运算,仅修改标志位,不回送结果)。

Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST AX, BX与AND AX, BX命令有相同效果。TEST语法规格:TEST r/m,r/m/data。其影响标志包括:C,O,P,Z,S(其中C与O两个标志会被设为0)。

test的运用举例:利用Test指令测试一个位,例如寄存器:

test eax, 100b;/b后缀意为二进制/

jnz ******;/如果eax右数第三个位为1,jnz将会跳转/

jnz跳转的条件非0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。

扩展资料

与汇编指令test功能相仿的还有cmp指令,CMP属于算术运算指令,其功能为功能为比较两个值(寄存器,内存,直接数值),与Test指令的测试功能相仿,其语法格式为CMP r/m,r/m/data,影响的标志位包括C,P,A,Z,O。

CMP比较.(两操作数作减法,仅修改标志位,不回送结果)。cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志)。零标志很像carry,也是内部标志寄存器的一位。

参考资料来源:百度百科-test(汇编指令)

参考资料来源:百度百科-CMP指令

匿名用户
推荐于2017-12-16
展开全部
test执行的就是and的指令,只不过不会保存and执行的结果,而是根据and的结果设置flags寄存器的各种标志

test al, 08h 就是测试al的第4位是不是1,8h = 0000 1000
同理
test ax, 0200h 测试ax的第10位, 0200h = 0000 0010 0000 0000
test cl, 01h 测试cl的第1位,01h = 0000 0001

比如
test al, 01h
jz zero ; al的第一位是0
jnz one ; al的第一位是1
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-22
展开全部
test指令是测试指令,用于测试某些位是否为0,执行的是与运算,并且会将CF和OF置0,并且影响SF,ZF。若测试的位均为0,则SF=0,ZF=1。
举个例子吧。
MOV AL,40H
TEST AL,08H
执行起来就是
0100 0000(40H)
0000 1000(08H)
意思就是测试40H的左起第四位是否为0.
测试的结果是为0,
所以各标志位的状态是:CF=0,OF=0,SF=0,CF=1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Anna王尔德
2018-03-31 · TA获得超过1.7万个赞
知道小有建树答主
回答量:70
采纳率:100%
帮助的人:1万
展开全部

看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚.

首先看看:状态寄存器(即标志寄存器)

PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,
如下所示:

15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
OF 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位(半个字节)产生的进位置。
有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.

控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。


为举例方便说一下jnz和jz
测试条件
JZ   ZF=1
JNZ  ZF=0
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
Jnz=jump if not zero

好,接着来看test和cmp

*******************************************************************************
test属于逻辑运算指令

功能: 执行BIT与BIT之间的逻辑运算
测试(两操作数作与运算,仅修改标志位,不回送结果).
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。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, ecx
jz somewhere

如果ecx为零,设置ZF零标志为1,Jz跳转

*******************************************************************************
CMP属于算术运算指令

功能: 比较两个值(寄存器,内存,直接数值)
语法: CMP r/m,r/m/data
标志位: C,P,A,Z,O

CMP比较.(两操作数作减法,仅修改标志位,不回送结果).
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
零标志很像carry,也是内部标志寄存器的一位.

例如:
Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
Jz ****;          如果设置了零标志就跳转


*******************************************************************************
我得出的结论
test逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-22
展开全部
TEST是执行与运算,结果不存入目的寄存器中!自己动手算下哈,OK?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式