오늘은 MIPS를 사용하여 array에 parameter를 대입하는 코드를 설명드리겠습니다.
해당 포스트를 진행하기에 앞서 기본적인 opcode 학습이 필요합니다.
Q. 아래 코드를 참조하여 변수 d의 값을 1씩 감소시키면서 배열 arr에 반복 대입하는 프로그램을 작성하시오.
int c = 0;
int d = 10;
int arr[3];
for(c = 0; c < 3; c++){
arr[c] = d--;
}
이번 문제는 배열을 선언하고, 배열에 반복하여 parameter를 저장하는 프로그램입니다.
사용자의 입력을 받는 조건은 없으므로, 코드에서 주어진 값으로 변수를 초기화 합니다.
.data
c: .word 0
d: .word 10
arr: .word 0, 0, 0
.text
loop에서 초기 횟수를 담당할 변수 c를 0으로, d의 시작 숫자를 10으로 셋팅합니다.
위의 코드에서 반복 횟수를 3으로 지정해놨기 때문에, array를 3개의 결과 값을 저장할 수 있도록 선언합니다.
main:
lw $t0, c
lw $t1, d
la $s0, arr
j loop
별도의 입력이 없는 문제이므로
바로 레지스터에 변수 값을 전달합니다.
이 때, array 역시 레지스터로 전달하며, loop 함수로 jump 하여 나머지 연산을 수행합니다.
loop:
sw $t1, ($s0)
addi $t1, $t1, -1
addi $t0, $t0, 1
addi $s0, $s0, 4
bne $t0, 3, loop
li $v0, 10
syscall
loop 함수에서는 array 에 저장할 3개의 결과 값을 연산하고, arr에 저장하는 역할을 합니다.
addi $t1, $t1, -1 를 사용하여 변수 d의 값을 1씩 감소시킵니다. (d--)
다음으로 addi $t0, $t0, 1를 사용하여 c의 값을 1씩 증가시킵니다. (c++)
반복문에 대한 변수 처리가 완료되면, addi $s0, $s0, 4를 사용하여 array에 d 값을 저장합니다.
이 때, addi $s0, $t1, 4 는 arr에 감소된 결과 값 $t1을 4 byte 간격으로 저장하라는 의미입니다.
이런 반복문을 3번 반복하며(bne $t0, 3, loop)
c의 값이 3에 도달하면 프로그램을 종료합니다.
아래는 전체 코드 입니다.
.data
c: .word 0
d: .word 10
arr: .word 0, 0, 0
.text
main:
lw $t0, c
lw $t1, d
#변수 c,d 를 레지스터로 전송
la $s0, arr
j loop #jump to the loop
loop:
sw $t1, ($s0) #arr(c)에 삽입
addi $t1, $t1, -1 #d-1
addi $t0, $t0, 1 #c++
#addi $s0, $s0, 4 #array에서 4btye 뒤에 저장하도록 위치 이동
bne $t0, 3, loop #3번 반복할 때 까지 loop 함수 반복
li $v0, 10
syscall
#종료
이상입니다.
'소프트웨어 > 컴퓨터 구조(MIPS)' 카테고리의 다른 글
[MIPS] MIPS programming 과제 - N개의 별 출력하기 (0) | 2021.12.17 |
---|---|
[MIPS] MIPS programming 과제 - factorial 연산 (0) | 2021.11.16 |
[MIPS] MIPS programming 과제 - ((i + j) * 2) 연산 수행 (0) | 2021.11.11 |
[MIPS] MIPS programming 과제 - 절대 값 계산하기 (0) | 2021.11.09 |
[MIPS] MIPS programming 과제 - 연속된 정수 출력하기 (0) | 2021.11.03 |
댓글