leehyeon-dv 님의 블로그

2.9 Communicating with People 본문

컴퓨터구조 및 설계/2장. language of the computer

2.9 Communicating with People

leehyeon-dv 2024. 11. 16. 21:39

🔑Table of Contents

  1. Character Data   - 문자 데이터
  2. Byte/Halfword Operations
  3. String Copy Example
  4. 궁금한 점

📌 Character Data

  • Byte-encoded(1byte = 8bit) character sets
    • ASCII : 128개의 문자표현 (95개의 그래픽, 33개의 제어용)
    • Latin -1 : 256개의 문자표현 (ASCII보다 96개의 그래픽이 더 많음(191))
  • Unicode : 32-bit character set
    • java, C++ 등에서 쓰임
    • 대부분의 국가 언어 문자와 기호를 표현 가능
    • UTF-8, UTF-16 : 여러 길이의 인코딩이 존재함

📌Byte/Halfword Operations

 

  • bitwise operation(비트연산)으로 1비트씩 옮길 수도 있지만, byte/halfword 단위로도 데이터 이동이 가능함
  • MIPS byte/halfword load/store (바이트/하프워드 단위로도 데이터를 로드/저장 할수있음, 특히 String처리에서 유용)
    • lb rt, offset(rs)        lh rt,offset(rs)
      • 부호있는 8/16비트들을 메모리에서 불러와 32비트로 확장한 후 레지스터(rt)에 저장한다
      • 불러온 데이터의 하위 비트(LSB) 값에 따라 상위비트(MSB)가 0또는 1로 채워진다
        • 불러온 값의 MSB = 1, 확장된 비트는 1로 채워진다
        • 불러온 값의 MSB = 0, 확장된 비트는 0으로 채워진다
    • lbu rt, offset(rs)      lhu rt, offset(rs)
      • 부호없는  8/16비트들을 메모리에서 불러와 32비트로 확장한 후 레지스터(rt)에 저장한다
      • 불러온 데이터의 상위비트는 모두 0으로 채워진다
    • sb rt, offset(rs)        sh rt, offset(rs)
      • rt의 하위 8/16비트의 값을 메모리 주소(offset(rs))에 저장한다

 

📌String Copy Example

 

* C code:    ( null 문자(₩0)로 끝나는 string )

void strcpy (char x[], char y[]){
    int i = 0;
    while((x[i]=y[i]) != '\0'){ ++i; } }
    
//x,y -> $a0, $a1,  i -> $s0

 

* MIPS code:

strcpy:
    addi $sp, $sp, -4      # 스택 공간 확보
    sw   $s0, 0($sp)       # $s0 값을 스택에 백업
    add  $s0, $zero, $zero # i=0

L1:
    add  $t1, $s0, $a1     # $t1 = $s0 + $a1 (소스 문자열의 주소 계산)
    lbu  $t2, 0($t1)       # $t2 = y[i]
    add  $t3, $s0, $a0     # $t3 = $s0 + $a0 (목표 문자열의 주소 계산)
    sb   $t2, 0($t3)       # x[i] = y[i]
    beq  $t2, $zero, L2    # exit loof if y[i] == 0
    addi $s0, $s0, 1       # i = i+1
    j    L1                # 루프 반복

L2:
    lw   $s0, 0($sp)       # $s0 값 복구
    addi $sp, $sp, 4       # 스택 포인터 복구
    jr   $ra               # 함수 반환

 

📍?<궁금한점>📍

 

🔎 왜 Byte/Halfword Load/Store가 중요한가?

MIPS에서는 기본적으로 32비트단위로 데이터를 처리하지만, 문자열이나 작은 데이터를 처리할때는 8비트나 16비트 단위로 접근하는 것이 효율적이다