Busan IT/Assembly2015. 10. 13. 09:07

==================================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

.MODEL FLAT

PUBLIC _stst
PUBLIC _ldst    ; '_stst''_ldst'함수 외부 접근 허용 코드

.code

_start:  

_stst   PROC   NEAR32  ;store status

    ; - 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 사용한 인자의 크기만큼 옮긴다.

  
  _stst ENDP

  _ldst   PROC   NEAR32  ;

    ; - entry code -
    push  ebp    
    mov   ebp, esp

    ; - exit code -
    mov  esp, ebp
    pop  ebp
    ret ;pop eip

  _ldst ENDP




반응형
Posted by newind2000