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
- 그림을 보면 알 수 있듯이 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
- 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
'컴퓨터구조' 카테고리의 다른 글
명령어 (18) - 동기화 (0) | 2020.05.05 |
---|---|
명령어 (16) - 프로시져 / 함수 (2) (0) | 2020.05.04 |
명령어 (15) - MIPS 프로그래밍 해보기 (0) | 2020.05.04 |
명령어 (14) - 프로시져 / 함수 (1) (1) | 2020.05.01 |
명령어 (13) - 대소 비교 (<) (0) | 2020.04.08 |
명령어 (12) - 조건 연산, J Format (0) | 2020.04.08 |
명령어 (11) - 논리 연산 (0) | 2020.04.08 |