vidigummy KAU/2020년 2학기 컴퓨터 구조

컴구 과제3

vidi 2021. 1. 3. 22:47

아 맞다 생각난건데, 계산 문제 달달 외워라. 나도 까먹는다. 그리고 거기 쓰이는 것이 뭔지 확실히 알아둬야 한다. 애매하게 알아봤자 풀지도 못할거다.

    .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

당장 도망가라.