728x90

 

함수호출에 의한 실행의 이동과 PC

- PC(Program Counter) 

    -> 다음 명령어의 주소값을 가지고 있음

    -> CPU는 PC가 가르키는 주소의 명령어를 실행함

- 함수 호출, 실행의 이동은 PC의 값을 변경하는 것

    -> CPU가 순차적으로 실행이 됐다고 느끼게끔 하면서 실행을 이동 시킴

- PC도 SP처럼 PC의 값을 저장하기 위해 LR(Link Regiseter)에 저장하고 LR도 백업을 위해 stack에 저장함

 

함수 호출 규약

- 어떻게 함수 호출을 정의할 것인지 어떻게 함수를 실행할 것인지 결정하는 요소

- 반환 하는 코드를 어떤 함수에 넣을 지 결정을 함

- 두 함수가 있다면 하나의 함수만 가지고 있어야 함

- 함수가 인자를 전달할 때 어디부터 전달하고 어디부터 채우는지도 맞춰야 함

- Calling Convention : 호출 규약

- Parameter in register : 인자를 레지스터에 저장하는가

    -> 레지스터가 명시되어 있는 호출 규약은 해당하는 레지스터에 저장이 되고 레지스터 수보다 인자가 많다면 나머지는 스택에 저장

    -> __fastcall은 인자 2개까지는 ecx, edx에 저장하고 나머지는 스택에 저장함. 레지스터를 사용하여 속도가 빨라지기 때문에 fastcall

    -> 64bit Windows에서는 8개의 레지스터를 활용해 인자를 저장하는데 그 중 절반에만 저장이 됨

        * rcx/xmm0 중 하나에 저장이되고 rdx/xmm1 중 하나에 저장이 되는 방식

    -> 64bit Linux에서는 14개의 레지스터를 활용해 인자를 저장

        * xmm0-7 : xmm0, xmm1, ... xmm6, xmm7

- Parameter order on stack : 인자 전달방식

    -> C : C언어 스타일 => 오른쪽에 전달되는 인자가 먼저 스택에 쌓임

- Stack cleanup by : 스택을 비우는 주체

    -> Caller : 호출자가 비움

    -> Function : 호출된 함수 내에서 비움

728x90

+ Recent posts