【学员笔记分享】汇编之EFLAGS寄存器中标志位

admin 2021年4月8日00:00:50评论42 views字数 2523阅读8分24秒阅读模式

【重要提示】因为公众号改了推送规则,一些读者反映有时收不到文章更新,不想错过的老铁可以这样:1、星标:点击公众号头像右上角的小人-然后点击点击右上角的“…”-设为星标。2、分享在看:在每篇文章下方点亮“分享”、“赞”、“在看”,只有多点,微信才会判定你喜欢这个号,才会给你推送。3、常读:只有多看公众号的文章,微信才会判定你喜欢,实验室文章更新时才会出现在你公众号列表的顶部。

本文作者:mr_biuMs08067实验室 二进制逆向星球学员)

    8086CPU的flag寄存器(16位)各标志位如下(这是32位EFLAG的低十六位图,但是32位与16位是一样的,只不过32位多了16位且高16位没有使用到):


【学员笔记分享】汇编之EFLAGS寄存器中标志位


CF—进位标志,加法时的最高位(D7或D15)产生进位或减法时最高位出现借位,则CF=1,否则CF=0;(状态标志位)

 

 

PF—奇偶标志,反映最低8位中“1”的个数的情况,若有偶数个“1”,则PF=1,否则PF=0。(状态标志位)

 

 

AF—辅助进位标志,供BCD码使用。当D3位出现进位或借位时AF=1,否则AF=0;(状态标志位)

 

 

ZF—零标志,运算结果各位都为零,则ZF=1,否则ZF=0;(状态标志位)


SF—符号标志,运算结果为负数时,即运算结果的最高位为1,则SF=1,否则SF=0;(状态标志位)

 

 

TF—陷阱标志,为程序调试而设的。当设置TF=1,CPU处于单步执行指令的方式;当设置TF=0时,CPU正常执行程序。(控制标志位)

 

 

IF—中断允许标志,当设置IF=1,开中断,CPU可响应可屏蔽中断请求;当设置IF=0时,关中断,CPU不响应可屏蔽中断请求。(控制标志位)

 

 

DF—方向标志,用来控制数据串操作指令的步进方向;

 

当设置DF=1时,将以递减顺序对数据串中的数据进行处理。当设置DF=0时,递增。(控制标志位)

 

 

OF—溢出标志,带符号数进行算术运算时,其结果超出了8位或16位的表示范围,产生溢出,则OF=1,否则OF=0;(状态标志位)


详解:

 

 1、进位标志CF (Carry Flag)

当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF= 0。

49H + 6DH=B6H,没有进位:CF = 0

BBH + 6AH=(1)25H,有进位:CF = 1

 

2、零标志ZF (Zero Flag)

若运算结果为0,则ZF = 1;否则ZF = 0

49H + 6DH=B6H,结果不是零:ZF = 0

75H + 8BH=(1)00H,结果是零:ZF = 1

 

3、符号标志SF (Sign Flag)

运算结果最高位为1,则SF = 1;否则SF = 0 49H + 6DH=B6H=10110110B,SF=1


4、奇偶标志PF(Parity Flag) 

当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0 3AH + 7CH=B6H=10110110B结果中有5个1,是奇数:PF = 0

 

5、溢出标志OF (OverflowFlag)

 若算术运算的结果有溢出,则OF=1;否则 OF=0 49H + 6DH =B6H,产生溢出:OF = 1 75H + 8BH =(1)26H,没有溢出:OF = 0

 

什么是溢出?

处理器内部以补码表示有符号数8位(仅7位有效数据)表达的整数范围是:+127~-128

 16位表达的范围是:+32767~-32768

 

如果运算结果超出这个范围,就产生了溢出有溢出,说明有符号数的运算结果不正确49H+6DH=B6H,就是73+109=182,已经超出-128~+127范围,产生溢出,故OF=1;

 

另一方面,补码B6H表达真值是-74,显然运算结果也不正确溢出标志OF和进位标志CF是两个意义不同的标志

 

进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

例1:49H +6DH=B6H无符号数运算:

 73+109=182范围内,

 无进位有符号数运算:73+109=182范围外,有溢出

 

例2:BBH +6AH=(1)25H无符号数运算:

 187+106=293范围外,

有进位有符号数运算:-69+106=37范围内,无溢出溢出的判断判断运算结果是否溢出有一个简单的规则:

 

只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确其他情况下,则不会产生溢出

1).当两个符号相同的数相加,结果的符号与之相反,则OF=1,否则OF=0.

2).当两个符号不同的数相减,结果的符号与减数相同,则OF=1,否则OF=0.


6、辅助进位标志AF(Auxiliary Flag)

运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。49H+ 6DH=B6H,D3有进位:AF = 1 100 1001B+110 1101B=1011 0110B

 

 7、方向标志DF(DirectionFlag)

 用于串操作指令中,控制地址的变化方向:设置DF=0,存储器地址自动增加;

 设置DF=1,存储器地址自动减少。

 CLD指令复位方向标志:DF=0

 STD指令置位方向标志:DF=1

  

8、中断允许标志IF(InterruptFlag)

 用于控制外部可屏蔽中断是否可以被处理器响应:

 设置IF=1,则允许中断;

 设置IF=0,则禁止中断。

 CLI指令复位中断标志:IF=0

 STI指令置位中断标志:IF=1

 

 9、陷阱标志TF(Trap Flag)

 用于控制处理器进入单步操作方式:

 设置TF=0,处理器正常工作;

 设置TF=1,处理器单步执行指令。

 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中

 断这种内部中断称为单步中断所以TF也称为单步标志利用单步中断可对程序进

 行逐条指令的调试这种逐条指令调试程序的方法就是单步调试

EU控制器是执行指令的控制电路,实现从队列中取指令、译码、产生控制信号等。


【学员笔记分享】汇编之EFLAGS寄存器中标志位


【学员笔记分享】汇编之EFLAGS寄存器中标志位






扫描下方二维码加入星球学习

加入后会邀请你进入内部微信群,内部微信群永久有效!

【学员笔记分享】汇编之EFLAGS寄存器中标志位


目前25000+人已关注加入我们

【学员笔记分享】汇编之EFLAGS寄存器中标志位

本文始发于微信公众号(Ms08067安全实验室):【学员笔记分享】汇编之EFLAGS寄存器中标志位

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月8日00:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【学员笔记分享】汇编之EFLAGS寄存器中标志位http://cn-sec.com/archives/292738.html

发表评论

匿名网友 填写信息