长亭百川云 - 文章详情

十分钟教会你MIPS编程入门

物联网IoT安全

56

2024-07-13

本文从四个方面来介绍MIPS架构及其汇编:

1. 寄存器种类

2. 算术及寻址指令

3. 程序结构

4. 系统调用

需要使用的工具是:Mars4.4

下载地址:

http://courses.missouristate.edu/KenVollmar/mars/download.htm

1 数据类型

1. 所有MIPS指令都是32位长

2. 1字节 = 8位,半字长 = 2个字节,1字长 = 4个字节

3. 一个字符空间 = 1个字节

4. 一个整型 = 一个字长 = 4个字节

5. 单个字符用单引号,例如:'b'

6. 字符串用双引号,例如:"A string"

2 寄存器

1. MIPS下一共有32个通用寄存器

2. 在汇编中,寄存器标志由$符开头

3. 寄存器表示可以有两种方式

    直接使用该寄存器对应的编号,例如:从$0到$31

    使用对应的寄存器名称,例如:$t1,$sp(详细名称见下表)

4. Lo和Hi寄存器专门用来存储乘法和除法的结果

    对于以上两者,不存在直接寻址;必须要通过特殊指令mfhi ("move from Hi") 和 mflo ("move from Lo")来访问内容

5. 栈的走向是高地址到低地址

3 程序结构

1. 本质其实就是数据声明 + 普通文本 + 程序编码(文件扩展名为 .s或者 .asm都可以)

2. 数据声明在代码段之后(其实在之前也没啥问题,也更符合高级程序的设计习惯)

数据声明:

1. 数据段以.data为开始标志

2. 声明变量后,即在主存中分配空间

代码:

1. 代码段以 .text为开始的标志

2. 其实就是各项指令操作

3. 程序入口为main:标志(这个都一样)

4. 程序结束标志

注释:

1. 是注释符

2. MIPS程序的基本模版如下:

# Comment giving name of program and description of function

4 数据声明

声明的格式:

name:    storage_type     value(s)

通常给变量赋一个初始值;对于.space,需要指明需要多少大小空间(bytes)

注意:name后面始终要跟着冒号

example

5 加载保存【读取写入】

1. 如果要访问内存,不好意思,你只能用 load 或者 store 指令

2. 其他的只能都一律是寄存器操作

load:

举例

  .data

6 立即与间接寻址

load address:

不必多说,要用到偏移量的寻址,基本上使用最多的场景无非两种:数组,栈。

    .data

7 算术指令集

1. 最多3个操作数

2. 在这里,操作数只能是寄存器,绝对不允许出现地址

3. 所有的指令统一是32位 = 4 * 8 bit = 4 bytes = 1 word

    add  $t0,$t1,$t2  

8 控制流

branches分支(if else系列)

指令内置了分支条件的比较:

b  target    #  unconditional branch to program label target

Jumps跳转(while,for,goto系列)

j  target  #  unconditional jump to program label target

子程序调用 subroutine return: "jump register" instruction

jr  $ra  #  "jump register"

跳转到寄存器$ra中保存的返回地址(由jal指令存储)

如果说调用的子程序中有调用了其他子程序,如此往复, 则返回地址的标记就用栈(stack)来存储, 毕竟 $ra 只有一个,(哥哥我分身乏术啊)

9 系统调用和输入/输出

1. 通过系统调用实现终端的输入输出,以及声明程序结束

2. 学会使用 syscall

3. 参数所使用的寄存器:$v0, $a0,  $a1

4. 返回值使用:$v0

大概意思是要打印的字符串应该有一个终止符,估计类似C中的'\0', 在这里我们只要声明字符串为 .asciiz 类型即可。下面给个我用Mars4.4的提示:

1. 对于读取整型, 浮点型,双精度的数据操作, 系统会读取一整行,(也就是说以换行符为标志 '\n')

2. read_stringfgets类似

举例 打印一个存储在寄存器$2里的整型:

Print out integer value contained in register $t2

举例 读取一个数,并且存储到内存中的 int_value 变量中:

Read integer value, store in RAM location with label int_value (presumably declared in data section)

举例 打印一个字符串(这是完整的,其实上面栗子都可以直接替换main: 部分,都能直接运行

    .data

举例 执行到这里,程序结束,立马走人,管他后边洪水滔天~~

li  $v0, 10      # system call code for exit = 10

参考引用:

本文属于转载非原创,略有修改: https://www.cnblogs.com/thoupin/p/4018455.html
相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2