20140804 (Assembly procedure(함수 구현), call, ret, 지역변수, Entry Code, Exit Code)

116일차









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

Assembly

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




------- Procedure and Function


보통 void 형 함수를 Procedure(프로시저)라 부르고

return 값이 있는 함수는 Function이라 부르는데

굳이 구별하는 언어도 있고 하지 않는 언어도 있다.



--- 아래 예제 소스를 통해 함수 구현.











------- call Instruction


함수 호출, EIP를 Intel 에서는 건들 수 없지만

간접적으로 조작하는 명령어가 몇 가지 있는데

call 이 그 중 하나이다.


call 의 실행 순서

1. push   eip

2. mov   eip ,  함수 주소




near 은 32 bit 주소 체계

far 은 64? bit 주소 체계


relative 는 현재로 부터 얼마나 떨어졌는지,

indirect 는 포인터 같은 개념이고,

direct 는 그 주소를 바로 가리킨다.




--- 위의 소스를 예제로 어떻게 돌아가는지 자세히 보기로 한다.




1. EIP를 보면 다음 실행 주소가 _start의 시작 주소이다.


2. 시작 주소(0x0040103E)를 보면 E8 CD FF FF FF (call Initialize)를 실행한다.


3. E8은 call 명령어에 operand 값이 near relative를 가리키는데

현재부터 얼마나 떨어져 있는지를 가리킨다.


4. Little Endian 이니 FF FF FF CD -> -51 만큼 떨어져 있다는 소리인데

어디서부터 떨어졌는지 기준점은 다음 실행 주소이니

다음 실행 주소 0x00401043으로 부터 -51(-0x33) 만큼 빼면 0x00401010이다.


5. 그래서 Initialize 가 실행된다.








------- ret Instruction





ret 는 다음을 수행한다.

- pop eip


ret   0   (C에서는 반환 값을 return 뒤에 넣는데,

Assembly에서는 무슨 sp?뭐시기 al 뭐시기 뭔 값이 들어간다고

C에서 하는 반환 값과는 좀 다르다고 하는데 아직은 잘 모르겠다.)







다음 실행 주소가 저장된다.










------- 지역변수



위의 그림과 같이 인수가 뒤에서 부터 스택에 들어간다.

인수가 많으면 많을수록 스택도 많이 차지하고 느려진다.

따라서 최적화를 위해선 구조체를 선언하여 그 주소 값을 넘기는 형식으로 하면 좋다.







------- Entry Code , Exit Code





- Entry Code

   함수 호출시 stack 확보 등 준비 코드


- Exit Code

   함수 해제시 stack 해제 등 마무리 코드








--- 예제를 통해 C에서 ASM 함수를 호출



- main.c




- main.c의 중간 .asm 파일




- smart()함수가 정의 된 smart1.asm




- 메모리 구조




return 값은 eax에 저장되어 있다.


main.asm에 call 명령어 다음에 add esp, 12 가 뭘 의미하는지 몰랐는데

smart() 함수를 호출 후 원래 esp 위치로 돌려주는 역할이다.






설정

트랙백

댓글