MIPS 汇编简单学习

What ‘s the MIPS?

汇编语言

首先要普及一下汇编的相关知识,汇编语言是一类语言的总称,因处理器的不同,而对应着不同的机器语言指令集,产生了很多种汇编语言,如,基于INTEL 8086处理器的x8086汇编语言,还有接下来要说到的MIPS汇编语言。汇编语言不像高级语言Java,Python,Kotlin等,只要配置相关环境,同一段代码可以在不同操作系统上运行,而不同操作系统,不同的指令集,就要用不同的汇编语言。

MIPS

为了选择一个大家能一起玩的,又要很方便的汇编语言,我选择了MIPS(Million Instructions Per Second)。至于具体原因,emmmm,,,,,再说再说。

工具

俗话说,预先善其事必先利器其。MIPS有一个十分Perfect的工具MIPS MARS。提醒一下,因为工具是jar,所以请事先配置Java环境。


Get It

Hello World

$ print ("hello world")
$ echo hello world
$ System.out.println("hello world");
$ cout << "hello world";
...

不知道有没有你熟悉的一套,想用MIPS写一个hello world可没那么简单。首先我们了解一下这个Mars的界面。
MIPS 汇编简单学习_第1张图片

介绍本章的几个指令

  • li [地址值] , [参数值]
  • add [地址值] , [地址值] , [地址值 | 参数值]
  • move [地址值1], [地址值2]
li   $t1, 1
li   $t2, 2
# $t1 = 1, $t2 = 2

add  $t1, $t1, $t2
# $t1 = $t1 + $t2

move $t1, $t2
# $t1 = $t2

把这个写完以后,点击菜单栏 File-save 或 Ctrl + S保存,再点击菜单栏 Run-Assemble 或 F3键。

然后好戏开始了~~~~,我们可以点击哪两个大大的运行(单步和一步),推荐单步调试,仔细关注一下右边CPU的情况,最后,当当当,存储在$t1中的值变成了 3 。

我相信肯定很多人觉得不愿意,没有输出在界面下面,下面不舒服。

syscall #打印 $a0 中的参数

$v0 的参数值决定 syscall 的输出类型,syscall 输出的值为 固定地址的值。你们要好好看帮助文档,如果我都写下来就是对你们的溺爱。
(一本正经胡说八道,原谅我懒得一个一个敲…orz)
MIPS 汇编简单学习_第2张图片

由帮助文档我们知道,当 $v0 值为1时,syscall 会输出 interger类型的 $a0 参数值。那么完整版 1 + 2 = 3来了。

li   $t1, 298
li   $t2, 222
add  $t2, $t1, $t2
move $a0, $t2
li   $v0, 1
syscall

编程格式

在稍微大一点的代码,我们会将汇编代码的写为如下格式。

.data
    #数据段
.text
    #代码段

la 指令是使地址1指向地址2。

la [地址值1], [地址值2]

数据的类似于设置全局变量,代码段类似于代码的主函数。
我们回到正题,是时候放出 Hello World 了。

# 论加\0的重要性
.data
msg0:    .ascii "hello world"
msg1:    .ascii "dont see me"
.text
la   $a0, msg0
li   $v0, 4
syscall

注: 这就是为什么C字符串要以\0结尾了。2333333333333

你可能感兴趣的:(语言学习)