标志寄存器

标志寄存器
xiupush后面跟立即数就是以四个字节为单位
push后面跟寄存器与内存的时候根据宽度计算栈顶地址,八位的寄存器和八位的内存除外
标志寄存器
进位标志CF
运算结果最高位
产生了进位或者借位,那么值为1,这里的最高位就不说是以字节为单位了,单纯的指最高位的那个数字,需要注意的是判断进位首先要明确数据宽度
奇偶标志PF
用于反应运算结果(二进制结果)中1的个数,1为偶数个时,pf位置1,否则置0,注意该位置只看低位一个字节内的1和0
辅助进位标志AF
发生如下情况时,辅助进位标志的值被置1,否则为0
1、对dword操作时,低字向高字进位或借位时
2、对word操作时,低字节向高字节进位或借位时
3、在byte操作时,发生低4位,向高四位进位或借位时
零标志ZF
反应运算结果
是否为0,结果为0时,置1,否则为0,运算结果
指的是操作数进行某种运算所得到的结果,例如加法、减法、乘法、位运算等。mov这种指令不属于运算结果的范畴
符号标志SF
运算结果的最高位是什么,SF就是什么
溢出标志OF
有符号数
前提下,符号位(最高位)与最高有效位(符号位紧跟的一位)
符号位有进位,1,无进位,0,假设为A
最高有效位进位,1,无进位,0,假设为B
异或A,B的结果就是OF
反应有符号数加减运算所得结果是否溢出如果运算结果超出当前操作数能表示的范围则称为溢出,OF为1,否则清零
进位与溢出的区别
1、进位标志表示无符号数
运算结果是否超出范围
2、溢出标志表示有符号数
运算结果是否超出范围
正数加正数如果结果是负数,说明有溢出
负数加负数如果结果是正数,说明有溢出
正数加负数永远都不会有溢出
以八位的数据宽度举例
mov ax,bx
如果说ax运算的结果是无符号数
那么我们只看最终结果会不会超过0xFF,超过CF就为1
如果说ax运算的结果是有符号数
那么我们看正数
相加结果会不会超过0x7F,负数
相加结果会不会少于0x80,超过OF就为1
方向标志DF
影响MOVS,STOS汇编指令使用时寄存器ESI,EDI的偏移方向,为0的时候地址向编号更大的位置增加相应宽度,为1的时候地址向编号更小的地方减少相应宽度
指令扩展
pushad
在调试程序的时候害怕打乱程序原有堆栈运行,利用当前指令临时存放堆栈结构开辟新的堆栈进行测试
popad
调试结束以后恢复原有的堆栈
ADC
带进位的加法
ADC dest, src
其中dest和src都是操作数,可以是寄存器、内存单元或立即数。执行ADC指令时,会将src的值加上dest的值和进位标志CF的值,然后将结果保存在dest中
1 | 如果要处理无符号整数,则使用ADD指令。 |
SBB
带借位的减法
XCHG
交换数据,两边不能同时为内存,宽度要一致
xchg eax,ecx交换两个寄存器的值
MOVS
移动数据,内存–>内存,把寄存器esi,edi的值作为内存编号,取出esi内存编号的值放入edi中
movs可以有三种简写方式
1 | movsb = movs byte ptr es:[edi],byte ptr ds:[esi] |
STOS
将AL,AX,EAX的值存储到EDI指定的内存单元,由宽度决定移动的是那个寄存器
1 | stosb = stos byte ptr es:[edi] |
REP
按照寄存器ECX中指定的次数重复执行后续字符串指令
rep stos dword ptr es:[edi]