MIPS 어셈블리 시바
#void Merge(int num[], int p, int q, int r){
# int temp[r-p+1];
# int i = p;
# int j = q+1;
# int k = 0;
# while(i<=q && j<=r){
# if(num <= num[j])
# temp[k++] = num[i++];
# else
# temp[k++] = num[j++];
# }
# while(i<=q){
# temp[k++] = num[i++];
# }
# while(j<=r){
# temp[k++] = num[j++];
# }
# for(i=p,j=0; i<=r; ++i, ++j) {
# num = temp[j];
# }
#}
#
#
이걸 에셈블리로 다음으로 써야함
sub $sp, $sp, 16
sw $ra, 0($sp)
sw $t0, 4($sp)
sw $t2, 8($sp)
sw $t4, 12($sp)
move $s1, $t0 #i=p
move $s2, $t4 #j=q
addi $s2, $s2, 1 #j+=1
li $s3, 0 #k=0
#while(i<=q && j<=r)
while1:
bgt $s1, $t4, while2 #if(i>q) goto next while loop
bgt $s2, $t2, while2 #and if(j>r) goto next while loop
#if(num <= num[j])
# temp[k++] = num[i++]
# $t6=$list
########access to num########################
la $t6, list
add $t7, $s1, $zero
add $t7, $t7, $t7
add $t7, $t7, $t7 #index*4
add $t8, $t7, $t6
# 0($t8) = num
lw $t9, 0($t8)
#t9 = num
########access to num[j]#######################
addi $t7, $s2, 0
add $t7, $t7, $t7
add $t7, $t7, $t7 #index*4
add $t8, $t7, $t6
lw $s7, 0($t8)
# s7=num[j]
ble $t9, $s7, if
j else
########access to temp[k]######################
la $s4, tmp
add $s5, $s3, $zero
add $s5, $s5, $s5
add $s5, $s5, $s5
add $s6, $s5, $s4
# 0($s6) = temp[k]
#################################################
if:
sw $t9, 0($s6)
addi $s3, $s3, 1 #k++
addi $s1, $s1, 1 #i++
j while1
else:
sw $s7, 0($s6)
addi $s3, $s3, 1 #k++
addi $s2, $s2, 1 #j++
j while1
while2:
bgt $s1, $t4, while3 #if(i>q) goto next while loop
######## t9=num ###################
la $t6, list
addi $t7, $s1, 0
add $t7, $t7, $t7
add $t7, $t7, $t7 #index*4
add $t8, $t7, $t6
# 0($t8) = num
lw $t9, 0($t8)
########## s6=temp[k] ###################
la $s4, tmp
add $s5, $s3, $zero
add $s5, $s5, $s5
add $s5, $s5, $s5
add $s6, $s5, $s4
# 0($s6) = temp[k]
sw $t9, 0($s6)
sw $t9, 0($s6)
addi $s3, $s3, 1 #k++
addi $s1, $s1, 1 #i++
j while2
while3:
bgt $s2, $t2, init_i_j
########access to num[j]#######################
addi $t7, $s2, 0
add $t7, $t7, $t7
add $t7, $t7, $t7 #index*4
add $t8, $t7, $t6
lw $s7, 0($t8)
# s7=num[j]
########## s6=temp[k] ###################
la $s4, tmp
add $s5, $s3, $zero
add $s5, $s5, $s5
add $s5, $s5, $s5
add $s6, $s5, $s4
# 0($s6) = temp[k]
sw $s7, 0($s6)
j while3
init_i_j:
move $s1, $t0 #i=p
lw $s2, 0 #j=0
j for
for:
bgt $s1, $t2, return_merge
######## t9=num ###################
la $t6, list
addi $t7, $s1, 0
add $t7, $t7, $t7
add $t7, $t7, $t7 #index*4
add $t8, $t7, $t6
# 0($t8) = num
lw $t9, 0($t8)
# t9=num
########## s6=temp[k] ###################
la $s4, tmp
add $s5, $s2, $zero
add $s5, $s5, $s5
add $s5, $s5, $s5
add $s6, $s5, $s4
# 0($s6) = temp[k]
lw $s8, 0($s6)
sw $s8, 0($t8) #num = temp[j]
addi $s2, $s2, 1
addi $s1, $s1, 1
return_merge:
lw $ra, 0($sp)
lw $t0, 4($sp)
lw $t2, 8($sp)
lw $t4, 12($sp)
addi $sp, $sp, 16
jr $ra