标志寄存器

push后面跟立即数就是以四个字节为单位

push后面跟寄存器与内存的时候根据宽度计算栈顶地址,八位的寄存器和八位的内存除外

标志寄存器

image-20230418082324085

image-20230418082844135

进位标志CF

运算结果最高位产生了进位或者借位,那么值为1,这里的最高位就不说是以字节为单位了,单纯的指最高位的那个数字,需要注意的是判断进位首先要明确数据宽度

image-20230418084126370

image-20230418084253348

奇偶标志PF

用于反应运算结果(二进制结果)中1的个数,1为偶数个时,pf位置1,否则置0,注意该位置只看低位一个字节内的1和0

image-20230418091346345

image-20230418091459110

辅助进位标志AF

发生如下情况时,辅助进位标志的值被置1,否则为0

1、对dword操作时,低字向高字进位或借位时

image-20230418092440265

2、对word操作时,低字节向高字节进位或借位时

image-20230418092532977

3、在byte操作时,发生低4位,向高四位进位或借位时

image-20230418092619943

零标志ZF

反应运算结果是否为0,结果为0时,置1,否则为0,运算结果指的是操作数进行某种运算所得到的结果,例如加法、减法、乘法、位运算等。mov这种指令不属于运算结果的范畴

image-20230418095958683

image-20230418100136965

符号标志SF

运算结果的最高位是什么,SF就是什么

image-20230418101630931

溢出标志OF

有符号数前提下,符号位(最高位)与最高有效位(符号位紧跟的一位)

​ 符号位有进位,1,无进位,0,假设为A

​ 最高有效位进位,1,无进位,0,假设为B

​ 异或A,B的结果就是OF

反应有符号数加减运算所得结果是否溢出如果运算结果超出当前操作数能表示的范围则称为溢出,OF为1,否则清零

进位与溢出的区别

1、进位标志表示无符号数运算结果是否超出范围

2、溢出标志表示有符号数运算结果是否超出范围

正数加正数如果结果是负数,说明有溢出

负数加负数如果结果是正数,说明有溢出

正数加负数永远都不会有溢出

以八位的数据宽度举例

image-20230418103348342

mov ax,bx

如果说ax运算的结果是无符号数那么我们只看最终结果会不会超过0xFF,超过CF就为1

如果说ax运算的结果是有符号数那么我们看正数相加结果会不会超过0x7F,负数相加结果会不会少于0x80,超过OF就为1

方向标志DF

影响MOVS,STOS汇编指令使用时寄存器ESI,EDI的偏移方向,为0的时候地址向编号更大的位置增加相应宽度,为1的时候地址向编号更小的地方减少相应宽度

指令扩展

pushad

在调试程序的时候害怕打乱程序原有堆栈运行,利用当前指令临时存放堆栈结构开辟新的堆栈进行测试

image-20230417155645869

image-20230417155846191

popad

调试结束以后恢复原有的堆栈

ADC

带进位的加法

ADC dest, src

其中dest和src都是操作数,可以是寄存器、内存单元或立即数。执行ADC指令时,会将src的值加上dest的值和进位标志CF的值,然后将结果保存在dest中

1
2
3
如果要处理无符号整数,则使用ADD指令。
如果要处理带符号整数且需要考虑进位,则使用ADC指令。
ADC指令的操作结果还受到标志寄存器中CF(Carry Flag)标志位的影响,因为它可以表示上一次操作是否有进位发生。

SBB

带借位的减法

image-20230418125546237

image-20230418125605721

XCHG

交换数据,两边不能同时为内存,宽度要一致

xchg eax,ecx交换两个寄存器的值

MOVS

移动数据,内存–>内存,把寄存器esi,edi的值作为内存编号,取出esi内存编号的值放入edi中

movs可以有三种简写方式

1
2
3
movsb	=		movs byte ptr es:[edi],byte ptr ds:[esi]
movsw = movs word ptr es:[edi],word ptr ds:[esi]
movsd = movs dword ptr es:[edi],dword ptr ds:[esi]

image-20230418142655403

image-20230418142916880

image-20230418143112775

STOS

将AL,AX,EAX的值存储到EDI指定的内存单元,由宽度决定移动的是那个寄存器

1
2
3
stosb	=		stos byte ptr es:[edi]
stosw = stos word ptr es:[edi]
stosd = stos dword ptr es:[edi]

REP

按照寄存器ECX中指定的次数重复执行后续字符串指令

rep stos dword ptr es:[edi]