[컴퓨터 구조] - 5. Addressing
[Argument가 4개 이상이면?]
- 초과하는 Argument들은 스택에 쌓아준다
EX) Argument가 6개일 때
1. Caller
- 6th argument : $sp , 5th argument : $sp - 4
2. Callee
- 6th argument : $sp - {frame크기} , 5th argument : $sp - {frame크기} - 4
[PC-relative addressing]
- TA = $pc + (offset * 4)
- beq로 어딘가로 점프할 때, $pc에는 beq다음 명령문의 주소를 저장한뒤에 점프한다.
- beq로 가능한 주소 범위(16비트) : -2^15 ~ 2^15 - 1
[Jump addressing]
- 어떤 주소로 점프하는 명령문이 있으면, 점프할 주소를 오른쪽으로 2비트 쉬프트 한 다음,
앞부분에 해당 명령문의 opcode를 붙인다.
EX1) $PC = 0xbadabee4이고, 0xbeef1004로 jump하고 싶을 때, MIPS instruction은?
Tip) 0xbeef1004를 오른쪽으로 2비트 쉬프트한다.
Ans)
① 0xbeef1004 = (맨앞의 b를 제외한 나머지 7자리 분석) 1110 1110 1111 0001 0000 0000 01(00)
② (오른쪽으로 2비트 쉬프트 후 J의 opcode 6비트를 앞에 붙여줌) (0000 10)11 1011 1011 1100 0100 0000 0001
③ 0x0bbbc401
※ 반대로, 0x08020040같은 명령어에서 TA를 추출하고 싶으면, 앞의 6비트를 빼고 왼쪽으로 2비트 쉬프트한다.
그러면 남은 것은 7바이트짜리가 될텐데, 그것의 맨 앞에 PC의 맨 앞 바이트를 붙여준다.
EX2) 0xdeafcaf0로 점프하고 싶을 때는?
TIP) 징검다리 건너듯이 진행한다.
[String processing]
-'lb' or 'lh'
-'lbu' or 'lhu'
-'sb' or 'sh'
[32비트짜리 데이터를 넣고싶을때]
① 왼쪽으로 16비트 쉬프트해서 주는 명령어 'lui' 를 사용 (앞의 4자리만 사용)
② 그 후, 'ori' 를 사용한다. (나머지 뒤의 4자리를 사용)