본문 바로가기
컴퓨터시스템구조

[컴퓨터시스템구조] 10. MIPS 문자열 연산자(lb, lh, sb, sh)

by 파스텔코랄 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가 아니다)

댓글