사용 개념: MIPS 명령어 형식의 세 형식과 opcode·funct 표, MIPS 레지스터와 메모리 피연산자의 레지스터 번호 표.
“어셈블리어 한 줄을 16진수 기계어로 옮겨라”는 문제는 늘 같은 하위목표 넷을 밟는다. ① 형식과 op(R형식이면 funct까지)를 찾는다. ② 레지스터 이름을 번호로 바꿔 알맞은 칸(rs, rt, rd)에 놓는다. ③ 남은 칸(shamt 또는 immediate)을 채운다. ④ 칸들을 2진수로 이어 붙이고 4비트씩 끊어 16진수로 읽는다. 거꾸로 푸는 문제는 ④ → ① → ② → ③ 순서다.
이 방법을 떠올리는 실마리는 명령의 모양이다. 재료가 모두 레지스터면 R형식, 상수나 숫자(레지스터) 꼴이 보이면 I형식이다. 틀리기 쉬운 곳은 ②다. 어셈블리어에 적는 순서와 칸의 순서가 다르다1.
필요한 값은 아래와 같다2.
| 명령 | op / funct (16진수) | 레지스터 | 번호 |
|---|---|---|---|
sub |
0 / 22 | $a0 |
4 |
srl |
0 / 02 | $t0~$t3 |
8~11 |
addi |
08 | $s1~$s5 |
17~21 |
slti |
0A | ||
sw |
2B |
문제 1 · 완전한 풀이
sub $t2, $s3, $s4를 기계어로 옮겨라3.
- 형식과 op 찾기: 재료가 모두 레지스터라 R형식이다. op = 0 =
000000, funct =0x22=100010. - 레지스터를 칸에 놓기:
sub rd, rs, rt순서로 적는다. 첫째로 적은$t2= 10이 rd, 둘째$s3= 19가 rs, 셋째$s4= 20이 rt다. rs =10011, rt =10100, rd =01010. - 남은 칸 채우기: 밀기 명령이 아니므로 shamt =
00000. - 이어 붙여 16진수로:
000000 10011 10100 01010 00000 100010→0000 0010 0111 0100 0101 0000 0010 0010→0x02745022.
문제 2 · 마지막 하위목표만 빈칸
addi $t0, $s5, -12를 기계어로 옮겨라3.
- 형식과 op 찾기: 상수가 있어 I형식이다. op =
0x08=001000. - 레지스터를 칸에 놓기:
addi rt, rs, imm순서로 적는다. 첫째로 적은$t0= 8이 rt, 둘째$s5= 21이 rs다. rs =10101, rt =01000. - 남은 칸 채우기: −12를 16비트 2의 보수로 적는다. 12 =
0x000C, 뒤집으면0xFFF3, 1을 더하면0xFFF4=1111 1111 1111 0100. - 이어 붙여 16진수로: __
답
001000 10101 01000 1111111111110100 → 0010 0010 1010 1000 1111 1111 1111 0100 → 0x22A8FFF4.
4비트씩 끊을 때 칸의 경계(6, 5, 5, 16)와 4비트의 경계가 어긋난다. 32비트를 먼저 한 줄로 이어 쓴 뒤 왼쪽부터 네 개씩 끊는다.
문제 3 · 하위목표 절반이 빈칸
sw $t3, 48($s2)를 기계어로 옮겨라3.
- 형식과 op 찾기:
숫자(레지스터)꼴이라 I형식이다. op =0x2B=101011. - 레지스터를 칸에 놓기: __
- 남은 칸 채우기: 오프셋 48 =
0x0030=0000 0000 0011 0000. - 이어 붙여 16진수로: __
답
sw rt, imm(rs)순서로 적는다. 괄호 안의$s2= 18이 rs, 앞에 적은$t3= 11이 rt다. rs =10010, rt =01011. 흔한 오답은 앞에 적은$t3을 rs에 넣는 것이다.101011 10010 01011 0000000000110000→1010 1110 0100 1011 0000 0000 0011 0000→0xAE4B0030.
문제 4 · 독립 문제
(a) slti $t0, $a0, 1을 16진수 기계어로 옮겨라. (b) 기계어 0x001140C2를 어셈블리어로 되돌려라3.
답
(a) I형식, op = 0x0A = 001010. rs = $a0 = 4 = 00100, rt = $t0 = 8 = 01000. immediate = 1. 001010 00100 01000 0000000000000001 → 0010 1000 1000 1000 0000 0000 0000 0001 → 0x28880001.
(b) 2진수 0000 0000 0001 0001 0100 0000 1100 0010. 앞 6비트가 0이라 R형식이다. 000000 00000 10001 01000 00011 000010으로 자르면 rs = 0, rt = 17($s1), rd = 8($t0), shamt = 3, funct = 0x02(srl). 밀기 명령은 srl rd, rt, shamt 순서로 적으므로 srl $t0, $s1, 3이다.