在x86中有8个32位寄存器 EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
其中ESP和EBP涉及函数的entry和exit的操作,一般不用于应用程序级的编程。
剩下的6个寄存器分成两种:
1 EBX,ESI,EDI为必须受保护寄存器,使用前要push,使用后要pop
2 EAX,ECX,EDX可以供编程自由临时使用。
EDI和ESI不可进行字节级操作,但可以使用DI和SI(为EDI和ESI的低16位)
成套使用的指令:PUSHAD,POPAD PUSHFD,POPFD
内存中的数据互相拷贝不可以直接用
! mov mVar, lpMem ; this fails, no opcode to do it.
因为x86没有对应的操作符。
可以考虑这两种方案
1 通过空闲的寄存器
! mov eax, lpMem ; copy memory value into register.
! mov mVar, eax ; copy register into memory value.
2 通过stack,但慢一些
! push lpMem ; push memory value onto the stack.
! pop mVar ; pop it back off as another memory value.
STACK使用
当进行压栈操作PUSH时,首先是将栈指针ESP减小操作数的大小,然后将操作数 的数值存入堆栈。出栈操作POP反之。
要注意stack的平衡性 也就是push和pop的数据的占用的字节数一致(大多数情况下是必须的)。
但可以这样使用。
PUSH eax
...
...
pop ax
pop cx