Byte-encoded character sets
→ 모두 1byte(8bit)으로 표현 가능
→ 하지만 영문자만 표현 가능하고 한글 불가능
Unicode : 32-bit character set
lb
, lh
: load byte/halfword by sign extension
lbu
, lhu
: load byte/halfword by unsigned extension
sb
, sh
: store byte/halfword
lb rt, offset(rs)
lh rt, offset(rs) → rs : 2byte align
→ Signed extend to 32 bits in rt
→ Short
lbu rt, offset(rs)
lhu rt, offset(rs) → rs : 2byte align
→ Zero extend to 32 bits in rt
→ Character, unsigned short
sb rt, offset(rs)
sh rt, offset(rs) → rs : 2byte align
→ Store just rightmost byte/halfword
C code :
void strcpy(char x[], char y[]) // $a0 : x[], $a1 : y[]
{
int i; // $s0 : i
i = 0;
while((x[i]=y[i])!='\\0')
i += 1;
}
Compiled MIPS code:
strcpy:
**addi $sp, $sp, -4** # adjust stack for 1 item -> $s0를 위한 공간
**sw $s0, 0($sp)** # save $s0
add $s0, $zero, $zero # i = 0
L1: add $t1, $s0, $a1 # addr of y[i] in $t1 -> character이므로 *4를 하지 않음
**lbu $t2, 0($t1)** # $t2 = y[i] -> unsigned extension : lbu
add $t3, $s0, $a0 # addr of x[i] in $s3 -> character이므로 *4를 하지 않음
sb $t2, 0($t3) # x[i] = y[i]
beq $t2, $zero, L2 # exit loop if y[i] == 0
addi $s0, $s0, 1 # i = i + 1
j L1
L2: **lw $s0, 0($sp)** # restore saved $s0
**addi $sp, $sp, 4** # pop 1 item from stack
jr $ra # and return