Schoolwork/컴퓨터구조론

MIPS programming assignment #2

FATKITTY 2022. 1. 1. 00:47
반응형

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

 

1. 아래와 같은 정수 변수 c와 d의 차이값 a를 구하는 프로그램을 작성하시오. 이때 c, d는 각각 정수 5, 7를 갖으며, syscall을 사용하여 주어진 정수값 5, 7을 사용자에게 입력받아 이를 저장하여 사용하시오.
a = |c - d|

    .data
a: .word 0
c: .word 0
d: .word 0
in_msg1: .asciiz "c 입력 : "
in_msg2: .asciiz "d 입력 : "
out_msg: .asciiz "|c-d| : "
    .text
    .globl main

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

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

    li $v0, 4
    la $a0, in_msg2
    syscall

    li $v0, 5
    syscall
    sw $v0, d

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

    # c-d 구하기
    sub $t2, $t0, $t1

    # |c-d| 구하기
    sra $t3, $t2, 31
    xor $t2, $t2, $t3
    sub $t2, $t2, $t3

    li $v0, 4
    la $a0, out_msg
    syscall

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

    li $v0, 10
    syscall

 

 

2. 정수값 i와 j를 인자(parameter)로 받고 서로를 더한 후 2배를 한 결과값을 반환하는 calculate 포함하는 프로그램을 작성하시오. (아래 코드 참조) main 프로그램은 calculate 함수를 호출하고 calculate 함수의 수행 결과를 출력한다.

// 참조용 코드
# calculate 함수
	calculate (int i, int j)
		{ return ((i+j)*2); }
# main
	int result;
	result = calculate(3, 4);
	print(result);

 

    .data
int_i: .word 0
int_j: .word 0
in_msg1: .asciiz "i 입력 : "
in_msg2: .asciiz "j 입력 : "
out_msg: .asciiz "(i+j)*2 = "
    .text
    .globl main

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

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

    li $v0, 4
    la $a0, in_msg2
    syscall

    li $v0, 5
    syscall
    sw $v0, int_j

    # 저장된 값 불러오기
    lw $t0, int_i
    lw $t1, int_j
    li $t2, 2

    li $v0, 4
    la $a0, out_msg
    syscall

    jal calculate
    # a에 리턴 된 값 $a0에 입력
    lw $a0, 0($sp)

    # print result
    li $v0, 1
    syscall

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

calculate:
    # i+j 구하기
    add $t3, $t0, $t1
    # (i+j)*2 구하기
    mul $t4, $t3, $t2

    # $t4값을 0($sp), 즉 a에 저장
    sw $t4, 0($sp)

    # main의 jal로 돌아감
    jr $ra

 

 

3. 아래 코드를 참조하여 d값을 1씩 감소시키면서 배열 arr에 반복·대입하는 프로그램을 작성하시오.

// 참조용 코드
int c = 0;
int d = 10;
int arr[3];
for (c = 0; c < 3; c++) {
	arr[c] = d--;
}

 

    .data
c: .word 0
d: .word 10
array: .space 24
nline: .asciiz "\n"
    .text

main:
    lw $t1, c
    lw $t2, d
    la $v1, array
    move $a1, $v1

    j loop

loop:
    # loop 3번 반복
    # $t1 == 3 되면 display로
    beq $t1, 3, display
    # array[0]에 $t2 값 저장
    sw $t2, 0($a1)
    # adds immediate value to array의 다음 칸
    addi $a1, $a1, 4
    # d--
    sub $t2, $t2, 1
    # c++
    addi $t1, $t1, 1

    j loop

display:
    # $t1 == 0이면 branch to exit
    beqz $t1, exit
    # load word from array
    # array[t1]부터 차례대로 load
    lw $t0, 0($v1)

    # load된 값 출력
    move $a0, $t0
    li $v0, 1
    syscall

    # newline 출력
    la $a0, nline
    li $v0, 4
    syscall

    # array[0]까지 모두 load할 때까지
    addi $v1, $v1, 4
    sub $t1, $t1, 1

    j display

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

 


4. syscall을 사용하여 사용자에게 양의 정수값 10을 입력받고 1부터 입력받은 양의 정수까지의 팩토리얼 값(10!) 을 구한 후 그 값을 syscall을 사용하여 출력하는 프로그램을 작성하시오. (※필요없는 코드 작성하지 말 것. 음수나 0등을 입력하는 등의 예외에 대한 코드 작성 불필요. 단순히 재귀함수만 이용)
(EX. 입력 10 출력 3628800 )

.data
.text

main:
    # $t2에 1 대입
    li $t2, 1

    # 양의 정수 입력 받기
    li $v0, 5
    syscall

    move $t0, $v0
    # $t0 == 0이면 zero로
    beq $t0, 0, zero
    # $t0 > 0이면 factorial로
    jal factorial

    # print result
    li $v0, 1
    move $a0, $t2
    syscall

    # exit
    li $v0, 10
    syscall

zero:
    # 입력값이 0이면 1(=0!) 출력
    li $v0, 1
    move $a0, $t2
    syscall

factorial:
    # $t0 == 1이면 zero로 가서 1 출력
    beq $t0, 1, zero

    # $t0 > 1 일때
    # $t2 = $t2 * $t0
    mul $t2, $t2, $t0
    # $t0 = $t0 - 1
    sub $t0, $t0, 1
    # $t0 == 1 될 때까지 factorial 반복
    bne $t0, 1, factorial
    jr $ra

 

반응형

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

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