汇编语言的C状态寄存器,汇编指令-状态寄存器、cmp、test、jz等指令详细说明

本文详细介绍了汇编语言中的C状态寄存器,包括溢出标志、符号标志、零标志等条件码,以及方向标志、中断标志等控制标志。同时,讲解了test和cmp指令的使用,如何设置和检查标志位,以及jz和jnz等条件跳转指令的工作原理。文章通过实例解析了test和cmp指令如何影响零标志,并讨论了直接和间接标志转移的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、状态寄存器

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

PSW(Program Status Word)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,

如下所示:

e780ba1be8286bc8c0209f5d0cc0547d.png

条件码:

①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)陷井标志。

test和cmp指令运行后都会设置标志位,为举例方便说一下jnz和jz

测试条件

JZ   ZF=1

JNZ  ZF=0

即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)

Jnz=jump if not zero

二、test指令和cmp指令

好,接着来看test和cmp

1、test指令

test属于逻辑运算指令

功能:执行BIT与BIT之间的逻辑运算

测试(两操作数作与运算,仅修改标志位,不回送结果)。

Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST 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跳转的条件非0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。

2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx

jz somewhere

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

2、cmp指令

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 ****;               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值