이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
void swap (int v[], int k)
{
int temp;
temp = v[k];
v[k] = v[k + 1];
v[k + 1] = temp;
}
v는 $a0
에 저장되고, k는 $a1
, temp는 $t0
에 저장된다.
MIPS 코드
swap: sll $t1, $a1, 2 # $t1 = k * 4
add $t1, $a0, $t1 # $t1 = v + (k * 4) = &v[k]
lw $t0, 0($t1) # $t0 (temp) = v[k]
lw $t2, 4($t1) # $t2 = v[k + 1] = *(&v[k] + 4)
sw $t2, 0($t1) # v[k] = $t2 (v[k + 1])
sw $t0, 4($t1) # v[k + 1] = $t0 (temp)
jr $ra # return to calling routine
그닥 특별할 점이라고는 없는 편이다.
void sort (int v[], int n)
{
int i, j;
for (i = 0; i < n; i += 1)
{
for (j = i - 1; j >= 0 && v[j] > v[j + 1]; j -= 1)
{
swap(v, j);
}
}
}
$a0
에 저장되고, n은 $a1
, i는 $s0
, j는 $s1
에 저장된다. move $s2, $a0 # save $a0 into $s2 (v)
move $s3, $a1 # save $a1 into $s3 (n)
move $s0, $zero # i = 0
for1tst: slt $t0, $s0, $s3 # $t0 = 0 if $s0 >= $s3 (i >= n)
beq $t0, $zero, exit1 # go to exit1 if $s0 >= $s3 (i >= n)
addi $s1, $s0, -1 # j = i - 1
for2tst: slti $t0, $s1, 0 # $t0 = 1 if $s1 < 0 (j < 0)
bne $t0, $zero, exit2 # go to exit2 if $s1 < 0 (j < 0)
sll $t1 ,$s1, 2 # $t1 = j * 4
add $t2, $s2, $t1 # $t2 = v + (j * 4) = &v[j]
lw $t3, 0($t2) # $t3 = v[j]
lw $t4, 4($t2) # $t4 = v[j + 1] = *(&v[j] + 4)
slt $t0, $t4, $t3 # $t0 = 0 if $t4 >= $t3
beq $t0, $zero, exit2 # if $t0 = 0, then go to exit2
move $a0, $s2 # 1st param of swap is v (old $a0)
move $a1, $s1 # 2nd param of sqap is j
jal swap # call swap procedure // v[j] <-> v[j + 1]
addi $s1, $s1, -1 # j -= 1
j for2tst # jump to test of inner loop
exit2: addi $s0, $s0, 1 # i += 1
j for1tst # jump to test of outer loop
exit1:
sort: addi $sp, $sp, -20 # make room on stack for 5 registers
sw $ra, 16($sp) # save $ra on stack
sw $s3, 12($sp) # save $s3 on stack
sw $s2, 8($sp) # save $s2 on stack
sw $s1, 4($sp) # save $s1 on stack
sw $s0, 0($sp) # save $s0 on stack
... # procedure body part
exit1: lw $s0, 0($sp) # restore $s0 from stack
lw $s1, 4($sp) # restore $s1 from stack
lw $s2, 8($sp) # restore $s2 from stack
lw $s3, 12($sp) # restore $s3 from stack
lw $ra, 16($sp) # restore $ra from stack
addi $sp, $sp, 20 # restore stack pointer
jr $ra # return to calling routine
ARM | MIPS | |
---|---|---|
발표 년도 | 1985 | 1985 |
명령 크기(Instruction size) | 32 비트 | 32 비트 |
주소 공간(Address space) | 32 비트 평면(32 bits flat) | 32 비트 평면(32 bits flat) |
데이터 정렬(Data alignment) | 정렬됨(Aligned) | 정렬됨(Aligned) |
데이터 주소 모드(Data addressing modes) | 9 | 3 |
레지스터 | 32 비트 15 | 32 비트 31 |
입출력 | 메모리 매핑(Memory mapped) | 메모리 매핑(Memory mapped) |
명령 분류(Instruction class) | MIPS 예시 | SPEC2006 정수 | SPEC2006 부동소수점 |
---|---|---|---|
Arithmetic | add , sub , addi | 16% | 48% |
Data transfer | lw , lb , lui 등 | 35% | 36% |
Logical | and , nor , sll 등 | 12% | 4% |
Cond. Branch | beq , slt , slti 등 | 34% | 8% |
Jump | j , jr , jal | 2% | 0% |