반응형
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
반응형
'archive. > Schoolwork' 카테고리의 다른 글
[Python] 그래픽스 - 특징 기술자 및 매칭 (Term Project) (0) | 2022.03.02 |
---|---|
컴퓨터구조론 - 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 |