汇编—EFLAGS寄存器

1. EFLAGS寄存器

在这里插入图片描述

两个数相加,如果最高位向高位进位,结果忽略这个位,那么这个位要放到 CF 里面。
Carry Flag,进位标志。
减法运算,如果最高位向高位借位,则 CF 位为 1。
CF 表示加满了之后,向高位进位,但是计算机限制宽度,没法表示,所以把进的这个位暂时放在标志寄存器里面的一个位 CF,以后有待查证,减法同理。
CF 在 eflag 里面第 0 位。运算的宽度可以自定义:可以是 8 位,16 位也可以是 32位的运算。
CF 如果本身是零,运算后无进位,则 CF 还是零,其实 CF 被改了,只是结果没有变而已。
第一位没有使用,永远是 1。
我们来看 PF 位,运算结果中 1 的个数是基数还是偶数,偶数置 1,基数置 0。PF 位只看结果(这里指二进制),parity flag,EFLAG 中的第二位。
AF 位:看低四位加减是否有进/借位,AF 置 1。没有进/借位也会改 AF(置 0)。
ZF 位只看结果,看结果是不是全是 0,全是 0,置 1,只要一位不是 0,则置 0,位置是第六位。
SF 位,最高位是多少,就置多少,是最高位的复制品,没有其他含义,如果是 8 位运算看第 7 位,16 位运算看第 15 位,32 位运算看第 31 位(从第 0 位开始)。
OF 位:最高位相同,看次高位是否向最高位进位,最高位不同,无溢出。

其实也有特殊的指令允许出现两个内存:
mov [EDI],[ESI]可以简写为 movs
mov dword ptr[EDI],dword ptr[ESI] 简写为 movsd
mov word ptr[EDI],word ptr[ESI] 简写为 movsw
mov byte ptr[EDI],byte ptr[ESI] 简写为 movsb

EFLAG 里面有一个 DF 位,movsb/w/d 每移动一次数据,都要对 ESI 和 EDI 进行加
1/2/4,或减 1/2/4,到底是加还是减,看 DF 位,当 DF 为 1 时,是减,当 DF 为 0 的时候是加。
所以我们使用 std(set DF)把 DF 置 1,cld(clear DF)把 DF 置 0,观察指令变化
DF 影响的其他指令有:

stosb:stos byte ptr[edi],eax;(stosw,stosd)。

标志寄存器(EFLAGS)又称为程序状态和控制寄存器(Program Status and
Control Register),主要用于记录当前的程序状态。
·进位标志(CF):在运算过程中出现进位或借位操作时标志位置 1
例:定义数值宽度为 32 位,则 0xFFFFffff+2 在运算过程中出现进位。
·奇偶标志(PF):运算结果值中 1 的个数为偶数置 1。这里的运算结果是站在计算机
的角度看。
例:运算结果 0x4567 中 1 的个数是?
没有,那是站在你的角度;站在计算机的角度,它是 0100010101100111B。所以有
8 个 1,PF=1。
·辅助进位标志(AF):在算术运算中位 3 出现进位或借位置 1
·零标志(ZF):运算结果为零置 1
·符号标志(SF):符号位值(最高位)
·单步标志(TF):单步使能置 1,当该位置 1 时,可以对程序进行单步调试。
·中断使能标志(IF):响应可屏蔽中断置 1
·方向标志(DF):字符串指令(MOVS,CMPS,SCAS,LODS 和 STOS)处理字符串
从高地址到低地址置 1(STD 和 CLD 指令设置和清除该标志位)。
说明:在汇编指令中,我们有些指令是对大块的内存操作,这个时候要选择从低地址开
始还是从高地址开始,置 1 表示由高到低,置 0 则反之。
·溢出标志(OF):运算结果溢出置 1。区别于进位标志(在运算过程中)。在这里要引
用 Intel 汇编语言程序设计中的一段话:CPU 是如何检测溢出的:在加法和减法运算完成后,CPU 使用一种非常有趣的方法确定溢出标志的值:运算结果最高有效位向高位的进位值
(CF)与到最高有效位的进位值异或,其结果放到溢出标志位中。

标志寄存器主要是记录当前的程序状态

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值