$t0에 4000000을 넣을 때 어떻게 넣으면 될까?
addi를 사용하기엔 넣을 수 있는 값이 16bit이므로 400만을 나타낼 수 없다.
이 때, lui와 ori를 사용할 수 있다.
Load Upper Immediate | $t0 = 255 << 16 | lui $t0 255 |
OR Immediate | $t0 = $t0 | 255 | ori $t0 $t0 255 |
j 명령어의 경우 주소값으로 26비트로 나타낼 수 있고, bne 명령어의 경우 주소값으로 16비트를 나타낼 수 있다.
32비트와 같이 큰 주소값을 어떻게 나타낼 수 있을까.
먼저, 주소값은 4의 배수이므로, 마지막 비트 2개는 항상 0이다. 따라서 마지막 비트 2개를 없이, 다시 말해서 word 단위로 저장하면 4배 더 큰 메모리 주소 공간을 표현할 수 있다.
16비트로 저장되는 I-type 명령어의 경우에는 대상 주소가 현재 명령어의 주소인 PC를 기준으로 지정된다. 즉 워드 단위의 분기 주소(branch offset)로 저장된다. 따라서 I-type 명령어를 통해 점프할 때는 PC = (PC+4) + (워드 단위의 분기 주소 * 4) 가 된다.
26비트로 저장되는 J-type 명령어의 경우에는, PC의 상위 4비트와 26비트의 분기 오프셋에 4를 곱한 값과 XOR 연산하여 대상 주소가 정해진다.
쉽게 말해서, PC의 상위 4비트와 branch offset의 26비트가 합쳐진 것을 좌측 쉬프트 연산 2번한 것이 target address가 된다.
Addressing mode - 주소 지정 방식은 명령어가 피연산자를 식별하는 방법을 뜻한다. 그 방법에는 여러가지가 있다.
Immediate addressing: 피연산자가 명령어 자체에 포함되어 있음. - addi $t1, $s1, 10 에서 10은 바로 피연산자로 사용됨
Register addressing: 레지스터 주소 지정은 레지스터에 저장된 값이 직접 사용됨 - add $t1, $s1, $s2 에서 $s1과 $s2에 저장된 값이 피연산자로 사용된다.
Base addressing: 베이스 레지스터와 오프셋 값을 사용하여 베이스 주소를 지정하는 방식 - lw $s1, 4($s0) 은 $s0이 가리키는 주소로부터 4바이트 뒤의 데이터를 읽어와서 $s1에 저장함. 여기서 4($s0)은 베이스 레지스터인 $s0에 offset 4를 더해서 메모리 주소를 계산하는 베이스 주소 지정 방식이다.
PC-relative addressing: PC를 기준으로 상대적인 거리에 있는 주소로 지정 - beq $s1, $s2, 4 에서 $s1과 $s2가 같으면 현재 PC로부터 4를 더한 곳으로 간다.
Pseudo-direct addressing: J명령어에서, 현재 PC의 상위 4비트 + J명령어의 인자 26비트 + 00 이 합쳐진 곳이 대상 주소가 됨
'학교강의필기장 > 컴퓨터구조' 카테고리의 다른 글
컴퓨터구조[10]: Datapath, Datapath Elements (0) | 2023.04.09 |
---|---|
컴퓨터구조[9]: MIPS 구조 요약 (0) | 2023.04.09 |
컴퓨터구조[7]: 프로시저 프레임과 메모리 공간 (0) | 2023.04.09 |
컴퓨터구조[6]: 함수(프로시저)와 스택 포인터 2 - 재귀함수에서의 어셈블리 (0) | 2023.04.09 |
컴퓨터구조[5] : 함수(프로시저)와 스택 포인터 1 (0) | 2023.04.09 |