==================================Outline====================================
EFL값 보존 후 레지스터 출력
테스크 스위칭을 위한 레지스터 값 보존
----------------------------------------------------------------------------
EFL값 보존 후 레지스터 출력
가장 먼저 ‘pushfd’명령어를 사용하여 eflags를 보존시킨 후 obj구조체에 EFL을 삽입하여 보자.
어셈블리코드는 한 줄이라도 짧게 코딩해야 한다.
총 12줄이 사용된다.
.386
.MODEL FLAT
PUBLIC _smart ; '_smart'함수 외부 접근 허용 코드
.code
_start:
_smart PROC NEAR32
; - entry code -
push ebp
mov ebp, esp
pushfd
mov esp, [ebp+8] ;esp obj로 이동
add esp, 40 ;esp obj 가장 아래로 이동
pushad ;eip와 efl을 제외한 모든 레지스터 구조체에 삽입
push [ebp-4] ; eflags삽입
push [ebp+4] ; eip삽입
add esp, 20 ; 구조체의 esp자리로 내려온다.
mov eax, ebp ; main의 esp를 구조체의 넣기 위해 레지스터 eax를 사용한다.
add eax, 8 ; eax를 main의 esp가 있는 자리로 옮겨준다.
;12가 아닌 8인 이유는 esp는 마지막 변수를 가리키고 있기 때문이다.
mov [esp], eax ; 구조체 esp에 main의 esp를 넣어준다.
push [ebp] ; 구조체 ebp자리에 main의 ebp를 넣어준다.
;mov eax, [esp+20] eax에는 return값이 들어감으로 복구시킬 필요가 없다.
; - exit code -
mov esp, ebp
pop ebp
ret ;pop eip
;메인 함수에서의 복구
;add esp, 4 ;함수의 인자 자리를(&obj) 복구 시키기 위해 esp 사용한 인자의 크기만큼 옮긴다.
_smart ENDP
테스크 스위칭을 위한 레지스터 값 보존
테스크 스위칭(Task Switching): 프로그램간의 변경을 일컫는다.
CPU가 하나일 경우 여러 가지 프로그램을 동작시키기 위해서는 이전 프로그램의 CPU정보를 저장해야 한다. 이 때 CPU의 정보를 가능한한 간단하게 저장시켜야 한다.
레지스터를 출력하는 함수를 따로 만들어 보자.
'_smart'함수를 '_stst'함수, store state로 바꾸고 '_ldst' 함수를 만들어 entry code와 exit code를 적어 놓는다. 또한 레지스터가 한 줄에 두줄 씩 출력되도록 코딩한다.
.386 |
'Busan IT > Assembly' 카테고리의 다른 글
메모리 출력 프로그램 #1 (0) | 2015.10.15 |
---|---|
stst(store state), ldst(load state) (0) | 2015.10.15 |
pushad를 활용한 레지스터 출력 (0) | 2015.10.12 |
Procedure 필수코드, C의 obj파일과 asm의 obj파일 합치기 (0) | 2015.10.06 |
함수의 호출과 작동 원리 (0) | 2015.10.05 |