Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- control
- javascript
- DB
- computer
- DoM
- while
- Class
- system
- architecture
- DS
- react
- instruction
- html
- function
- MIPS
- XML
- Java
- Algorithm
- MacOS
- php
- DATAPATH
- mysql
- for
- web
- CSS
- github
- Linux
- Pipelining
- data structure
- python
Archives
- Today
- Total
YYYEJI
[MIPS] While문 assembly 본문
728x90
** C code를 기준 **
아래 코드를 MIPS assembly code로 변환해 보겠습니다.
i = 0;
while (a[i] == k) i++;
C to MIPS assembly
addi $s0, $zero, 0 # i = 0
loop: sll $t0, $s0, 2 # t0 = i*4
addi $t0, $t0, $s2 # t0 = t0 + &a[0]
lw $t1, 0($t0) # t1 = a[t0]
bne $t1, $s1 exit # if (t1 != s1) goto exit
addi $s0, $s0, 1 # i = i + 1
j loop # goto loop
exit:
$s0 - i
$s1 - k
$s2 - a[0]
코드를 하나하나 살펴보면
addi $s0, $zero, 0 # i = 0
우선 i 값에 0을 넣어줍니다.
sll $t0, $s0, 2 # t0 = i*4
a[0] | a[1] | a[2] | a[3] | ... | ... |
주소 하나당 4 bytes를 가지고 있고
addi $t0, $t0, $s2 # t0 = t0 + &a[0]
array 인덱스 0번째의 주소를 더해줌으써 원하는 array index의 주소를 알게 됩니다.
lw $t1, 0($t0) # t1 = a[t0]
원하는 array의 주소를 계산하고, 주소로 가서 값을 가져옵니다.
bne $t1, $s1 exit # if (t1 != s1) goto exit
statement를 실행시켜 줍니다.
$t1의 값과 $s1의 값이 다르면 exit label로 이동합니다.
addi $s0, $s0, 1 # i = i + 1
i의 값을 increment 시켜줍니다.
(i++)
j loop # goto loop
loop label로 돌아가서 조건이 일치하지 않을 때까지 반복해서 수행합니다.
◡̈
'Computer architectures' 카테고리의 다른 글
[MIPS] Multiplication in MIPS (0) | 2022.10.20 |
---|---|
[MIPS] 1부터 N 사이의 3의 배수의 합을 구하는 assembly code (0) | 2022.10.20 |
[MIPS] Switch문 assembly code (0) | 2022.10.19 |
[MIPS] Array에서 값을 가져오고 저장하는 Assembly code (0) | 2022.10.19 |
[MIPS] Bit-wise AND(&)로 Logical AND(&&) 구하기 (2) | 2022.10.19 |