• 疑问: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,所以就没必要存储上再占空间,而计算的时候,则要还原它。

字节寻址而不是字寻址
【计算机系统设计】学习笔记(1)03,04-编程之家所有跳转指令的目标地址,编译存储的时候,都会➗4,实际运行的时候,都是乘以4还原

04 典型指令讲解

  1. MinSysy-1不处理异常

  2. addaddu的区别,前者溢出后进行异常处理,后者不进行,因此后者常用来进行地址计算(如果偏移量为负值,必然溢出,但实际上只是地址往上跳转而已)

  3. 由于暂时无异常处理,所以add和addu,addi和addiu实际一样。

  4. subsubu也一样, u 代表的含义是,溢出之后有没有异常处理。

  5. 对于立即数运算,逻辑运算imm是零扩展(例如andi),算术运算imm是符号扩展(例如addi),这很好理解,逻辑运算没有有无符号数的概念。(具体指令具体分析

  6. 【计算机系统设计】学习笔记(1)03,04-编程之家注意写操作rsrt的反着的,源是rt,目标地址是rs + 偏移量

  • 疑问:sw和lw指令,获取的地址==不是4的整倍数(字节不对齐)==的时候,应该如何处理?(比如直接忽略不对齐的部分,或者报异常)

对于字读取,如果不是4的倍数,那么最低两位不是00,但是存储的时候,也一样>> 2,又会给抹掉了。
【计算机系统设计】学习笔记(1)03,04-编程之家把16位立即数,赋值给32位寄存器的高16位。

对于beqbne指令,判断相等不相等,直接用减法(-)判断就行了。

  • 小于则赋值,条件赋值指令
    【计算机系统设计】学习笔记(1)03,04-编程之家
    【计算机系统设计】学习笔记(1)03,04-编程之家比大小,自然应该是算术运算,有符号数。

因此自然有无符号比较的小于置位

【计算机系统设计】学习笔记(1)03,04-编程之家【计算机系统设计】学习笔记(1)03,04-编程之家显然是逻辑上的,因此是零扩展

就类似于函数调用,调用完之后,要返回$31值对应的地址。

【计算机系统设计】学习笔记(1)03,04-编程之家
jal和jr配合,就实现了过程调用和返回

注意,有的是硬件设计相关,有的则是软件设计相关。

小结

把握指令集功能的内在联系,而不是堆砌它们。

  1. 零扩展还是符号扩展?
    1. 一般来说,算数运算是符号扩展
    2. 逻辑运算是零扩展
  2. 溢出检测还是不检测?(溢出:针对有符号数,正数 + 正数 = 负数、正数 – 负数 = 负数……)
    1. 算数运算,检测溢出
    2. 逻辑运算、地址运算,没必要检测
  3. 等于不等于的判断?直接复用减法就好了。