汇编中一些标志位的含义

来自:http://www.xuebuyuan.com/1602601.html

汇编语言标志位 含义 NV UP EI NG NZ AC PE CY

股沟了一下,终于知道了缩写是什么意思了。

  • Overflow of = OV NV [No Overflow]

    Direction df = DN (decrement) UP (increment)

    Interrupt if = EI (enabled) DI (disabled)

    Sign sf = NG (negative) PL (positive)

    Zero zf = ZR [zero] NZ [ Not zero]

    Auxiliary Carry af = AC NA [ No AC ]

    Parity pf = PE (even) PO (odd)

    Carry cf = CY [Carry] NC [ No Carry]

    ==============

    The individual abbreviations appear to have these meanings:

    OV = OVerflow, NV = No oVerflow. DN = DowN, UP (up).

    EI = Enable Interupt, DI = Disable Interupt.

    NG = NeGative, PL = PLus; a strange mixing of terms due to the

    fact that 'Odd Parity' is represented by PO (rather than

    POsitive), but they still could have used 'MI' for MInus.

    ZR = ZeRo, NZ = Not Zero.

    AC = Auxiliary Carry, NA = Not Auxiliary carry.

    PE = Parity Even, PO = Parity Odd. CY = CarrY, NC = No Carry.

     

 

调试程序DEBUG如何表达标志状态?

溢出OV(overflow,OF=1)

无溢出NV(no overflow,OF=0)

减量DN(direction down,DF=1)

增量UP(direction up,DF=0)

允许中断EI(enable interrupt,IF=1)

进制中断DI(disable interrupt,IF=0)

负NG(negative,SF=1)

正PL(plus,SF=0)

零ZR(zero,ZF=1)

非零NZ(no zero,ZF=0)

辅助进位AC(auxiliary carry,AF=1)

无辅助进位NA(no auxiliary carry,AF=0)

偶校验PE(even parity,PF=1)

奇校验PO(odd parity,PF=0)

进位CY(carry,CF=1)

无进位NC(no carry,CF=0)

 

  •  

     

AH&AL=AX(accumulator):累加寄存器
BH&BL=BX(base):基址寄存器
CH&CL=CX(count):计数寄存器
DH&DL=DX(data):数据寄存器
SP(Stack Pointer):堆栈指针寄存器
BP(Base Pointer):基址指针寄存器
SI(Source Index):源变址寄存器
DI(Destination Index):目的变址寄存器
IP(Instruction Pointer):指令指针寄存器
CS(Code Segment)代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1. 
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1. 
ZF zero flag 零标志 运算结果等于0时为1,否则为0. 
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0. 
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0. 
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0. 
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大. 
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断. 
TF trap flag 陷阱标志 用于调试单步操作

设置 nv(清除) ov(溢出)

  方向 dn(减) up(增)

  中断 ei(启用) di(禁用)

  正负 ng(负) pl(正)

  零 zr(0) nz(非0)

  辅助进位 ac(进位) na(不进位)

  奇偶校验 pe(偶校验) po(奇校验)

  进位 cy(进位) nc(不进位)

  如:

  OV DN EI NG ZR AC PE CY依次表示OF DF IF SF ZF AF PF CF都为1;

  NV UP DI PL NZ NA PO NC依次表示OF DF IF SF ZF AF PF CF都为0.

 

 

 

 

  of df if sf zf af pf cf
标志位为1ovdneingzracpecy
标志位为0nvupdiplnznaponc

 

 

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0100   NV UP EI PL NZ NA PO NC
1392:0100 28C0          SUB     AL,AL
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0102   NV UP EI PL ZR NA PE NC
1392:0102 B010          MOV     AL,10
-t

AX=0010  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0104   NV UP EI PL ZR NA PE NC
1392:0104 0490          ADD     AL,90
-t

AX=00A0  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0106   NV UP EI NG NZ NA PE NC
1392:0106 B080          MOV     AL,80
-t

AX=0080  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0108   NV UP EI NG NZ NA PE NC
1392:0108 0480          ADD     AL,80
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=010A   OV UP EI PL ZR NA PE CY
1392:010A B0FC          MOV     AL,FC
-t

AX=00FC  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=010C   OV UP EI PL ZR NA PE CY
1392:010C 0405          ADD     AL,05
-t

AX=0001  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=010E   NV UP EI PL NZ AC PO CY
1392:010E B07D          MOV     AL,7D
-t

AX=007D  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0110   NV UP EI PL NZ AC PO CY
1392:0110 040B          ADD     AL,0B
-

AX=0080  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1392  ES=1392  SS=1392  CS=1392  IP=0108   NV UP EI NG NZ NA PE NC
1392:0108 0480          ADD     AL,80
-另外有人在网上做了很好的总结

http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19481&kindLevel=1&kindId=34937&postId=39398&readSg=1 

 

王爽汇编语言 标志位 - 司徒无名 - 司徒无名的博客 

这里我做个脚注:即两数原码数值部分是什么意思

10000101

11111011 分别是同一个数的原码与补码,去掉最高位的符号位,相加即得128

当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位,是不是就说明运算结果没有溢出?但不进位最终将导致两个负数相加成了正数,显然是错误的,这该怎么解释?如果两个以补码表示的负数的数值部分之和向符号位进位,会使运算结果依然为负数,那么这个运算结果是正确的吗?下面我们分析一下这个问题: 

①只有真正意义上的相加才可能溢出,比如: 

    正+正,负+负,正-负,负-正 

    纯粹的减法是不可能溢出的,这一点仅需常识即可作出判断,所以遇到不是真正意义上的加法运算(当然,包括乘法和左移等)要你判断是否有溢出,直接就可以回答:OF=0; 

②两正数之和的数值部分向符号位进位,显然是运算结果超过了指定位数的带符号数的表示范围,这就是典型的溢出; 

③两负数之和的溢出判断是我们讨论的重点。我们先考察一下负数原码和补码数值部分之间的关系:以8位补码为例,负数原码和补码数值部分之和始终等于128(见上图)。由于这种关系,当原码数值大时对应的补码数值就小,反之也一样。所以,当两补码表示的负数的数值部分之和没有向符号位进位,说明两负数的原码之和必然向符号位进位,即发生溢出;反之,当两补码表示的负数的数值部分之和向符号位进位,那么对应两负数原码的数值之和就不可能向符号位进位,即运算结果没有溢出;并且在这种情形下补码之和的数值部分向符号位的进位,修正了两负数符号位相加本位为零的问题,使得两负数之和依然是个负数。 
    下面看两个负数补码相加溢出判断的实例: 
例一:085h + 9ch 
   = 10000101b + 10011100b 
   两数相加,数值部分不会向符号位进位,这是不是就说明没有溢出呢?但由于计算结果为正,显然不对。我们还是看看两个数的原码之和再说: 
    10000101b的原码 = 11111011b(-123) 
    10011100b的原码 = 11100100b(-100) 
    显然,原码之和的数值部分将向符号位进位,显然是溢出无疑。 

例二:0e7h + 0b3h 
    =11100111b + 10110011b 
    两数相加,数值部分会向符号位进位,这进位是溢出吗?还是看看原码吧! 
    11100111b的原码 = 10011001b(-25) 
    10110011b的原码 = 11001101b(-77) 
    容易看出,两数原码之和没有向符号位进位,即没有发生溢出。 
    其实归结起来,补码的溢出判断规则就一句话: 

    同号数相加如果结果的符号位和两加数不同,既是溢出。 

    这自然说明了: 
    ⑴不是同号数相加,则不可能溢出; 
    ⑵同号数相加有可能溢出; 
    ⑶同号数相加如果结果的符号位和两加数不同,既是溢出。

### 汇编语言中标志位含义与作用 #### 1. 标志位概述 在汇编语言中,**标志位**是指位于处理器状态寄存器(也称为标志寄存器)中的一组特殊标记。它们反映了最近执行的指令所产生的结果特性[^1]。这些标志位能够帮助程序员判断某些条件是否满足,并据此调整程序流程。 #### 2. 主要标志位及其意义 ##### OF (Overflow Flag) - 溢出标志 - 当有符号整数运算超出范围时设置此标志。 - 对于无符号数则不会影响OF。 - NV 和 OV 是它的两种可能显示形式分别代表未发生溢出和发生了溢出的情况 [^2]. ##### DF (Direction Flag) - 方向标志 - 控制字符串处理指令的工作方向。 - DN 表示向下移动;UP 则相反意味着向上推进 [^2]. ##### IF (Interrupt Flag) - 中断允许标志 - 决定 CPU 是否响应来自外部设备发起的可屏蔽中断请求。 - 不论 IF 的当前值是多少,对于不可屏蔽中断或是由硬件错误触发的异常事件始终会被接受 [^3]. ##### SF (Sign Flag) - 符号标志 - 显示最后计算得出的结果最高有效位(即符号位),如果为正数那么SF=0;如果是负数的话SF就会等于1. - PL 和 NG 分别对应正值和平凡情形下的表现形式而 PO 却有些特别因为它实际上指的是奇偶校验而非单纯的正负判定标准 [^2]. ##### ZF (Zero Flag) - 零标志 - 若前次操作后的所得数值正好是零,则置位这个标志。 - NZ/ZR 形成了另外一对互斥的概念用来描述非零状况或者确切意义上的归零现象 . ##### AF (Auxiliary Carry Flag) - 辅助进位标志 - 在 BCD(Binary Coded Decimal)编码模式下做加减法的时候可能会涉及到低四位之间产生的额外携带情况此时就需要借助AF来进行记录了。 - NA/AC 组合表达了不存在辅助进位与否的信息 . ##### PF (Parity Flag) - 奇偶标志 - 测试最低字节里边一共有多少个比特位处于开启状态若是偶数数量就激活PF反之关闭之。 - PE/PO 成为了辨别这两种对立局面的标准工具之一 [^2]. ##### CF (Carry Flag) - 进位标志 - 凡是在涉及二进制数字相加过程中一旦产生了超越原有界限长度的新位元都会引起CF发生变化从而提醒开发者注意高位截断丢失的问题存在。 - NC/CY 类似地构成了另一组对比鲜明的选择项以便更清晰地区分正常范围内变化还是超出了预期边界的情形 . --- ### 示例代码展示 以下是如何检测两个8位无符号整型变量A,B相加大于FFH之后是否会引发进位的例子: ```assembly mov al, A ; Load value of 'A' into AL register add al, B ; Add value of 'B' to it jc overflow ; Jump if there was a carry out from the most significant bit no_overflow: ; Continue here when no overflow occurred... jmp continue_processing overflow: ; Handle case where sum exceeded FFh limit... continue_processing: ``` 在此段伪码片段之中JC(jump on carry)命令正是依据CF来做出分支决策的关键所在只要发现任何一次累加动作造成了跨过最大容量限制的现象便会转向专门设计好的错误处理路径上去继续后续工作流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值