Busan IT/Assembly2015. 10. 6. 16:35

==================================Outline====================================

Procedure 필수코드 

C의 obj파일과 asm의 obj파일 합치기

----------------------------------------------------------------------------

Procedure 필수코드 


교재 p/213

 

Using parameter values passed on stack 예제

함수의 인자를 삽입한 코드를 다시 보자.

 

push 300 ;함수에 넣는 인자, cdecl형식임으로 우에서 좌로 스택에 담긴다.

push 200

push 100

 

call _smart ;함수의 호출

 

push ebp ;스택에 main의 ‘ebp'주소 삽입

 

/*** 변수가 있을 때만 적용되는 코드 ***/

mov ebp, esp ;ebp == esp

sub esp, 12 ;변수선언, 4*3byte 공간 확보

 

//C언어의 함수가 Assembly로 옮겨지면 되면 ‘_’를 붙혀 이를 구분한다.

 

스택은 끝번지에서 시작번지로 영역이 확장되기 때문에 지역변수를 만들 때 먼저 만들어진 변수가 끝번지에 가까운 곳에 위치해 있다.

 

entry codeexit code의 함수가 종료될 때 스택을 복구하기 위해서이다.

 

함수를 호출하면 최소 8byte의 스택을 사용하게 된다. 이를 오버헤드(overhead)라고 한다.

 

//overhead간접비라는 뜻을 가진다. 즉 함수를 사용하기 위한 부대비용이다.

 

//아래는 함수의 overhead code

//push esp

//mov ebp, esp

 

때문에 짧은 코드를 함수로 만드는 것은 프로그램의 효율성을 떨어뜨린다.

 

mov esp, ebp

pop esp

ret 0

 

 

_cdecl은 호출한 함수에서 스택을 복구 시키기 때문에 아래의 코드가 추가된다.

 

add esp, '(양수)빠져나온 함수에서 사용한 스택의 크기

 

이에 반해 _stdcall'ret'을 사용하여 호출된 함수에서 스택을 복구 한다.

 

ret '스택함수 크기

 

 

enter 명령어

enter localBytes, nestingLevel

 

[해석]

push ebp

mov ebp, esp

sub esp, localBytes

 

INVOKE ExitProcess, 0

 

[해석]

push +00000000h

call ExitProcess


C의 obj파일과 asm의 obj파일 합치기 


C에서 작성한 프로그램과 어셈블리에서 작성한 프로그램을 합치는 작업을 해보겠다.

 

asm 파일에서 함수의 기본형

C에서 return 값은 어셈블리의 레지스터 EAX에 들어간다.

 

어셈블리 파일과 C파일을 합쳐서 프로그램을 만들어보자.

[main.asm]

.386

.MODEL FLAT

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

.code
  ; ***함수 기본형***
  _smart   PROC   NEAR32

    ; - entry code -
    push  ebp    
    mov   ebp, esp
    
    mov eax, 100

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

  

  _smart ENDP




END


[smart.c]

#include <stdio.h>

int smart(void);



int main(void)
{
  int A = smart();
  printf("A의 값은 %d입니다.\n", A);  

  return 0;
}


반응형
Posted by newind2000