目录
一.push和pop指令
1.push+立即数
无论立即数多大,地址都是减4
运行前
运行后
可以得出结论是正确的,地址减4。
2.push+16位寄存器/word
这时如果寄存器为16位,则地址减2。
运行前
运行后
3.push+32位寄存器/dword
同push+立即数一样,地址减4,而且push没法加上8位寄存器
运行前
运行后
4.pop+……
pop指令和push相反,pop是地址+push是地址-
二.pushad和popad
PUSHAD也叫保护现场,就是把我们的寄存器压入栈中
pushad是把eax,ecx,edx,ebx,esp、ebp,esi,edi依次压入栈中,ESP会减少32POPAD也叫还原现场,将栈中存储的寄存器值返还给寄存器
与PUSHAD顺序相反,将栈中数据弹出,依次传给EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX
pushad运行前
运行后
可以发现 eax,ecx,edx,ebx,esp、ebp,esi,edi中的值被压入栈中。
popad运行前
运行后
可以看见这些值又返回了。
三. 标志寄存器
1.进位标志CF
如果运算结果最高位产生了一个进位或错位,那么,其值为1,否则其值为0。
运行前
运行后
可以发现CF并没有发生变化,这是因为最高位没有 发生变化。
运行前
运行后
这个时候CF的值变成了1,因为这是8位,最高位发生变化。
2.奇偶标志PF
用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
运行前
此时,eax中的值末尾为3。
加3之后,为6,是1的偶数,所以P的值变为1。
3.辅助进位标志AF
在发生下列情况时,辅助进位标志AF的值被置为1,否则为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时;
运行前
运行后
4.零标志ZF
如果运算结果为0,则其值为1,否则为0。
5.符号标志SF
它与运算结果的最高位相同。
6.溢出标志OF
如果运算结果超出当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则为0。
规律
运行前
运行后
因为7F为最大的数,所以加2后变为负数,溢出。