编程达人吧 关注:16贴子:35
  • 0回复贴,共1

2.4 EFLAGS寄存器

只看楼主收藏回复

本节主要内容:
1. 标志寄存器
2. 标志寄存器每个标志位的含义
3. 熟知标志寄存器的各种运算对于CF,PF,AF,ZF,SF这些标志位的影响
老唐语录:
下面我们开始讲标志寄存器EFLAGS,如图2-8:
图2-8:标志寄存器
两个数相加,如果最高位向高位进位,结果忽略这个位,那么这个位要放到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位:最高位相同,看次高位是否向最高位进位,最高位不同,无溢出。
Intel解释:
运算结果大于最大的正数,或小于最小的负数
我的理解(Intel汇编语言程序设计):
最高位的进位与次高位的进位异或。
我们之前一直认为两个操作数只能是在“寄存器和内存”或者“寄存器和寄存器”之间移动数据,不可以是在内存与内存之间。
其实也有特殊的指令允许出现两个内存:
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
练习:
mov edi,0x427c20
mov esi,0x427c48
movsd/movsw/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)与到最高有效位的进位值异或,其结果放到溢出标志位中。
例如8位二进制数10000000和11111110相加,第6位向最高位有效位(第7位)无进位,但第7位向高位有进位值(CF=1)。如图2-9:
图2-9:8位二进制数加运算
由于1 XOR 0 = 1,因此of=1。
课后疑问:
AF位是进位标志的一种吗?
回答:是。
加法或减法对OF位的影响有什么不同?
回答:一样的。
课后总结:
标志寄存器主要是记录当前的程序状态
课后练习:
举例改变标志寄存器的每个位


1楼2016-06-09 19:54回复