C/C++ 您当前所在位置:首页 > C/C++ > 标志寄存器

标志寄存器

陈成 陈成 2020-07-05 18:26:54 C/C++ 203人已围观

简介 标志寄存器很重要,它可以决定JCC指令如何走。比如JE跳转,就是通过ZF标志位来判定的。想玩转汇编指令各种跳转,就要学好JCC,而JCC又是根据标志寄存器来决定的,所以掌握标志寄存器非常重要。

标志寄存器很重要,它可以决定JCC指令如何走。比如JE跳转,就是通过ZF标志位来判定的。想玩转汇编指令各种跳转,就要学好JCC,而JCC又是根据标志寄存器来决定的,所以掌握标志寄存器非常重要。

第0位:CF(Carry Flag),进位标志,如果运算结果的最高位出现了进位或借位,值就为1,否则值为0。注意数据宽度,确认了数据宽度才能确认最高位。

mov ax,0xFFFF
add ax,1

通过上面的运算,最高位就进位了,CF为1。

第2位:PF(Parity Flag),奇偶标志,用来展示结果中的“1”的个数,结果中1的个数为偶数,这个标志位就为1,否则为0。这里隐藏一个坑,不记录,自己去验证,这样记得牢。

mov ax,3
add ax,1
add ax,1

ax中为3的时候是不会有变化的,这里是展示运算结果的奇偶,如果加上一个1,因为3的二进制是0011,加1为0100,结果中1为奇数,所以PF没反应,再加一个1结果为0101,1的个数为偶数,PF变成1。

第4位:AF(Auxiliary Carry Flag),辅助进位标志,就是低位的第一个数有没有进位或借位,如:

mov ax,0xFFFF
add ax,1

如果ax的值为FFFF,我们需要看第2位(从右往左)有没有进位或借位。如果eax的值为EEEEFFFF,我们需要看第4位(从右往左)有没有进位或借位。如果有,那么AF标志位的值就为1。

第6位:ZF(Zero Flag),0标志位,如果运算结果为0,这个位的值就为1。

mov eax,1
sub eax,1
//或者
xor eax,eax

第7位:SF(Sign Flag),符号标志,反映运算结果的符号位,和结果中最高位一样。

第11位:OF(Overflow Flag),溢出标志,用来反映有符号的运算结果是否溢出,如果结果超过当前表示范围,称为溢出,值为1,否则值为0。

与CF(进位标志)的区别:

进位标志表示无符号运算的结果是否超出范围;

溢出标志表示有符号的运算结果是否超出范围。

正数加正数,如果结果为负数,溢出;

负数加负数,如果结果为正数,溢出;

正加负永远不会溢出。

还有一些标志位先不记录了,以后再记录。

文章评论

发送

站点信息

  • 上线时间:2020年05月30日
  • 网站程序:自建框架
  • 博客模板:今夕何夕
  • 文章统计43篇文章
  • 评论统计0条评论
  • 留言统计0条留言
  • 统计数据:百度统计