汇编中的test和cmp指令

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
看过破解教程,都知道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.

汇编语言中的test指令研究 在计算机科学中,汇编语言提供了对硬件的低级访问,允许程序员执行精细的控制优化。test指令是许多汇编语言中的一个基本指令,用于执行逻辑AND操作并设置相应的标志寄存器,但不存储结果。本文旨在探讨test指令的用法、功能实际应用,以及它如何在不同的上下文中提高程序性能安全性。汇编语言是一种低级编程语言,它允许开发者直接控制硬件。每个汇编指令通常对应一个特定的CPU机器码指令test 阅读详情

相关推荐

汇编常见指令

poggio 16:10:02 常见的运算类汇编指令 常见的传输类汇编指令 常用控制类指令

m0_55854679的博客 1万+

5.2 汇编语言:标志位测试指令

汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。标志位测试指令汇编语言中用于测试处理器标志位状态的指令。标志位是位于处理器状态寄存器中的一组特殊标志,用于指示上一个运算的结果是否为零、是否进位/借位、是否溢出等等。可以使用标志位测试指令来检查标志位的状态,并在需要时根据标志位状态进行操作。

微软技术分享 1万+

汇编语言中的TEST指令及其介绍

在上面的代码中,我们将0xFF00赋值给AX寄存器,将0x00F0赋值给BX寄存器。然后使用TEST指令对AXBX进行逻辑AND运算,并根据运算结果设置标志位。根据标志位的值,我们可以在后续的代码中进行条件跳转或其他操作。它可以对两个操作数进行逻辑AND运算,并根据运算结果设置标志位。通过检查标志位的值,我们可以根据运算结果进行条件跳转或其他操作。它可以对两个操作数进行逻辑AND运算,并根据运算结果设置标志位。根据标志位的值,我们可以在后续的代码中进行条件跳转或其他操作。

PixelCoder的博客 1万+

指令详解

1、test指令 测试指令   格式:TEST DEST,SRC   功能:目的操作数源操作数按位进行逻辑与操作,结果不回送目的操作数。源操作数可以为通用寄存器、存储器或立即数。目的操作数可以为通用寄存器或存储器操作数。   例1:   TEST DWORD PTR [BX],80000000H   TEST AL,CL   TEST指令常用于测试操作数中某位是否为1,而且不会影响

吖吖狼 的专栏 4781

test 指令

说明 test指令用于检查条件是否成立,如果条件为真,则返回一个0,如果条件不为真,则返回一个大于 0 的值,它可以进行数值、字符文件三个方面的检查。 test指令也可以简写为[], []test是等价的,用法为: [ expression ] 用法 数值 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -...

qazw9600的专栏 9250

【转】汇编中的testcmp指令

看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成,如下所示: 15   14    13    12   11   10    9    8

rheostat的专栏 9781

汇编中的testcmp指令[Z] 汇编中的testcmp指令[Z]

汇编中的testcmp指令[Z] 汇编中的testcmp指令[Z] 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成,  如下所示: 15   14    13    12   11   10    9    8    7    6    5    4

linuxheik的专栏 1161

汇编中的testcmp指令[Z]

首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成, 如下所示: 15   14    13    12   11   10    9    8    7    6    5    4    3    2   1   0                OF   DF   IF

liupeng900605的专栏 2万+

汇编 test指令cmp指令

test指令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。影响的标志位CF,ZF,OF,SF,PFcmp指令比较指令cmp的功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。影响的标志位CF,ZF,OF

fengshh2301的博客 6475

汇编中的testcmp指令 .

看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成, 如下所示: 15 14 13 12 11 10 9  8  7  6  5  4  3

happylife1527的专栏 839

linux汇编指令CMP与SUB,ANDTEST

linux下的cmpsub指令 cmp: cmp o1,o2 \\o1位操作数1 o2-o1,结果不保存,影响相应的标志位 sub: sub o1,o2 执行o2-o1,结果储存到O2中,影响相应的标志 AND and o1,o2 o1o2做与操作,结果储存在02中,影响标志位, test: ··· test o1,o2 o1与o2做与操作,结果不保存,影响相应标志位 ··· ...

weixin_53475254的博客 1218

汇编指令CMPTEST指令

一、CMP指令 这一块呢,我不想上图了,汇编的博文我已经快要让我写吐了,其实也有好多我没有补充进来,比如进制,LEA指令,数据宽度,有符号,无符号的区分等等,但我真的要吐了,这些玩意我已经不是第一次写了,也不是第一次看了,以前我是习惯于在EXCEL上写,这一次由于是我对汇编遗忘的有点狠,想从头复习一遍,刚好把这个复习的过程上传到博客园来,于是就有了这些文章,这两条指令,如果有兴趣,大家...

antangtong2499的博客 1023

汇编语言--testcmp区别

转载自其它博客。弥补自己的汇编盲区 汇编testcmp区别看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,大家一起把它们弄清楚.首先看看:状态寄存器(即标志寄存器)PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成, 如下所示:条件码: ①OF(Overflow

Quartz's Blog 1万+

testcmp一个很菜很基础的话题

发信人: FTBirthday 时 间:2003/05/19 01:14am详细信息:看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成,如下所

落叶树的BLOG 1644

汇编testcmp区别

汇编testcmp区别 看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器) PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)控制标志构成, 如下所示:  

thanklife的专栏 2万+
上一篇: 同步、异步、阻塞和非阻塞的概念
下一篇: uva100 The 3n + 1 problem
yaojiank
博客等级 码龄18年 5粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值