Byte(1Byte)/Halfword(2Byte) 연산자
- 비트 연산을 사용할 수 있다.
- Sign
lb rt, offset(rs) # rs 메모리 주소에서 1바이트만큼 rt 레지스터에 저장
lh rt, offset(rs) # rs 메모리 주소에서 2바이트만큼 rt 레지스터에 저장
- Unsigned
- 0으로 확장
lbu rt, offset(rs)
lhu rt, offset(rs)
- Store
sb rt, offset(rs)
sh rt, offset(rs)
문자열 복사 예제
- 문자열을 1바이트 씩 복사해서 옮기기
- C 코드
- Null로 끝나는 문자열
- 널 스트링(\0)을 만날때까지 계속 배열 인덱스를 증가시키면서 복사하는 코드
- 다른 함수를 호출하지 않는다. → Leaf 프로시저 → 스택에다가 $s 레지스터를 저장한다.
void strcpy (char x[], char y[]) {
int i;
i = 0;
while ((x[i]=y[i]) != '\0')
i += 1;
}
- x(타겟) 주소 : $a0
- y(소스) 주소 : $a1
- i : $s0
- MIPS 코드
strcpy:
addi $sp, $sp, -4 # callee가 overwrite하지 않도록
sw $s0, 0($sp) # 스택에 $s0 저장
add $s0, $zero, $zero # i($s0) 0으로 초기화
L1:
add $t1, $s0, $a1 # $t1 = &x[i]
lbu $t2, 0($t1) # $t2 = x[i]
add $t3, $s0, $a0 # $t3 = &y[i]
sb $t2, 0($t3) # x[i] = y[i]
beq $t2, $zero, L2 # 만약 x[i]==0(null)이라면 L2로 이동
addi $s0, $s0, 1 # i = i + 1
j L1 # L1으로 점프(while 반복)
L2:
lw $s0, 0($sp) # 스택에 저장했던 원래 $s0 불러오기
addi $sp, $sp, 4 # 스택 오프셋 복원
jr $ra # 리턴
- 차이점
- 1. 문자열은 배열 오프셋을 계산할 때 1바이트씩 이동을 한다.(워드에서 sll 2비트)
- 인덱스에다가 베이스 주소만 더해주면 오프셋을 구할 수 있다.
- 2. 값을 읽어올때 Load Byte를 쓴다(Load Word가 아니다)
- 1. 문자열은 배열 오프셋을 계산할 때 1바이트씩 이동을 한다.(워드에서 sll 2비트)
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 12. MIPS 주소지정 정리 (0) | 2023.10.14 |
---|---|
[컴퓨터시스템구조] 11. MIPS 주소지정 (0) | 2023.10.14 |
[컴퓨터시스템구조] 09. MIPS 프로시저 호출(jal, jr) (1) | 2023.10.14 |
[컴퓨터시스템구조] 08. MIPS 조건부 연산자(beq, bne, j, slt) (0) | 2023.10.14 |
[컴퓨터시스템구조] 07. MIPS 논리 연산자(sll, srl, and, or, nor) (0) | 2023.10.14 |
Byte(1Byte)/Halfword(2Byte) 연산자
- 비트 연산을 사용할 수 있다.
- Sign
lb rt, offset(rs) # rs 메모리 주소에서 1바이트만큼 rt 레지스터에 저장
lh rt, offset(rs) # rs 메모리 주소에서 2바이트만큼 rt 레지스터에 저장
- Unsigned
- 0으로 확장
lbu rt, offset(rs)
lhu rt, offset(rs)
- Store
sb rt, offset(rs)
sh rt, offset(rs)
문자열 복사 예제
- 문자열을 1바이트 씩 복사해서 옮기기
- C 코드
- Null로 끝나는 문자열
- 널 스트링(\0)을 만날때까지 계속 배열 인덱스를 증가시키면서 복사하는 코드
- 다른 함수를 호출하지 않는다. → Leaf 프로시저 → 스택에다가 $s 레지스터를 저장한다.
void strcpy (char x[], char y[]) {
int i;
i = 0;
while ((x[i]=y[i]) != '\0')
i += 1;
}
- x(타겟) 주소 : $a0
- y(소스) 주소 : $a1
- i : $s0
- MIPS 코드
strcpy:
addi $sp, $sp, -4 # callee가 overwrite하지 않도록
sw $s0, 0($sp) # 스택에 $s0 저장
add $s0, $zero, $zero # i($s0) 0으로 초기화
L1:
add $t1, $s0, $a1 # $t1 = &x[i]
lbu $t2, 0($t1) # $t2 = x[i]
add $t3, $s0, $a0 # $t3 = &y[i]
sb $t2, 0($t3) # x[i] = y[i]
beq $t2, $zero, L2 # 만약 x[i]==0(null)이라면 L2로 이동
addi $s0, $s0, 1 # i = i + 1
j L1 # L1으로 점프(while 반복)
L2:
lw $s0, 0($sp) # 스택에 저장했던 원래 $s0 불러오기
addi $sp, $sp, 4 # 스택 오프셋 복원
jr $ra # 리턴
- 차이점
- 1. 문자열은 배열 오프셋을 계산할 때 1바이트씩 이동을 한다.(워드에서 sll 2비트)
- 인덱스에다가 베이스 주소만 더해주면 오프셋을 구할 수 있다.
- 2. 값을 읽어올때 Load Byte를 쓴다(Load Word가 아니다)
- 1. 문자열은 배열 오프셋을 계산할 때 1바이트씩 이동을 한다.(워드에서 sll 2비트)
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 12. MIPS 주소지정 정리 (0) | 2023.10.14 |
---|---|
[컴퓨터시스템구조] 11. MIPS 주소지정 (0) | 2023.10.14 |
[컴퓨터시스템구조] 09. MIPS 프로시저 호출(jal, jr) (1) | 2023.10.14 |
[컴퓨터시스템구조] 08. MIPS 조건부 연산자(beq, bne, j, slt) (0) | 2023.10.14 |
[컴퓨터시스템구조] 07. MIPS 논리 연산자(sll, srl, and, or, nor) (0) | 2023.10.14 |