주소지정 방식(Addressing modes)
MIPS에서 32비트 주소나 상수값들을 어떻게 만들어 내는지,,
한 아키텍처에서 기계어가 각 명령어마다 operand를 만들어내는 방식
기계어나 그 외의 것에 포함된 레지스터/상수에서 가진 정보를 이용함으로써, operand의 메모리주소를 계산하는 방법을 기술한다.
주소지정방식의 갯수
Program Counter (PC)
lw $s0, 0($t1)
으로 $s0에 값을 적재할 수가 있다.[해결방안] IDEA : 반반씩 넣는다.
lui $s0, 61
: $s0의 상위 16비트에 61을 2진수로 변환한 바이너리를 load해준다.or연산
한다.ori $s1, $s0, 1200
: 1200을 2진수로 변환한 하위 16비트의 바이너리와 레지스터 $s0을 or연산
한다.j 10000 # go to location 10000 (= branch address 10000)
워드단위 주소접근은 실제 주소의 offset을 넣지않고 4bytes 단위의 offset을 넣어 그 offset에다가 4를 곱해주는 방식이다.
beq, bne(PC상대주소지정) 그리고 j(Pseudodirect addressing) 명령어가 워드단위 주소접근을 사용한다.
명령어는 4byte(=32bits)이기 때문에 번지수는 0000 0000 0000 0000 0000 0000 0000 0000, 0000 0000 0000 0000 0000 0000 0000 0100, 0000 0000 0000 0000 0000 0000 0000 1000 ⋯ 로 접근한다. 이를 보면 하위 2비트는 항상 00임을 볼 수 있다.
따라서 이 하위 두개의 비트를 아낄라면 이 부분은 생략하는게 낫다.
그럼 J-type의 형식에서 address주소는 26bits가 아니라 28bits를 표현할 수 있게 된다.
j 10000 # 40000번지의 주소로 점프하시오.
PC의 상위 4비트를 branch address에 넣는다.
j 명령어의 word address(26bits) 를 branch address에 넣는다.
그럼, 그 주소의 마지막에 00이 붙어 주소값은 28비트가 된다.
branch address 전체(32bits)를 PC에 복사한다.
메모리에 적재한다.
bne $s0, $s1, LOOP
혹은 beq $s0, $s1, EXIT
와 같이 LOOP, EXIT처럼 Lable로 표시했었는데 실제 기계어는 못알아먹으므로 이런방식으로 처리하지 않는다.
정말 정리를 잘하신 것 같아요 ! 많은 도움이 되었습니다.