MIPS中的字符与字符串
一、一个字符的长度
今天大多数计算机使用8位的字节来表示一个字符,即ASCII码。但是需要了解的是,Java采取Unicode编码方法,为了更具有包容性,该编码采用16位,即一个半字来表示一个字符。另外的一点区别是,C字符串以空字符’\0’来标示字符串的结束,但是Java中的字符串是没有结束符的。
二、MIPS实现字符的存取
1、对于用字节来表示的字符
①取字节(load byte)
示例:lb $s0,0($sp)
含义:将栈指针sp指向的寄存器的最右边的8位放入s0中最右边的8位,并将取到的8位中的最高位(符号位)填充到左24位中的每一位。
②存字节(store bytes)
示例:sb $s0,0($gp)
含义:将寄存器 s0 中的低 8 位数据存储到全局指针 $gp指向的内存地址处
2、对于用半字来表示的字符
①取半字(load half)
示例:lh $s0,0($sp)
含义:将栈指针sp指向的寄存器的最右边的16位放入s0中最右边的16位,并将取到的16位中的最高位(符号位)填充到左16位中的每一位。
②取半字(load half unsigned)
示例:lhu $s0,0($sp)
含义:将栈指针sp指向的寄存器的最右边的16位放入s0中最右边的16位,没有符号位的扩展
②存半字(store half)
示例:sh $s0,0($gp)
含义:将寄存器 s0 中的低16位数据存储到全局指针 $gp指向的内存地址处
3、栈和字地址的对齐
MIPS试图保存栈和字地址的对齐,因此程序总是用lw和sw来访问栈,这意味着一个字符在栈中被分配了四个字节,尽管他不需要这么多。这就是上面使用全局指针而不是栈指针来示范存半字和存字节的原因