Schoolwork/컴퓨터구조론

MIPS programming assignment #1

FATKITTY 2021. 12. 23. 14:19
반응형

Qtspim에서 동작하는 Assembly 프로그램 작성하기

 

1. 정수 타입의 변수 a, c, e를 선언하고, a를 4, c를 3, e를 2로 초기화한 뒤, a-c+e를 구하여 출력하는 프로그램을 작성하시오.

    .data
a: .word 4
c: .word 3
e: .word 2
    .text

main:
    lw  $t0, a
    lw  $t1, c
    sub $s0, $t0, $t1

    lw $t2, e
    add $s1, $s0, $t2

    move $a0, $s1
    li $v0, 1
    syscall

    li $v0, 10
    syscall

 

 

2. 사용자로부터 변수 a, c에 입력을 받아 저장하고, 입력받은 두 수의 몫과 나머지를 출력하는 프로그램을 작성하시오. (입력받는 정수는 반드시 변수형)

    .data
a: .word 0
c: .word 0
newline: .asciiz "\n"
    .text

main:
    # a 입력받기
    li $v0, 5
    syscall
    sw $v0, a       # store word

    # c 입력받기
    li $v0, 5
    syscall
    sw $v0, c

    lw $t0, a       # load word
    lw $t1, c
    div $t0, $t1    # $t0/$t1

    mflo $s0        # 몫
    mfhi $s1        # 나머지

    # print 몫
    move $a0, $s0
    li $v0, 1
    syscall

    # print newline
    li $v0, 4
    la $a0, newline
    syscall

    # print 나머지
    move $a0, $s1
    li $v0, 1
    syscall

    # 프로그램 종료
    li $v0, 10
    syscall

 

 

3. 사용자로부터 임의의 양의 정수 두 개를 입력받고, 입력받은 두 개의 정수 중 큰 값을 출력하는 프로그램을 작성하시오.

예시) 입력 : 5 7 / 출력 : 7

         입력 : 6 4 / 출력 : 6

    .data
a: .word 0
c: .word 0
in_msg: .asciiz "입력 : "
out_msg: .asciiz "출력 : "
    .text
    .globl main

main:
    li $v0, 4
    la $a0, in_msg
    syscall

    # 입력 받은 값을 변수에 저장
    li $v0, 5
    syscall
    sw $v0, a

    li $v0, 5
    syscall
    sw $v0, c

    # 변수값 다시 불러오기
    lw $t0, a
    lw $t1, c

    li $v0, 4
    la $a0, out_msg
    syscall

    slt $s0, $t0, $t1  		# 숫자 크기 비교 ($t0<$t1이면 1을,  $t0>$t1이면 0을 $s0레지스터에 저장)
    beq $s0, 1, function  	# $s0==1인지 판단, 1이면 function으로 이동

    move $a0, $t0
    li $v0, 1
    syscall

    li $v0, 10
    syscall

function:
    # $t0 < $t1
    move $a0, $t1
    li $v0, 1
    syscall

    li $v0, 10
    syscall

 

 

4. 사용자로부터 양의 정수 하나를 입력받고, 이 정수보다 작은 정수 중 가장 큰 값 4개를 내림차순으로 출력하는 반복문을 작성하시오. (입력값은 5 이상)

예시) 입력 : 10 / 출력 : 9 8 7 6

    .data
a: .word 0
i: .word 1
space : .asciiz " "
in_msg: .asciiz "입력 : "
out_msg: .asciiz "출력 : "
    .text

main:
    li $v0, 4
    la $a0, in_msg
    syscall

    li $v0, 5
    syscall
    sw $v0, a

    # 루프에 들어가기 전 데이터 영역에서 정의해준 변수들을 레지스터에 로드
    lw $t0, i
    lw $t1, a
    la $s1, space

    li $v0, 4
    la $a0, out_msg
    syscall

loop:
    sub $s0, $t1, $t0   # 입력받은 값 - 1

    move $a0, $s0
    li $v0, 1
    syscall

    add $t0, $t0, 1     # i=i+1
    beq $t0, 5, end     # i==5 이면 반복문 종료

    move $a0, $s1
    li $v0, 4
    syscall
    
    j loop              # loop 시작점으로 돌아감

end:
    li $v0, 10
    syscall

 

반응형

'Schoolwork > 컴퓨터구조론' 카테고리의 다른 글

MIPS programming assignment #3  (0) 2022.01.01
MIPS programming assignment #2  (0) 2022.01.01
MIPS registers  (0) 2021.12.26
PC 부품 기능과 PC 조립 단계  (0) 2021.12.20