前言
(计算机组成北大mooc第二节课的课后作业,拖了一个星期终于着手做了qaq。)题目是两道使用MIPS指令体系完成简单程序设计的实战,编程内容很简单,但是自学完整的mips指令体系工作量还是不小的。
1.MARS准备
题目推荐使用MARS(MIPS Assembler and Runtime Simulator)集成开发环境作为实验平台。官网链接:https://courses.missouristate.edu/KenVollmar/Mars/index.htm .在官网下载MARS(题目推荐4.4版本)后,得到一个jar格式的文件,需要配置JRE或JDK,即java运行环境之后即可打开。
MARS其中有非常多值得挖掘的地方。写好的asm文件只需run->assemble->run current file即可运行。同时在最上面的帮助栏有非常多关于MIPS指令体系的指导,包括所有指令、系统调用等等做题时需要用到而课上略过的信息。
2.Syscalls
两道题的重点是输入输出,在编程时具体的应用是MIPS的系统调用syscall。具体的内容在MARS的帮助中都可找到。
使用方法
Step 1. 在寄存器$v0中存入service number
Step 2.在寄存器$a、$a1中存储变量
Step 3. 使用syscall命令
syscall指令集(摘自MARS)
Table of Available Services
Service | Code in $v0 | Arguments | Result |
---|---|---|---|
print integer | 1 | $a0 = integer to print | |
print float | 2 | $f12 = float to print | |
print double | 3 | $f12 = double to print | |
print string | 4 | $a0 = address of null-terminated string to print | |
read integer | 5 | $v0 contains integer read | |
read float | 6 | $f0 contains float read | |
read double | 7 | $f0 contains double read | |
read string | 8 | $a0 = address of input buffer $a1 = maximum number of characters to read | |
sbrk (allocate heap memory) | 9 | $a0 = number of bytes to allocate | $v0 contains address of allocated memory |
exit (terminate execution) | 10 | ||
print character | 11 | $a0 = character to print | |
read character | 12 | $v0 contains character read |
这两道题重点使用Service 1,4,8,11,12,具体的使用方法指导如上,具体实现方法见下代码。
第一题:用系统功能调用实现简单输入输出
利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:
(1) 如果输入的是字母或数字,则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表
(2) 若输入的不是字母或数字,则在屏幕上输出字符“*”,
(3) 每输入一个字符,即时转换并在屏幕上显示,
(4) 支持反复输入,直到按“?”键结束程序。
A | Alpha | N | November | 1 | First | a | alpha | n | november |
---|---|---|---|---|---|---|---|---|---|
B | Bravo | O | Oscar |