0x1

pushad是一个汇编指令,它的作用是把eax、ecx、edx、ebx、esp、ebp、esi和edi这8个寄存器当前的值压入堆栈。

现在寄存器和堆栈的数据:

图1

当我执行pushad以后:

图2

8个通用寄存器的值就被压入堆栈了,压入堆栈以后就可以随意使用eax、ecx、edx、ebx、esi和edi这6个寄存器。esp和ebp这两个堆栈寄存器千万千万不能乱动。乱改以后堆栈就乱了。

我现在随意使用另外6个寄存器,使用mov指令把eax到edi这6个寄存器的值分别设置为0xA到0xF:

1
2
3
4
5
6
mov eax,0xA
mov ecx,0xB
mov edx,0xC
mov ebx,0xD
mov esi,0xE
mov edi,0xF

图3

0x2

popad是和pushad相反的一个汇报指令,它的作用就是把堆栈中的后8个元素弹出到8个通用寄存器里面:

图3是任意使用寄存器以后的堆栈和寄存器的状况。

然后执行popad指令:

图4

可以发现寄存器和堆栈都已经复原到了图1时的状态,堆栈指针也回退到0x12FFC4。