함수 호출 인자의 전달방식
전달되는 인자가 함수 내에서는 유효하고, 함수 호출이 끝나면 사라지는것으로 봐서 지역변수처럼 스택에 할당된다고 할 수 있다. 그러나 모든 전달인자들이 반드시 스택에 할당되는 것은 아니다. 성능향상을 위해 일부 전달인자들은 레지스터에 저장하는 경우도 있다.
PUSH & POP 명령어 디자인
"SP가 가리키는 현재 위치에 전달되는 인자값을 저장하고 나서, SP를 증가시켜 다음 메모리 주소를 가리키게 한다."
이와 같은 인자 전달 연산을 위해 명령어를 구성해 보자.
STORE 명령어는 레지스터에 저장된 데이터를 메모리에 저장하는 명령어이다.
STORE 대상(레지스터), 목적지(메모리 주소)
prob1) 명령어 조합을 통해서 숫자 7을, SP가 가리키는 메모리 위치에 저장하라.
1.숫자 7을 레지스터에 저장한다. 이후 레지스터를 STORE의 피연산자에 숫자 7의 값을 가지고 있는 레지스터를 넣을 수 있다.
ADD r1, 7, 0
이제 r1을 피연산자로 둘 수 있다.
2.SP가 주소 정보를 담고 있어야 한다. 이때 Indirect 모드를 사용한다.
STORE SP, 0x40 명령어를 통해 SP에 0x40을 대입한다.
3.Indirect모드를 통해 0x40번지를 참조하여 데이터를 저장할 수 있다.
STORE r1,[0x40]
"숫자 7을 SP가 가리키는 메모리 위치에 저장하라"의 명령어 구성은
ADD r1, 7, 0
STORE sp, 0x40
STORE r1, [0x40]
으로 구성할 수 있다.

위과정 이후 반드시 SP레지스터 값을 증가시켜야 한다. 다음에 들어오는 데이터를 저장하기 위해서다.
ADD sp, sp, 4
최종적인 명령어 조합은 아래와 같다.
ADD, r1,7,0
STORE sp, 0x40
STORE r1, [0x40]
ADD sp, sp, 4
PUSH & POP

왼쪽 그림은 명령어 PUSH이다. 데이터를 스택에 넣고자 하는 경우 사용한다.
ex) "PUSH 0x02" or "PUSH r1"
SP값을 참조하여 해당 위치에 데이터 0x02 or r1의 값을 저장하고 SP의 값 또한 자동으로 증가시키는 명령어이다.
오른쪽 그림은 명령어 POP이다. 스택에 가장 마지막에 들어간 데이터를 꺼낸다는 것은 메모리에서 삭제함을 의미한다. 즉 SP를 감소시키는 것이다. 32bit 환경에서 SP의 증가와 감소는 4바이트 단위로 이루어진다.
POP 명령어와 같은 일을 하는 명령어는 다음과 같이 구성할 수 있다.
"ADD sp, sp, -4" or "SUB sp, sp, 4"
C코드를 어셈블리 코드로 바꾸기


1.PUSH fp를 통해 이전 스택 프레임 포인터를 스택에 저장한다.
2. ADD fp, sp, -4는 1.의 PUSH fp를 통해 SP가 4 만큼 증가되어 있으므로 -4한 값을 fp에 저장한다.
3.PUSH 7
4. PUSH 8
3.PUSH 7과 4.PUSH 8은 각각 함수의 전달인자로 넣어준다.
'Programming > Windows System Programming' 카테고리의 다른 글
함수 호출 규약 (0) | 2020.07.18 |
---|---|
함수 호출(Procedure Call)에 의한 실행의 이동 (0) | 2020.07.18 |
컴퓨터 구조 세번째(1) (0) | 2020.07.15 |
스케줄링 알고리즘과 우선순위 (0) | 2020.07.13 |
파이프 방식의 IPC (0) | 2020.07.12 |