명령어 (17) - MIPS의 주소 지정

컴퓨터구조

2020. 5. 5. 09:57

1. 일부 바이트 Load - Store

  • lb / sb : 1바이트 로드/스토어
  • lh / sh : 하프워드 로드/스토어
  • 로드시 : 32비트로 extend 되어서 4바이트로 로드됨, 레지스터 크기가 32비트로 고정되어 어쩔 수 없음
  • 저장시 : rightmost 비트들만 잘라서 저장함 (sp 조금씩 움직이면서 바이트별로 저장 가능함)
  • 예를 들어 아래처럼 스택포인터를 한칸씩 내리면서 0001 86a0을 1바이트만 저장(sb)하면
  • rightmost로 잘라서 a0만 저장된다. 16진수는 4비트이기 때문에 16진수 2개인 8비트(1바이트)만 저장
  • 그리고 스택포인터를 1칸 움직이고, 다시 같은 값을 저장하면 그 바로 옆에 a0a0와 같이 저장된다.
.text
.globl main

main:
	li $t0 100000		# 0001 86a0 
	addi $sp $sp -1
	sb $t0 0($sp)
	addi $sp $sp -1
	sb $t0 0($sp)
	addi $sp $sp -1
	sb $t0 0($sp)
	addi $sp $sp -1
	sb $t0 0($sp)
	addi $sp $sp 4
	
	li $v0 10
	syscall

[그림] sb 연산 수행

  • 그림을 보면 알 수 있듯이 Little Endian으로 1바이트씩 저장되는 것을 확인할 수 있다.

 

2. 32Bit Constant 만들기

  • MIPS에서는 Immediate를 로드/저장하기 위해 16비트까지만 제공한다 (I format : 6 + 5 + 5 + 16)
  • 근데 때로는 32Bit의 Immediate Value를 로드/저장할 필요가 있다. 이럴 때는 두번 쪼개서 로드/저장한다
  • 만약 0000 0000 0111 1101 / 0000 1001 0000 0000를 로드해야한다고 가정해보자.
  • 그러면 상위 16비트만 쪼개서 0000 0000 0111 1101을 먼저 로드하고, 그리고 나서
  • 하위 16비트인 0000 1001 0000 0000를 로드해야한다.
lhi $s0 61
0000 0000 0111 1101 / 0000 0000 0000 0000 (미리 절반 로드)

ori s0 2304
0000 0000 0111 1101 / 0000 1001 0000 0000 (로드 완료)

 

3. I format (Branch)의 주소 지정방식 (PC Relative Addressing)

  • I format : OP + RS + RT + Address(Constant) (16bit)
  • PC Relative Addressing : PC + offset(Address) * 4의 주소로 이동함
  • 그러니까, 현재 PC값 + 명령어에 포함된 Address값 * 4로 주소 이동
  • 그러나 PC는 이 I format 연산을 실행할 때 이미 움직였기 때문에 이를 고려해야함
  • 예를 들어서 80012에서 80024로 가려면 12가 필요하므로 (3 * 4)로 3을 입력하면 될 것 같지만
  • 이미 PC는 이 명령어를 읽고 80016으로 이동했기 때문에 8이 필요하고, 2를 입력해야함 (아래 예제 참조)
  • 또한 Branch할 때 offset이 16비트로 모자라면 beq L1으로 가까운 곳으로 이동하고 L1에서 j L2로 이동함

 

4. J Format (Jump)의 주소 지정방식 (Pseudo Direct Jump Addressing)

  • J Foramt : OP + Address (26Bit)
  • PC의 상위 4비트 (31, 30, 29, 28) <=> 지정한 Address의 주소 * 4로 점프함
  • 그러니까 AD, AD, AD, ... , AD, PC28 PC29 PC30 PC32와 같이 설정함
  • (AD는 파라미터로 입력한 주소 * 4 값이고 PC는 프로그램 카운터의 상위4비트)

 

5. Example of Addressing

[그림] Addressing 예제

  • bne t0 s5 Exit로 갈 땐, I Format이기 때문에, PC Relative Addressing을 따름
  • 80012 + 4 + 2 * 4인 80024로 이동함. 왜 그러냐면, 현재 위치인 80012에서 bne명령어를 읽은 순간
  • PC는 이미 다음 명령어를 찍고 있기 때문에 4바이트를 움직여버렸음. 그래서 80016이 되었는데 (+4)
  •  거기에다가 Address로 2가 들어왔기 때문에 2 * 4인 8을 더해서 80016 + 8 = 80024로 감.
  • 즉 I format으로 지금 위치에서 3칸 떨어진 줄로 갈때, (3-1) * 4의 위치로 가야하기 때문에 2를 입력해야함
  • j Loop로 점프할 때는, 20000을 입력하면 20000 * 4인 80000으로 점프함. 이 때 PC 상위4비트는 0000임

 

6. Addressing Mode of MIPS

  • Immediate (즉치) 어드레싱 (I) : 숫자를 그대로 사용하는 방식 (e.g. li t0 10)
  • Register 어드레싱 (R) : 레지스터끼리 연산을 수행하는 방식 (e.g. add t0 t0 t1)
  • Base 어드레싱 (I) : 베이스 주소(주로 sp)를 두고 offset만큼 더하는 방식 (e.g. lw t0 3(sp) = sp + 3) 
  • PC Relative 어드레싱 (I) : 현재 PC의 주소에 offset만큼 더하는 방식 (beq t0 t1 2 => t0==t1이면 3칸 점프)
  • Pseudo Direct 어드레싱 (J) : PC의 상위비트와 교접시키는 방식 (j 20000 => 80000으로 점프)

 

MIPS이외의 보편적으로 사용하는 어드레싱 모드들에 대한 설명은 여기를 참고

 

7. Reference

 

컴퓨터구조

이 과목에서는 컴퓨터 시스템의 구성, 동작원리와 설계를 다룬다. 특히 컴퓨터 성능, 명령집합, 제어와 마이크로프로그래밍, 파이프라인, 정수와 부동 소수점수 연산, 기억부 시스템, 입출력 부시스템, 고급 컴퓨터구조 등과 같은 내용에 중점을 둔다. 교과목을 통해 고속 Data Network 시스템에 들어가는 여러 Processors를 이해하고, 이들을 설계 또는 Programming 할 수 있는 능력을 배양한다.

www.kocw.net