.386 .MODEL FLAT
PUBLIC _STST ;store status PUBLIC _LDST ;load status
.CODE
;cpu->mem _STST PROC NEAR32
PUSH EBP MOV EBP, ESP
PUSHFD ; EFL 임시저장 MOV EAX, [EBP-4] ;EFL이 변형되기 때문에 AND EAX, 0FFFFFEFFH ;TF(Trap Flag) 제거 MOV [EBP-4], EAX
MOV ESP, [EBP+8] ; ESP를 _EAX 위치로 이동 ADD ESP, 40
PUSHAD ;레지스터 값 push PUSH [EBP+4] ;EIP(return address) PUSH [EBP-4] ;push EFL
ADD ESP, 24 ; _ESP 위치로 가서
MOV EAX, EBP ADD EAX, 8 ; EBP로 부터 ESP를 찾아서 PUSH EAX ; old ESP-4 push
PUSH [EBP] ; old EBP push
MOV ESP, EBP ; Exit code POP EBP RET
_STST ENDP
; mem - > cpu _LDST PROC NEAR32
MOV ESP, [ESP+4] ;ESP=&context ( ESP를 context 위치로)
POPFD ;EFL = context.EFL
POP EAX ;EAX= OLD EIP ( old EIP를 EAX에 임시저장)
MOV EBX, ESP ;EBX= current ESP ( 현재 스택포인터를 EBX에 임시저장) MOV ESP, [ESP+12] ;ESP = OLD ESP ( ESP를 OLD ESP-4위치로 이동) PUSH EAX ;Save OLD EIP ( 백업해둔 EIP를 OLD ESP-8 위치(return address)에 넣음)
MOV ESP, EBX ;ESP = current ESP
POPAD ;메모리에서 레지스터들로 값 가져옴
MOV ESP, [ESP-20] ;ESP= OLD ESP (ESP 이동시킴) SUB ESP, 4
RET _LDST ENDP
END
|