윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 10장 - 함수 호출 인자의 전달과 PUSH & POP 명령어 디자인

111-000-111 2021. 7. 31. 19:03

 

 

 

윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 

 


 

 

 

 

⦁ 입력에 대한 출력이 반환값으로 존재하면 함수 호출

⦁ 출력에 해당하는 값 없이 모듈화해 놓은 서브 루틴의 실행을 위한 호출은 프로시저 호출

 

 

 

 

함수 호출 인자의 전달방식

 

⦁ 성능 향상을 위해서 일부 전달인자들은 레지스터를 할당해서 이곳에 저장하도록 정의

⦁ 함수 호출시 전달되는 인자를 스택에 저장하자. 그 방식은 지역변수가 스택에 할당되는 방식과 동일하다.

 

 

 

PUSH & POP 명령어 디자인

 

⦁ 4장에서 정의한 명령어와 레지스터 셋을 기반으로 PUSH와 POP 명령어를 디자인하자.

⦁ STOR 명령어는 레지스터에 저장된 데이터를 메모리에 저장하는 명령어로 아래와 같은 구조를 가진다.

STORE                대상(레지스터),                목적지(메모리 주소)

 

⦁ 숫자 7을 현재 sp 레지스터가 가리키는 곳에 저장하고자 할때 STORE 7, sp라고 구성하면 안된다.

왜냐하면 첫 번째 피연산자는 레지스터가 와야하고, 두 번째 피연산자에는 메모리 주소 정보가 와야한다.

 

⦁ 첫 번째 문제의 해결법

숫자 7을 r1이라는 임의의 레지스터에 저장하여 7 대신 r1을 피연산자로 둘 수 있다.

이를 어셈블리어 명령어로 구성하면 아래와 같다.

ADD                r1,        7,        0
STORE              r1,       sp

 

⦁ 두 번째 문제의 해결법

Indirect 모드를 통해 해결하고자 하니 sp가 가지고 있는 값을 0x40번지에 저장하고 Indirect 모드로 참조하면 아래와 같이 구성된다.

STORE              sp,       0x40
STORE                sp,        [0x40]

 

그런데 스택에 데이터를 저장한 다음에는 반드시 sp 레지스터 값을 증가시켜야 한다.

저장된 데이터가 4바이트이고, 스택은 위로 올라갈수록 메모리 값이 증가한다고 가정했다.

따라서 아래와 같이 명령어를 구성할 수 있다.

ADD        sp,        sp,        4

 

최종적으로 명령어를 조합하면 아래와 같다.

ADD                r1,        7,        0
STORE              sp,       0x40
STORE                sp,        [0x40]
ADD        sp,        sp,        4

 

매 번 명령어를 위와 같이 조합해서 사용하는 것은 프로그래머에게 부담이 되므로 PUSH와 POP 명령어를 추가하는 것이 바람직하다.

 

 

PUSH

스택에 데이터를 넣고자 하는 경우는 아래와 같은 형태로 사용하면 된다.

PUSH        0x02
또는
PUSH        r1

 

POP

스택에 가장 마지막에 들어간 데이터를 꺼내는 명령어이다. 즉, sp 레지스터에 저장된 값을 감소시키면 된다.

ADD        sp,       sp,        -4
또는
SUB         sp,       sp,         4