2011년4월29일...함수호출/stack 복습, mobile, overhead, entry code, exit code, MASM 첫 실습 입출력 예제분석

 

복 습 (reviewing)

○함수호출 시 백업
○임베디드C p.28 예약어에서, (test (4, 3)은…)
-cdecl => push 3, push 4
-stdcall => push 4, push 3 (win32 api) (조사할 것)

image image

Overhead란?
함수 호출시 반드시 필요한 영역이나 불필요한 코드들이(push, call등등) 추가되어 main()에서 피호출함수의 코드를 삽입하여 수행할 때 보다 수행속도가 느려지고 더 많은 메모리를 차지한다.
비유: 벽돌을 쌓을 때 본인이 직접 쌓지 않고 인부를 불러 쌓도록 시키는 일 (호출)

Overhead를 줄이려면 함수호출을하지 않고 main()에 넣는 것이다. 몇 번 호출 되지 않는 함수라면 함수를 만드는 것 보다 main()에 넣는 편이 수행속도와 코드사이즈, Stack사이즈등 여러 가지로 좋다.

함수호출시 인자가 있으면 인자를 넣고 종료시 빼는(add esp, [변수갯수*4]) 동작을 하니 인자를 없애고 전역변수를 사용하는 편이 빠름.

★구조체를 사용하면 효율적이다.

 

 

Mobile

 

★ARM Compile시엔 함수 인자를 4개 이상 하지 말 것.
ARM은 함수 호출 시 인자4개와, (16Bytes) 
          이전 함수의 ebp, (4Bytes) 
          return주소 (4Bytes)
          

image image

ARM CPU내부에는 함수 호출시 필요한 호출함수의 ebp와 리턴주소, 인자4개를 저장하기 위한 레지스터가 준비되어 있다.
인자가 4개이하인 경우 컴파일러는 인자를 내부 레지스터에 저장하지만 5개를 넘어서면 내부/외부RAM에 저장을 한다.

레지스터는 CPU패키지 내부에 위치하고 있어 외부잡음에 의한 영향을 적게 받아 속도를 높일 수 있고,
아무래도 전송거리가 짧다 보니 또한 더 속도를 높일 수 있다.
상기와 같은 이유로 함수의 인자를 4개로 제한하여 stack을 내부 레지스터에 둔 경우가 함수 호출시 조금의 시간지연이 줄어 어플리케이션에서 함수호출을 많이 할 수록 인자를 5개이상 넘겨 stack을 RAM에 둔 경우보다 훨씬 빠른 동작을 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                         참 조 (reference)                       

 

 

병원 다녀 온 후로 몸 상태가 좋지 않아 일단 노트필기한 것을 올리고 참조하여 작성할 것.

 

 

 DSCN2666 DSCN2667

 

DSCN2668 DSCN2669