- 疑问:sw和lw指令,获取的地址==不是4的整倍数(字节不对齐)==的时候,应该如何处理?
东南大学MOCC 计算机系统综合设计 03
03-1 寄存器
介绍了MIPS寄存器,32个寄存器的基本功能和使用,注意
- 子程序调用寄存器
t
不保护与s
的保护 $31
寄存器在子程序嵌套调用下如何使用?$0
只能为0,写入其他值将会被忽略,但是允许写入,只是写完也没用
03-2 寻址方式
PC相对寻址
PC = (PC + 4) + ((sign-extend)imm << 2)
为什么要扩展后左移两位?因为32位指令进行字节对齐后,一定是4的倍数,因此最低两位一定是00
,所以就没必要存储上再占空间,而计算的时候,则要还原它。
(字节寻址而不是字寻址)
所有跳转指令的目标地址,编译存储的时候,都会➗4,实际运行的时候,都是乘以4还原。
04 典型指令讲解
-
MinSysy-1不处理异常
-
add
和addu
的区别,前者溢出后进行异常处理,后者不进行,因此后者常用来进行地址计算(如果偏移量为负值,必然溢出,但实际上只是地址往上跳转而已) -
由于暂时无异常处理,所以add和addu,addi和addiu实际一样。
-
sub
和subu
也一样,u
代表的含义是,溢出之后有没有异常处理。 -
对于立即数运算,逻辑运算imm是零扩展(例如andi),算术运算imm是符号扩展(例如addi),这很好理解,逻辑运算没有有无符号数的概念。(具体指令具体分析)
-
注意写操作的
rs
和rt
的反着的,源是rt
,目标地址是rs + 偏移量
- 疑问:sw和lw指令,获取的地址==不是4的整倍数(字节不对齐)==的时候,应该如何处理?(比如直接忽略不对齐的部分,或者报异常)
对于字读取,如果不是4的倍数,那么最低两位不是00
,但是存储的时候,也一样>> 2
,又会给抹掉了。
把16位立即数,赋值给32位寄存器的高16位。
对于beq
和bne
指令,判断相等不相等,直接用减法(-)
判断就行了。
- 小于则赋值,条件赋值指令
比大小,自然应该是算术运算,有符号数。
因此自然有无符号比较的小于置位
。
显然是逻辑上的,因此是零扩展。
就类似于函数调用,调用完之后,要返回$31
值对应的地址。
jal和jr配合,就实现了过程调用和返回。
注意,有的是硬件设计相关,有的则是软件设计相关。
小结
把握指令集功能的内在联系,而不是堆砌它们。
- 零扩展还是符号扩展?
- 一般来说,算数运算是符号扩展
- 逻辑运算是零扩展
- 溢出检测还是不检测?(溢出:针对有符号数,正数 + 正数 = 负数、正数 - 负数 = 负数……)
- 算数运算,检测溢出
- 逻辑运算、地址运算,没必要检测
- 等于不等于的判断?直接复用减法就好了。