QtSPIM MIPS汇编程序已经显示了一些代码行,即使没有加载程序,就像在 https://ecs-network.serv.pacific.edu/ecpe-170/tutorials/qtspim-tutorial 上看到的那样。
我认为这是加载程序所必需的,但我对理解所有细节的确切解释非常感兴趣。
QtSPIM程序由两部分组成:异常处理程序和用户程序。
默认异常处理程序包括一个简短的用户模式启动代码序列(在0x00400000
加载(以及位于内核内存.ktext
中的实际异常处理程序,它从0x80000180
开始,
加载用户程序时,它会追加到大约位置0x00400024
的用户模式代码(来自异常处理程序(。 您还可以看到,直到您使用main
加载程序,main
的地址(在该启动代码中(被视为 0,即未定义。
您可以将默认异常处理程序替换为您自己的异常处理程序。 使用Simulator
菜单、Settings
子菜单、MIPS
选项卡、Load Exception Handler
(或Use default exception handler
(。
在异常处理程序文件中,您将实际处理程序放在.ktext
指令之后,并且将开始序列放在.text
指令之后 — 这是可选的。如果您不提供,那么main
无处可返回,因此要正常终止模拟器,您必须通过syscall
退出,而不是简单地返回。
另一个流行的模拟器 MARS 不包括此默认用户模式启动代码序列,因此 MARS 程序始终必须使用系统调用退出main
。
默认异常处理程序打印异常的原因,并且不执行其他操作。
例如,如果要执行中断驱动的控制台 I/O,则可以编写自己的异常处理程序。 QtSPIM还支持定时器,它也使用中断机制。 你也可以实现陷阱处理程序(teq
、tne
、teqi
、tnei
指令(,但syscall
指令总是由MIPS异常处理机制之外的QtSPIM处理。