push,pop指令补充:
push的是立即数:减4
push的是寄存器:减寄存器宽度
(不能push8位寄存器和内存)
pop指令同样不能pop8位容器
pop指令加几取决与后面容器宽度
pushad指令:
把八个通用寄存器存到堆栈
存完后可以随意修改值,使用寄存器(esp.ebp值不要修改)
popad指令:
在使用完寄存器后恢复寄存器原来的状态,保护现场
标志寄存器:
如何拆?
显示的c.p.a.z...等是拆好的
如果没拆好看到EFL的202
202对应的二进制形式为001000000010即对应c.p.a.z...
CF:
此时al为0xff再加一越位,进位的1到cf中 (不会到ah中)
PF:
例如:
AF:
位数一半的位置进位则变1
即32位时ffffffff
16位时ffff
8位时ff
进位时af会变一
注意:mov指令不影响标志寄存器
ZF:
xor指令是做异或运算,会影响标志寄存器的值(mov不会)对寄存器做xor运算是清零运算
SF:
最高位是相对于数据宽度而言。例如:al最高位为二进制数第8位,ax最高位为二进制数16位
OF:
溢出时为1不溢出时为0
注意:有符号时考虑OF,看OF变化
无符号位考虑CF,看CF变化
ADC指令:
例如:
在12ffc4中加2本来应变为3D,但CF的值为1也参与运算,变为3E.
SBB指令:
XCHG指令:
MOVS指令:
可以两边都是内存