본문 바로가기
BackEnd/Computer Architecture

1.2.5 어셈블리어로 문자와 문자열 사용해보기

by 12312121 2022. 2. 27.

문자 구현의 원리
컴퓨터가 레지스터로 문자를 표현하는 방식은 언어처럼 특정 십진수와 특정 문자가 같다고 약속으로 정해두고 그렇게 인식하도록 CPU를 설계하는 것이다.
그것에 대한 규약이 ASCII(American Standard Code for Information Inter-change)

문자 0은 null을 의미한다. 대문자와 소문자가 정확히 32씩 차이나서 대소문자 변환이 쉽다

문자열 구현의 원리
문자 데이터 모아서 문자열을 만드는데, 컴퓨터가 어디까지가 문자로 처리할 지를 결정하도록 하기 위해 문자열의 길이에 대한 정보도 같이 써야한다. 이때 쓰는 방식은 다음 3가지로 나뉜다.
1. 문자열의 맨 앞에 길이를 표시 (JAVA)
2. 구조체처럼 같이 사용되는 변수가 그 길이를 표현 하도록 하기
3. 마지막에 문자열의 끝을 표시하는 특수문자를 두기 (C)

어셈블리어로 문자열 복사 프로시저 구현
void strcpy (char x[], char y[])
{
size_t i;
i = 0;
while ( (x[i] = y[i]) != '\0' )
i += 1
} // x[0] = x10, y[0] = x11, i = x19
____________________________________
strcpy: // i 생성
addi sp, sp, -8 // sp의 공간할당
sd x19, 0(sp) // x19 보존
add x19, x0, x0 // i = 0

L1: // 문자열 복사
add x5, x19, x11 // x5 = y[i]
lbu x6, 0(x5) // x6 = x5
add x7, x19, x10 // x7 = x[i]
sb x6, 0(x7) // x7 = x6 (x[i] = y[i])

beq x6, x0, L2 // if ( x[i] >= 0 ) goto L2

addi x19, x19, 1 // i++
jal x0, L1 // L1 재실행

L2: //종료
ld x19, 0(sp) // x19 복구
addi sp, sp, 8 // sp의 공간반납
jalr x0, 0(x1) // 종료


유니코드
뜻 : 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준

크기 : 한 글자를 몇 비트로 표시할 것인지는 유니코드 종류에 따라 다르다.
기본으로 쓰는 것은 16비트를 쓰는 UTF-16
그외 32비트를 쓰는 UTF-32도 있다. 예외로
UTF-8은 ASCII를 8비트로, 그외는 16~32비트.

RISC-V의 유니코드 load 명령어
lhu, lh (load halfword, 16비트를 우측에 채우고나서 나머지는 0으로 부호확장한다. 32비트를 넣을 경우엔 lwu (=load word)를 쓰는데 반면 lw는 좌측에 채우게 된다)
RISC-V의 유니코드 stkre 명령어
sh (store halfword)

댓글