3-标志寄存器

标志寄存器

1.状态标志

CF(进位标志)(bit0)
  • 最高有效位发生进位(加法)或者借位(减法)的情况下置1,反之清零

测试代码

#include <iostream>
int main()
{
int nEax = 0x80000000, nEbx = 0x80000000;
//nEax和nEbx都在内存里,不能直接进行运算。应该加载到寄存器里进行(看似直接进行运算的也是加载到了寄存器里)
__asm {
mov eax, nEax;
mov ebx, nEbx;
add eax, ebx; //CY即进位位变成1,OV即溢出位变成1
//特别注意:是最高有效位才会置1
mov nEax, eax;
}
printf("%08X\r\n", nEax);
//复习:
//0:补0
//8:宽度
//X:16进制
//\r:回到行首
//\n:换行
}

借位代码

#include <iostream>
int main()
{
int nEax = 0x00000000, nEbx = 0x80000000;
__asm {
mov eax, nEax;
mov ebx, nEbx;
sub eax, ebx; //CY即进位位变成1,OV发生下溢,同样变1
//特别注意:是最高有效位才会置1
mov nEax, eax;
}
printf("%08X\r\n", nEax);
}
PF(奇偶标志)(bit2)
  • 结果的最低有效字节里有偶数个1才会置1

示例代码

#include <iostream>
int main()
{
int nEax = 0x000000C0, nEbx = 0x00000000;
__asm {
mov eax, nEax;
mov ebx, nEbx;
add eax, ebx; //PE置1
mov nEax, eax;
}
printf("%08X\r\n", nEax);
}
//特别注意:一定是最低有效字节里的1的个数
AF(辅助进位标志)(bit4)
  • 结果的第3位(从0开始)是否发生进位,是则置1

示例代码

#include <iostream>
int main()
{
int nEax = 0x00000008, nEbx = 0x00000008;
//0000 0100 + 0000 0100 = 0000 1000
__asm {
mov eax, nEax;
mov ebx, nEbx;
add eax, ebx; //AC置1
mov nEax, eax;
}
printf("%08X\r\n", nEax);
}
ZF(零标志)(bit6)
  • 结果为0,置1

SF(符号标志)(bit7)
  • 最高有效位,1代表负数,0代表正数

OF(溢出标志)(bit11)
  • 小数-大数或者两个大数相加导致溢出,置1

无符号下,CF表示借位或者进位

有符号下,OF表示借位或者进位

2.控制标志(DF flag)

在标志寄存器的bit10

  • 在指定了ESI和EDI后,使用MOVS指令,该位置1为减,置0为加

  • 可以使用std或者cld指令设置

#include <iostream>
int main()
{
int nEax = 0x00000008, nEbx = 0x00000008;
__asm {
std;
cld;
}
printf("%08X\r\n", nEax);
}

ELF是标志寄存器的值