==================================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 code와 exit 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파일을 합쳐서 프로그램을 만들어보자.
|
'Busan IT > Assembly' 카테고리의 다른 글
EFL값 보존 후 레지스터 출력, 테스크 스위칭을 위한 레지스터 값 보존 (0) | 2015.10.13 |
---|---|
pushad를 활용한 레지스터 출력 (0) | 2015.10.12 |
함수의 호출과 작동 원리 (0) | 2015.10.05 |
pop, pushad 명령어 (0) | 2015.10.02 |
확장/반복문, Procedures (0) | 2015.10.01 |