9. Communicating with People

9.1. Character Data

9.2. Byte/Halfword Operations

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

9.3. String Copy Example

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

10. MIPS Addressing for 32-Bit Immediates and Addresses

10.1. 32-bit Constants