컴퓨터.반도체

컴퓨터 구조 1 - MIPS nested loop

JROK 2023. 6. 20. 21:14

저번 시간 답 공개

 

일단 저번 수업 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에 대한 내용으로 돌아오겠습니다.