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) (조사할 것)
Overhead란?
함수 호출시 반드시 필요한 영역이나 불필요한 코드들이(push, call등등) 추가되어 main()에서 피호출함수의 코드를 삽입하여 수행할 때 보다 수행속도가 느려지고 더 많은 메모리를 차지한다.
비유: 벽돌을 쌓을 때 본인이 직접 쌓지 않고 인부를 불러 쌓도록 시키는 일 (호출)
Overhead를 줄이려면 함수호출을하지 않고 main()에 넣는 것이다. 몇 번 호출 되지 않는 함수라면 함수를 만드는 것 보다 main()에 넣는 편이 수행속도와 코드사이즈, Stack사이즈등 여러 가지로 좋다.
함수호출시 인자가 있으면 인자를 넣고 종료시 빼는(add esp, [변수갯수*4]) 동작을 하니 인자를 없애고 전역변수를 사용하는 편이 빠름.
★구조체를 사용하면 효율적이다.
Mobile |
★ARM Compile시엔 함수 인자를 4개 이상 하지 말 것.
ARM은 함수 호출 시 인자4개와, (16Bytes)
이전 함수의 ebp, (4Bytes)
return주소 (4Bytes)
ARM CPU내부에는 함수 호출시 필요한 호출함수의 ebp와 리턴주소, 인자4개를 저장하기 위한 레지스터가 준비되어 있다.
인자가 4개이하인 경우 컴파일러는 인자를 내부 레지스터에 저장하지만 5개를 넘어서면 내부/외부RAM에 저장을 한다.
레지스터는 CPU패키지 내부에 위치하고 있어 외부잡음에 의한 영향을 적게 받아 속도를 높일 수 있고,
아무래도 전송거리가 짧다 보니 또한 더 속도를 높일 수 있다.
상기와 같은 이유로 함수의 인자를 4개로 제한하여 stack을 내부 레지스터에 둔 경우가 함수 호출시 조금의 시간지연이 줄어 어플리케이션에서 함수호출을 많이 할 수록 인자를 5개이상 넘겨 stack을 RAM에 둔 경우보다 훨씬 빠른 동작을 한다.
참 조 (reference)
병원 다녀 온 후로 몸 상태가 좋지 않아 일단 노트필기한 것을 올리고 참조하여 작성할 것.