반응형
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 |