아 맞다 생각난건데, 계산 문제 달달 외워라. 나도 까먹는다. 그리고 거기 쓰이는 것이 뭔지 확실히 알아둬야 한다. 애매하게 알아봤자 풀지도 못할거다.
.data
.text
main:
jal loop
li $v0, 1
li $a0, 100
syscall
li $v0, 10
syscall
loop:
li $v0, 5
syscall
move $t0, $v0
li $v0, 0
li $v0, 5
syscall
move $t1, $v0
bne $t0, $t1, loop
jr $ra
방금 올리다가 생각난건데, 이건 Pico MIPS라서 색깔놀이 못한다. 슬프다. 1번
.data
.text
main:
li $v0, 5
syscall
move $a1, $v0
# a1은 a
li $v0, 0
li $v0, 5
syscall
move $a2, $v0
# a2는 b
addi $sp, $sp, -8
sw $a1, 4($sp)
sw $a2, 0($sp)
# a>b가 당연하다고 생각함.
slt $t1, $a1, $a2
beq $t1, $zero, SwapMain
# 그런 함은 침몰했다.
jal GCD
# gcd 부르고
lw $a2, 0($sp)
lw $a1, 4($sp)
# 인자들 다시 불러오고
addi $sp, $sp, 8
# pop
move $s0, $v0
# 결과값은 s0
move $a0, $s0
li $v0, 1
syscall
li $v0, 10
syscall
SwapMain:
move $t1, $a1
move $a1, $a2
move $a2, $t1
# swap 한거다
jal GCD
# gcd 부르고
lw $a2, 0($sp)
lw $a1, 4($sp)
# 인자들 다시 불러오고
addi $sp, $sp, 8
# pop
move $s0, $v0
# 결과값은 s0
move $a0, $s0
li $v0, 1
syscall
li $v0, 10
syscall
GCD:
addi $sp, $sp, -8
sw $ra, 4($sp)
# ra는 리턴 어드레스
div $a1, $a2
mfhi $s1
# 뭐 나누면 hi가 나머지고 lo가 몫이다.
sw $s1, 0($sp)
#맨 위에다 저장하고
bne $s1, $zero, Loop
# s1이 0이 아니면 Loop로 보내서 다시 돌아오게 한다.
move $v0, $a2
#그게 아니라면 a2가 정답임
addi $sp, $sp, 8
jr $ra
Loop:
move $a1, $a2
lw $s1, 0($sp)
#다시 한번 말하지만 s1은 그 나머지다
move $a2, $s1
# a1을 a2로 나누면 a2가 a1%a2보다 무조건 큼
jal GCD
lw $ra, 4($sp)
addi $sp, $sp, 8
jr $ra
2번. 갑자기 코드 길이가 길어진거 같지만 기분탓이다.
.data
.text
main:
li $v0, 5
syscall
move $s1, $v0
addi $s2, $s2, 1
# s1을 n으로 하고 s2를 n! 결과로 할 예정
jal Factorial
move $a0, $s2
li $v0, 1
syscall
li $v0, 10
syscall
Factorial:
addi $sp, $sp, -4
sw $ra, 0($sp)
#돌아갈 곳
bne $s1, $zero, Loop
#만약 아직 수가 0이 안 됐다면 Loop로 이동한다.
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
Loop:
mult $s1, $s2
mflo $s2
addi $s1, $s1, -1
jal Factorial
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
3번
.data
list:
.align 6
.space 30
InputMent : .asciiz "plz input n\n"
SpaceBar : .asciiz " "
.text
main:
la $s0, list
li $s2, 4
# s2는 i (n-1부터 시작, i--)
li $s3, 0
# s3는 j (0 부터 시작, j++)
jal InputLoop
# 다섯개 수 입력 받기
jal Bubble1
la $s0, list
li $s1, 0
jal PrintLoop
li $v0, 10
syscall
Bubble1:
addi $sp, $sp, -4
sw $ra, 0($sp)
addi $s2, $s2, -1
li $s3, -1
bne $s2, $zero, Bubble2
jr $ra
Bubble2:
addi $s3, $s3, 1
# s3(j)는 0부터 i 까지 갈거다
la $t0, list
# t0에다 list 집어넣어주고
li $t6, 4
# t6는 임시값 (4byte)
mult $s3, $t6
mflo $a1
# j*4 = 0, 4, 8, 12, 16
add $t0, $t0, $a1
lw $t1, 0($t0)
# t1은 list[s3]값
lw $t2, 4($t0)
# t2는 list[s3+1]값
slt $t3, $t1, $t2
beq $t3, $zero, swap
# list[s3]가 list[s3+1]보다 크다면 swap
# 근데 j는 i와 같아져야함
bne $s3, $s2, Bubble2
# s3(j) 가 s2(i)보다 작다면 루프를 계속 돈다.
j Bubble1
swap:
move $t1, $a1
la $t0, list
add $t0, $t0, $t1
lw $t2, 0($t0)
lw $t3, 4($t0)
sw $t3, 0($t0)
sw $t2, 4($t0)
bne $s3, $s2, Bubble2
# 여기서 끝날 수도 있다구
j Bubble1
InputLoop:
addi $s1, $s1,1
la $a0, InputMent
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
sw $t1, 0($s0)
addi $s0, $s0, 4
bne $s1, 5, InputLoop
jr $ra
PrintLoop:
addi $s1, $s1, 1
lw $a0, 0($s0)
li $v0, 1
syscall
addi $s0, $s0, 4
la $a0, SpaceBar
li $v0, 4
syscall
bne $s1, 5, PrintLoop
jr $ra
당장 도망가라.
'vidigummy KAU > 2020년 2학기 컴퓨터 구조' 카테고리의 다른 글
컴구 시험 정리(공식, 무조건 나오게 되는 개념들) (0) | 2021.01.03 |
---|---|
컴구 과제 2 (0) | 2021.01.03 |
컴구 과제 1 (0) | 2021.01.03 |
컴구는 좋은 과목이다. (0) | 2021.01.03 |