MIPS SYSCALL指令如何工作?

时间:2016-09-12 02:31:37

标签: assembly mips cpu-architecture

我们很清楚有三种类型的中断:

  1. 内部中断
  2. 外部中断
  3. 软件中断
  4. 因此系统调用是软件中断。二进制形式的MIPS SYSCALL指令是 00000000000000000000000000001100

    当cpu 获取此指令并执行时会发生什么。这个指令在某些寄存器之前传递的参数在这里很重要,关键问题是这个指令本身是什么,他的工作是什么,它在cpu中是如何工作的。

    只运行此指令会对机器的架构状态产生什么影响?

    这意味着哪个寄存器值受此系统调用(指令)影响,它标记它打开,它完成其工作的步数,如果它跳转到另一个内存位置(如中断向量表)它是怎么回事找到那些内存位置的地址

1 个答案:

答案 0 :(得分:1)

这可能取决于您正在谈论的MIPS处理器,但是对于最新版本的MIPS32架构,SYSCALL指令会导致系统调用异常,该异常向量通过执行位于异常向量的偏移量0x180处的代码来处理基础。

具体而言,在实现MIPS32 ISA版本6的CPU上发生的情况如下:

  • 如果Status.EXL == 0则:
    • 如果分支延迟槽中的SYSCALL指令:
      • EPC = PC - 4
      • 原因.BD = 1
      • BadInstr =记忆[PC]
      • BadInstrP =记忆[PC - 4]
    • 如果SYSCALL指令不在分支延迟槽中:
      • EPC = PC
      • 原因.BD = 0
      • BadInstr =记忆[PC]
    • 如果SRSCtl.HSS> 0和Status.BEV == 0然后:
      • SRSCtl.PSS = SRSCTL.CSS
      • SRSCtl.CSS = SRSCTL.ESS
  • Cause.CE = undefined
  • Cause.ExcCode = 0x8(Sys)
  • Status.EXL = 1
  • 如果Status.BEV == 0:
    • PC = 0xBFC0380
  • 如果Status.BEV == 1:
    • PC = EBase + 0x180

名称Status,EPC,BadInstr,BadInstrP,SRSCtl,Cause和EBase都是协处理器0(CP0)寄存器,因此您无法在大多数MIPS文档中找到它们。句点(。)后面的后缀表示这些寄存器的子字段。

有关详细信息,请阅读MIPS Architecture For Programmers Vol. III: MIPS32/microMIPS32 Privileged Resource Architecture手册。