MIPS에서 shift 연산은 sll, srl 연산으로 할 수 있다.
sll(shift left logical)은 왼쪽 쉬프트 연산, srl(shift right logical)은 오른쪽 쉬프트 연산을 수행한다.
rs에 0이 들어가고 첫 번째 인자는 rt, 두 번째 인자는 rd에 들어간다.
LEFT SHIFT | $t0 = $s0 << 1 | sll $t0, $s0, 1 |
RIGHT SHIFT | $t0 = $s0 >> 1 | srl $t0, $s0, 1 |
AND | $t0 = $t1 & $t2 | and $t0, $t1, $t2 |
AND immediate | $t0 = $t1 & 8 | andi $t0, $t1, 8 |
OR | $t0 = $t1 | $t2 | or $t0, $t1, $t2 |
OR immediate | $t0 = $t1 | 8 | ori $t0, $t1, 8 |
NOR | $t0 = ~($t1 | $t2) | nor $t0, $t1, $t2 |
Branch if equal | if($t0 == $t1) goto BRANCH | beq $t0, $t1, BRANCH |
Branch if not equal | if($t0 != $t1) goto BRANCH | bne $t0, $t1, BRANCH |
Set less than | $t0 = 1 if $t1 < $t2 | slt $t0, $t1, $t2 |
Set less than (immediate) | $t0 = 1 if $t1 < 8 | slti $t0, $t1, 8 |
jump | goto BRANCH | j BRANCH |
아래는 while문의 예제이다.
while (save[i] == k) i += 1;
i는 $s3, &save[0]은 $s6, k는 $s5에 저장돼있다 가정한다.
2~4번 라인은 save[i]를 구하는 과정이다.
먼저 $s3 (i) 를 좌측 쉬프트 2번해서 i*4를 해주고 배열의 주소값에 더해줘서 $t0(save[i])를 구한다.
5번 라인에서는 만약 구한 $t0(save[i])와 $s5(k)를 비교해서 다르다면 Exit로 점프를 해준다.
점프를 하지 않았다면 $s3(i)에 1을 더해주고 다시 1번 라인인 Loop 브랜치로 점프한다.
다음은 for문의 예제이다.
for(i=0; i<4; i++){//do something}
Loop를 시작하기 전에 $t0에 i=0으로 초기화해준다.
for문 안에 있는 블럭이 종료되면, i에 1을 더하고, $t1에 i<4 라면 1, 아니라면 0을 저장하도록 한다.
그리고 $t1과 0을 비교해서 다르다면 Loop로 점프한다.
switch문 구현법
1. if-else if-else문으로 구현
2. 각 case에 대한 레이블과 레이블이 실행될 때 수행될 코드블록의 주소를 매핑한 점프 테이블을 작성하고 조건값에 따라 해당되는 레이블의 주소를 찾아 실행시킴
'학교강의필기장 > 컴퓨터구조' 카테고리의 다른 글
컴퓨터구조[6]: 함수(프로시저)와 스택 포인터 2 - 재귀함수에서의 어셈블리 (0) | 2023.04.09 |
---|---|
컴퓨터구조[5] : 함수(프로시저)와 스택 포인터 1 (0) | 2023.04.09 |
컴퓨터구조[3] : R-type & I-type (0) | 2023.04.06 |
컴퓨터구조[2] : instruction set, add, sub, addi, lw, sw (0) | 2023.04.06 |
컴퓨터구조[1] : 시스템 소프트웨어 개요와 성능 판단 지표 (0) | 2023.04.06 |