매개변수가 여럿 있는 경우
pha, pla

pha: A 레지스터 값을 스택에 push 할 때 사용
- A 레지스터 값을 스택으로 push
- 스택 포인터 1 감소
pha — Push Accumulator
모드:
i| opcode:$48| 바이트: 1 | 사이클: 3
pla: 스택에서 A 레지스터로 pop 할 때 사용
- 스택에서 A 레지스터로 pop
- 스택 포인터 1 증가
pla — Pull Accumulator
모드:
i| opcode:$68| 바이트: 1 | 사이클: 4
상세 동작표: pha

묵시적 주소지정 모드로 동작한다.
| 클럭 | 주소 버스 | PC++? | 데이터 버스 | 외부 연산 | 내부 연산 |
|---|---|---|---|---|---|
| 1 | offset 0 | 증가 | $48 | Fetch $48 | |
| 2 | offset 1 | opcode2 | Fetch opcode2 | Decode $48 | |
| 3 | $01FF | A | Push A | 스택 포인터 감소 | |
| 4 | offset 1 | 증가 | opcode2 | Fetch opcode2 |
- 클럭 1:
pha의 opcode$48을 Fetch한다. - 클럭 2:
$48을 Decode하면서 다음 명령어의 opcode를 미리 읽는다. 피연산자가 없으므로 바로 다음 주소를 읽는다. - 클럭 3: 주소 버스에 스택 주소를 놓고 A 레지스터 값을 스택에 Push한다. 스택 포인터가 감소한다.
- 클럭 4: 다음 명령어의 opcode를 Fetch한다. 파이프라인으로 겹치므로
pha는 3사이클로 계산한다.
상세 동작표: pla

묵시적 주소지정 모드로 동작한다.
| 클럭 | 주소 버스 | PC++? | 데이터 버스 | 외부 연산 | 내부 연산 |
|---|---|---|---|---|---|
| 1 | offset 0 | 증가 | $68 | Fetch $68 | |
| 2 | offset 1 | opcode2 | Fetch opcode2 | Decode $68 | |
| 3 | $01FE | byte | Fetch byte | 스택 포인터 증가 | |
| 4 | $01FF | byte | Fetch byte | ||
| 5 | offset 1 | 증가 | opcode2 | Fetch opcode2 | A = byte |
- 클럭 1:
pla의 opcode$68을 Fetch한다. - 클럭 2:
$68을 Decode한다. - 클럭 3: 현재 스택 포인터가 가리키는 주소에서 값을 읽지만 무시된다. 스택 포인터가 증가한다.
- 클럭 4: 증가된 스택 포인터 주소에서 실제 값을 Fetch한다.
- 클럭 5: 다음 명령어의 opcode를 Fetch하면서 A 레지스터에 값을 저장한다. 파이프라인으로 겹치므로
pla는 4사이클로 계산한다.
pla가pha보다 1사이클 더 걸리는 이유스택 포인터가 다음 빈 위치를 가리키기 때문에, top을 읽으려면 스택 포인터를 먼저 증가시키는 데 1사이클을 추가로 소모한다.
매개변수가 여럿 있는 경우


호출자(caller)가 인자를 차례대로 스택에 push하고, 함수에서는 그 인자를 반대순서로 pop하여 사용한다.
예: func(10, 20, 30)

방법 1: 인자를 왼쪽에서 오른쪽으로 push하는 경우 (10 → 20 → 30)
- 함수 안에서는 30, 20, 10 순서로 pop된다.

방법 2: 인자를 오른쪽에서 왼쪽으로 push하는 경우 (30 → 20 → 10)
- 함수 안에서는 10, 20, 30 순서로 pop된다.

호출 규약
호출자와 함수 사이에 순서에 대한 합의가 있어야 한다. 함수가 인자들을 언제나 확실히 찾을 수 있어야 한다. 규약만 동일하면 어느 방법이든 문제없다.
예: 매개변수가 여럿 있는 경우

오른쪽에서 왼쪽으로 넣는 규약을 사용한다.
lda #3→pha→lda #2→pha→lda #1→jsr func순서로, 함수 안에서는 왼쪽부터 오른쪽 순서(1, 2, 3)로 접근할 수 있다.

우선 스택에서 회귀 주소를 먼저 pop해 임시 저장하고, 그 아래의 인자를 pop한다.

인자는 왼쪽에서 오른쪽 순(pla ; 1 → pla ; 2 → pla ; 3)으로 pop하여 사용한다.
인자 3개와 회귀 주소를 모두 스택에 복구한 뒤 rts로 돌아간다.
rts에서 회귀 주소가 pop되어 스택 포인터는 2 증가하지만, 인자 3개는 여전히 스택에 남아있다.

호출자가 pla를 3번 호출해서 스택에 넣은 인자를 제거한다.
호출자가 스택을 정리하는 것도 호출 규약
이 예에서는 호출자가 스택을 정리하지만, 함수 내부에서 정리하는 규약도 있다.