컴퓨터 구조 1 - MIPS nested loop
저번 시간 답 공개
일단 저번 수업 while문의 MIPS 답부터 공개하겠습니다.
Loop code 1
L: stli $2,$1,0
beq $2,$0, EXIT
nop
addi $1,$1,-1
j L
nop
EXIT:
Loop code 2
addi $1,$0,0
L:stli $3,$1,10
beq $3,$0,EXIT
nop
add $2,$2,$1
addi $1,$1,1
j L
nop
EXIT:
Loop code 3
L: Add $2,$2,$1
Addi $1,$1,1
Stli $3,$1,10
Bne $3,$0, L
Nop
지금까지 나왔던 내용으로 충분히 풀 수 있을 것이라고 생각합니다.
추가 예제 1 ( 피보나치 수열 )
내용이 좀 어렵습니다. 어느 코딩 문제나 초급 단계에서 심화문제는 항상 피보나치 수열인것 같습니다. 사실 피보나치 수열의 특징만 파악하면 흐름대로 진행하면 되기 때문에 충분히 할 수 있습니다. 멈추고 풀어보세요.
피보나치 수열은 각 항이 바로 앞의 두 항의 합으로 이루어진 수열로, 처음 두 항은 0과 1입니다. 예를 들어, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 등으로 이루어집니다.
Addi $2,$0,1
Addi $3,$0,1
Addi $1,$0,0
L:
Stli $5,$1,10
Beq $5,$0,EXIT
nop
Add $4,$2,$3
Add $2, $3,$0
Add $3,$4,$0
Add $1,$1,1
J L
Nop
EXIT:
Addi $2,$0,1
Addi $3,$0,1
Addi $1,$0,0
L: Stli $5,$1,10
Beq $5,$0,EXIT
nop
Add $4,$2,$3
Add $2, $3,$0
Add $3,$4,$0
J L
Add $1,$1,1
EXIT:
설명:
첫 번째 코드는 피보나치 수열을 계산하기 위해 for 루프를 사용합니다. 변수 i는 0부터 9까지 증가하면서, 변수 f1과 f2는 각각 1로 초기화됩니다. 각 반복에서, t 변수는 f1과 f2를 더한 값입니다. 그런 다음, f2는 f1으로 바뀌고, t는 f2로 할당됩니다. 이것은 피보나치 수열의 다음 항에 해당하는 값입니다. 이 코드는 덧셈과 대입 연산자를 사용하여 수열 값을 계산합니다.
두 번째 코드는 레지스터를 사용하여 피보나치 수열을 계산합니다. 레지스터 $1은 반복 횟수를 추적하는 데 사용되며, $2와 $3은 각각 1로 초기화됩니다. 레지스터 $4는 두 수를 더한 값을 보관하기 위해 사용됩니다. 코드는 레지스터를 사용하여 수열 값을 계산하며, 하나의 레지스터에 두 수를 더하는 방식으로 값을 계속해서 갱신합니다. 이 코드는 덧셈, 대입, 분기 및 점프 명령을 사용하여 수열 값을 계산합니다.
추가 예제 2 ( Nested Loop )
약간 이런 문제를 풀 때 손으로든 무엇이든 c코드의 흐름을 먼저 파악하고 써는게 MIPS 코드 작성에 매우 좋습니다.
멈추고 풀어보세요
답:
Addi $3,$0,0
Addi $1,$0,0
LOOP_I: Stli $4,$1,100
Beq $4,$0, EXIT_I
Nop
Addi $2,$0,0
LOOP_J: Stl $4,$2,$1
Beq $4,$0, EXIT_J
Nop
Andi $4,$2,3
Addi $4,$4,
-
3
Beq LOOP_END_J
Nop
Add $3,$3,$2
Stli $4,$3,1025
Beq $4,$0,EXIT_J
Nop
LOOP_END_J: Addi $2,$2,1
J LOOP_J
Nop
EXIT_J: addi $1,$1,1
J LOOP_I
Nop
EXIT_I:
결론
지금까지 MIPS에 대해 간단히 공부하고 풀어보는 시간을 가졌습니다. 추가로 다른 내용을 공부하고 싶은 것이 생겨서 MIPS에 대한 포스팅은 잠시 멈추겠습니다.
아마 다음 내용은 애플리케이션의 제작 - Android studio kotlin에 대한 내용으로 돌아오겠습니다.