Mars 模拟器编写 mips32 汇编 的入门教程
Mars简介
An IDE for MIPS Assembly Language Programming.
MARS是一个轻量级的交互式开发环境(IDE),用于使用MIPS汇编语言进行编程,旨在与Patterson和Hennessy的计算机组织和设计一起用于教育级别。)
我为什么要自己写这篇教程???
之前通过学习cs61c 也已经掌握了不少的 mips 汇编指令, 但都只是在纸上写,没有真正的验证. 于是乎下载了 Mars, 却无法做到完整的汇编出 mips 代码,所以想要知根知底的搞清楚,要怎样用怎样的格式写才能被 Mars 所接受. 在网上看过不少的基础教程,但都没有讲到Mars的编写格式与特斯特性。所以就有了这篇文章。
基础知识
在了解基本使用之前,需要了解一些基础知识
宏汇编语言有3类基本指令:符号指令、伪指令和宏指令。
1. 伪指令
伪指令只为汇编程序将符号指令翻译成机器指令提供信息,没有 与它们对应的机器指令
.set push/.set pop等等。
2. 宏指令
把一个指令序列定义为一条宏指令, 便于书写
指令
li $t1,40
是一条伪指令,在汇编器中会转换成
addi $t1,$zero,40
但是
li $t1,-4000000
因为数字太大,需要拆开,则会被转换成
lui $at,0xffc2
ori $t1,$at,0xf700
这之中,$at就作为一个中间变量来用的
3. 符号指令
一. MIPS程序结构
必须这样写 Mars 才能成功汇编
.data
.text#开始你的 mips 代码
main:
#.......
1.Data Declarations
在.data指令之后:将程序将使用的数据存储在RAM中。
2.Code
在.text指令后:包括程序代码,其中程序代码的起点是main:指令,并用syscall结束程序。
3.Comments
注释不用说了 ~注释符号是#
二. 如何输入输出???
Use syscall to call operating system routine call, 把对应的系统服务编码放进v0中,再syscall就可以调用相应的系统服务。系统调用是操作系统提供的一组服务。要使用系统调用,需要将调用代码放入v0中,再syscall就可以调用相应的系统服务。 系统调用是操作系统提供的一组服务。要使用系统调用,需要将调用代码放入v0中,再syscall就可以调用相应的系统服务。系统调用是操作系统提供的一组服务。要使用系统调用,需要将调用代码放入 v0寄存器以进行所需操作。如果系统调用有参数,则将它们放在$ a0- $ a2寄存器中。
Syscall 是Mars 中输出的方式. 通过将 $v0 设置成不同的值来在控制台输出 不同register中的值(会以不同的输出方式),
详情见下表:
http://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html
如果懒得看,这里提供给一个最基本的程序范例:
输出
.data
.text
main:addi $a0 $zero 666addi $v0 $zero 1 #v0设置为1, 代表 syscall 将输出 $a0 register 的值syscall
结果输出: 666
输入
data
.text
main:li $v0 5 #v0设置为5, 代表 syscall 将从键盘缓冲区读入一个数进v0syscalladd $a0 $v0 $zeroli $v0 1 #syscall
输出
二. Mars 的新手"陷阱"
1. main 函数的返回值
c语言中 main 函数为
int main()
{func();return 0;
}
在 MIPS 中要写成如下形式:
main:
jal func
addi $v0 $v0 10 #v0设置为10, 代表 syscall 将执行 exit
syscall
这是因为 main 没有其调用者, 所以 $ra 为 0, 关于 $ra, The correct way to end a program on MARS is using the “exit” syscall.
即:
addi $v0 $v0 10
syscall
并且将 main 过程放在所有函数之前.
2. mips 调用子程序
主程序与子程序之间的转返
调用:jal func
返回:jr $ra主程序与子程序间的信息传递
通过公用寄存器实现主程序和子程序公用寄存器的问题
使用栈解决
Mars 模拟器编写 mips32 汇编 的入门教程相关推荐
- 前端开发入门教程-HTML标签(上)
本文素材来源于黑马程序员pink老师的前端教学视频.在此基础上有部分改动. 博客文章: https://blog.manchan.top/post/introduction-to-front-end- ...
- 【Gazebo入门教程】第六讲 控制器插件的编写与配置(下)
[Gazebo入门教程]第六讲 控制器插件的编写与配置(下) \qquad 文章目录 [Gazebo入门教程]第六讲 控制器插件的编写与配置(下) 一.系统插件 二.Velodyne传感器插件 1. ...
- 【Gazebo入门教程】第五讲 控制器插件的编写与配置(上)
[Gazebo入门教程]第五讲 控制器插件的编写与配置(上) 文章目录 [Gazebo入门教程]第五讲 控制器插件的编写与配置(上) 一.控制插件的使用方法 1. 插件简介 2. 插件编写流程 二.模 ...
- 用python写脚本看什么书-终于知晓python编写脚本入门教程
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...
- oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...
PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)mp.weixin.qq.com https://www.zhihu.com/video/12422083467175 ...
- MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排
本系列教程来源于出版设计<基于MATLAB编程基础与典型应用书籍>,如涉及版权问题,请联系:156204968@qq.com. 出版社:人民邮电出版社, 页数:525. 本系列教程目前基于 ...
- SEO零基础入门教程(外链的发布和软文编写)
seo的作用是众所周知的,对网站进行seo优化,可以给网站带来大量的搜索引擎流量.但是想要做好网站优化也有难度,尤其是对于seo新手来说,因为缺乏理论和实战,所以seo新手需要多加练习.那么具体seo ...
- C#,入门教程(03)——Visual Studio 2022编写彩色Hello World与动画效果
C#,入门教程(01)-- Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123 ...
- Linux pwn入门教程——CTF比赛
Linux pwn入门教程(1)--栈溢出基础 from:https://zhuanlan.zhihu.com/p/38985585 0x00 函数的进入与返回 要想理解栈溢出,首先必须理解在汇编层面 ...
最新文章
- Linux系统自动更新时间
- 栏目图片 栏目描述_昕街拍|长期福利栏目来啦,秀街拍赢礼品!
- kibana 更新 索引模式_Kibana对索引动态加字段显示
- 电脑休眠和睡眠的区别_关机、睡眠、休眠有啥区别?微软说非特殊情况不要关机...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
- Apsara Stack 技术百科 | 可运营的行业云,让云上资源跑起来
- 前端开发 常见的网页导航制作 0228
- C++ set与map、unordered_map、unordered_set与哈希表
- Eclipse单行和多行注释快捷键以及撤销注释
- 李彦宏:百度今年全员涨薪,比去年还多;谷歌暂停Chrome浏览器更新;Eclipse 4.15发布 | 极客头条...
- Tensorflow:分类模型评估
- 计算机做无线AP共享文件,Win7开启AP无线一键共享网络(包括闪讯)给wifi设备使用!...
- sql limit不接具体数字_MySQL的Limit 性能差?真的不能再用了?
- Pyts入门之时间序列的分解---奇异谱分析(七)
- LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。
- H5新特性 - 新增标签
- Fiddler抓手机app的包
- 修改Chrome默认的搜索引擎
- 卸载WPS后,原office出现各种问题,报错,图标混乱
- RDD编程初级实践(期末大作业)
热门文章
- 【C】牛客网 编程入门训练138道题
- C#特性——Description
- AttributeError: ‘Upsample‘ object has no attribute ‘recompute_scale_factor‘
- 计算机不能上网查找原因的步骤,电脑不能上网的原因及操作步骤_电脑突然不能上网...
- 英文歌曲:What I Have Done(变形金刚第一部主题曲)
- C# 流不可读 解决办法
- 外网访问8080以及80端口失败问题解决
- 本科去向选择之一——工作
- (字符串分解器)StringTokenizer类的使用_无名小仙男
- 《我想进大厂》之Dubbo普普通通9问