윈도우즈 시스템 프로그래밍 10장 - 함수 호출 인자의 전달과 PUSH & POP 명령어 디자인
윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.
⦁ 입력에 대한 출력이 반환값으로 존재하면 함수 호출
⦁ 출력에 해당하는 값 없이 모듈화해 놓은 서브 루틴의 실행을 위한 호출은 프로시저 호출
함수 호출 인자의 전달방식
⦁ 성능 향상을 위해서 일부 전달인자들은 레지스터를 할당해서 이곳에 저장하도록 정의
⦁ 함수 호출시 전달되는 인자를 스택에 저장하자. 그 방식은 지역변수가 스택에 할당되는 방식과 동일하다.
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