指令集
指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效地运行。
Mips汇编语言的风格
汇编语言指令格式
[标签:] 操作符 [操作数] [#注释]
标签: (可选)
标记内存地址, 必须跟冒号
通常在数据和代码段出现
操作符
定义操作 (比如add, sub, 等)
操作数
指明操作需要的数据
操作数可以是寄存器,内存变量或常数
大多数指令有3个操作数
# this is acomment
entrypoint: # that’s a label
add $1 , $2,$3 # (registers) $1 = $2 + $3
# —— 注释
xxx:—— 定义代码的人口点和命名数据段的存储段
程序结构
汇编语言的程序结构,为数据声明+普通文本+程序编码(文件后缀为.s,或者.asm也行),数据声明在代码段之后(其实在其之前也没啥问题,也更符合高级程序设计的习惯)
数据声明
数据段以 .data为开始标志
声明变量后,即在主存(RAM)中分配空间。
Example:
var1:
.word 3 # 声明一个 word 类型的变量 var1,同时给其赋值为 3
array1:
.byte 'a','b' # 声明一个存储2个字符的数组array1,并赋值 'a','b'
array2:
.space 40 #为变量 array2 分配40字节(bytes)未使用的连续空间,当然,对于这个变量
代码:
代码段以 .text为开始标志
其实就是各项指令操作
程序入口为main:标志(这个都一样啦)
程序结束标志(详见下文)
其他:
.data //数据段
.text //代码段
.globl //全局符号声明
.align n //n字节对齐
.asciiz //字符串(带终止符)
.ent main //main函数的开始
.type main, @function //类型,指定为函数,但是也可以是变量
.set noreorder //设置属性为不优化代码
.set reorder //设置属性为优化代码
寄存器
32个通用寄存器:
MIPS的寄存器约定,一种32个寄存器
0 zero:总返回0
1 at: (汇编暂存寄存器)为汇编保留
2-3 v0、v1:存放子函数调用返回结果,还可用于表达式求值
4-7 a0- a3:存放向子函数传递的参数
8-15 t0-t7:存放临时运算结果,在发生函数调用时不必保存它们的内容
24,25 t8-t9:
16-23 s0 - s7:存放局部变量,在发生函数调用时一般要保存它们的内容
26,27 k0, k1:为中断/陷入处理保留,你也可以改变
28 gp:全局指针
29 sp: 栈(stack)指针
30 s8/fp: 帧(frame)指针
31 ra: 返回地址(用于过程调用
寄存器名约定与使用
*at: 这个寄存器被汇编的一些合成指令使用。如果你要显示的使用这个寄存器(比
如在异常处理程序中保存和恢复寄存器),有一个汇编directive可被用来禁止汇编
器在directive之后再使用at寄存器(但是汇编的一些宏指令将因此不能再可用)。
*v0, v1: 用来存放一个子程序(函数)的非浮点运算的结果或返回值。如果这两个寄
存器不够存放需要返回的值,编译器将会通过内存来完成。
*a0-a3: 用来传递子函数调用时前4个非浮点参数。在有些情况下,这是不是绝对的。请