LISTORY

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

IT/윈도우 프로그래밍

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

LiStoryTeller 2018. 7. 8. 19:40


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.


이번에 정리할 내용은  함수 호출 인자의 전달과 PUSH&POP 명령어 디자인이다.


⊙ YouTube 강의 주소 ⊙ ☞ 함수 호출 인자의 전달과 PUSH&POP 명령어 디자인



함수 호출 인자의 전달과 PUSH&POP 명령어 디자인


저번시간에 말했듯이, 함수 호출을 생각하면 떠오르는 세가지가 있다.


1. 인자 전달

2. 지역변수

3. 실행의 이동


이번에 공부할 내용은 인자 전달 부분이다.


전달되는 인자도 지역변수와 마찬가지로 스택에 쌓는다. 지역변수와 라이프 사이클이 일치한다.



⊙ 함수 호출 인자의 전달 방식



※ 현재 그림을 보면 인자가 순서대로 스택에 들어가지만, 실제로는 역순으로 들어간다. (8,7)


여기서 해야하는 일은 다음과 같다.


1. sp가 가리키는 현재 위치에 전달되는 인자 값 저장


2. 그 다음 sp를 증가시켜 두번째 전달인자도 받을 수 있게 한다.


이를 명령어로 디자인해보자


1. 인자값 저장


7을 sp가 가리키는 메모리 번지에 저장해야 한다.


저장하면 앞서 배웠던 명령어 STORE가 떠오른다. LOAD 명령어는 메모리를 읽고 STORE는 메모리에 데이터를 저장한다.


여기서 STORE 명령어를 쓰면  


STORE 7, sp


이와 같이 명령어가 구성된다.


하지만 이렇게 하면 문제가 생긴다.


* 문제점


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


첫번째 문제는 대상 자리에 레지스터가 와야하는데 7이라는 숫자, 데이터가 온다는 것이다.


두번째 문제는 목적지에 메모리 주소가 와야하는데 레지스터 정보가 온다는 것이다.


해결하는 방법 쉽다. 단순히 생각하면 된다.


일단, 7이라는 숫자가 오면 안되고 레지스터가 와야하므로 7을 레지스터에 저장하여 전달하도록 하자.


예를 들면 r1에 저장하고 이 자리에 r1을 넣어주면 된다.


목적지에 메모리 주소값와야한다면 sp가 가지고 있는 값을 메모리에 저장해 주고, 이 메모리의 주소를 적어주자


즉, r1이 저장되어 있는 값을 메모리 주소에 저장해주면 된다.


그럼 r1이 가지고있는 값을 레지스터에 저장하는 명령어와 SP가 가지고 있는 값을 메모리에 이동하는 명령어 필요하다.


또한, 이것을 저장하는 STORE 명령어 필요하다.


즉, 세개의 명령어가 필요하다.



* 문제점 해결


STORE 7, sp


첫번째 명령어 : ADD r1, 7, 0

두번째 명령어 : STORE sp, 0x40

세번째 명령어 : STORE r1, [0x40]


이건 0x40번지의 값을 참조하여 그 주소로 가야하므로 인다이렉트 모드로 구성해야 한다.


그 후, 두번째 인자를 저장할 수 있도록 sp의 값을 증가 시켜야 한다.


ADD r1, 7, 0

STORE sp, 0x40

STORE r1, [0x40]

ADD sp, sp, 4


이 명령어 조합이 PUSH 명령어가 된다.



⊙ POP의 기능


ADD sp, sp -4 or SUB sp, sp, 4


그냥 sp의 값을 빼고, 그 값을 다시 sp에 넣어주면 된다.


여기서 4는 프레임 포인터의 값이 되어야 한다.















Comments