일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- data structure
- javascript
- function
- computer
- react
- XML
- instruction
- python
- Pipelining
- Java
- Linux
- system
- MIPS
- DS
- php
- architecture
- control
- DATAPATH
- github
- Algorithm
- web
- DoM
- DB
- MacOS
- CSS
- Class
- while
- for
- mysql
- html
- Today
- Total
YYYEJI
[MIPS] 1부터 N 사이의 3의 배수의 합을 구하는 assembly code 본문
** C code를 기준 **
아래 코드를 MIPS assembly code로 변환해 보겠습니다.
#include <stdio.h>
int main(void){
int i = 1;
int sum = 0;
int n = 15;
while(i<=n)
{
if(i%3==0)
{sum = sum +i;}
i++;
}
printf("%d", sum);
return 0;
}
C to MIPS assembly
.data
str1: .asciiz "\nSum of multiples of 3 is "
.text
main:
addi $t0, $zero, 0 # i = 0
addi $t1, $zero, 0 # sum = 0
addi $s0, $zero, 15 # n = 15
addi $t2, $zero, 3 # t2 = 3
loop:
addi $t0, $t0, 1 # i += 1
bgt $t0, $s0, exit # if (i>n) goto exit
div $t0, $t2 # hi = i/3
mfhi $t3 # t3 = hi
bne $t3, $zero, loop # if (t3 != 0) goto loop
add $t1, $t1, $t0 # sum += i
j loop
exit:
li $v0, 4
la $a0, str1
syscall
li $v0, 1
add $a0, $zero, $t1
syscall
.end
.text 코드를 하나하나 살펴보면
main:
addi $t0, $zero, 0 # i = 0
addi $t1, $zero, 0 # sum = 0
addi $s0, $zero, 15 # n = 15
addi $t2, $zero, 3 # t2 = 3
$t0에는 while문에서 사용할 i의 값을 초기화시켜 줍니다.
$t1에는 3의 배수의 합을 저장해줄 sum의 값을 초기화시켜 줍니다.
$s0를 통해 N의 값을 초기화시켜 줍니다.
$t2는 3의 배수임을 확인하기 위한 값이 들어있는 register입니다.
다음은 while문 입니다.
loop:
addi $t0, $t0, 1 # ✓1 - i += 1
bgt $t0, $s0, exit # ✓2 - if (i>n) goto exit
div $t0, $t2 # ✓3 - hi = i/3
mfhi $t3 # ✓4 - t3 = hi
bne $t3, $zero, loop # ✓5 - if (t3 != 0) goto loop
add $t1, $t1, $t0 # ✓6 - sum += i
j loop
✓1 - i 값을 하나 증가시켜 주고
✓2 - bgt (pseudo code)를 통해 i와 n의 값을 비교해 줍니다.
(i가 크면 exit label로 PC의 값을 바꿔줍니다.)
✓3 - i의 값이 3의 배수인지를 확인해줍니다.
✓4 - mfhi(move from high register) div의 나머지 결과 값을 가져옵니다.
✓5 - 나머지 결과가 0이 아니라면 3의 배수가 아니기 때문에 처음으로 돌아갑니다.
✓6 - 나머지 결과가 0이라면 3의 배수이기 때문에 sum에 i 값을 더해줍니다.
exit label 부분은 아래 링크를 통해 확인해주세요!
exit:
li $v0, 4
la $a0, str1
syscall
li $v0, 1
add $a0, $zero, $t1
syscall
.end
https://yyyeji.tistory.com/151?category=1306702
“▷" 실행 버튼을 누르면 Console 화면에 결과가 출력됩니다.
↓↓↓ 디버깅하는 방법 ↓↓↓
제가 화면에서 누르고 있는 버튼을 누르면
코드가 한 줄씩 실행되면서 register 값이 바뀌는 것을 확인할 수 있습니다.
◡̈
'Computer architectures' 카테고리의 다른 글
[MIPS] Division in MIPS (0) | 2022.10.20 |
---|---|
[MIPS] Multiplication in MIPS (0) | 2022.10.20 |
[MIPS] While문 assembly (0) | 2022.10.19 |
[MIPS] Switch문 assembly code (0) | 2022.10.19 |
[MIPS] Array에서 값을 가져오고 저장하는 Assembly code (0) | 2022.10.19 |