这部分使用到的就是在MIPS架构指令集一节中初步接触到的伪指令,在该程序中这些伪指令主要用途是标识数据段和代码段的位置,并为声明的数据分配空间。
.data
fibs: .space 48 # “array” of 12 words to contain fib values
size: .word 12 # size of “array”
space:.asciiz " " # space to insert between numbers
head: .asciiz “The Fibonacci numbers are:\n”
.text
在MARS中的Help文档MIPS->Directives一栏,对所有的伪指令都做了简要的介绍,如果大家想要进一步了解各个伪指令的具体用法,请自行上网搜索。接下来仅具体介绍程序中出现的这几条伪指令。(格式中[XXX]请用对应的数据替换)
1) .data
格式:.data [address]
说明:
定义程序的数据段,初始地址为address,若无address参数,初始地址为设置的默认地址。
需要用伪指令声明的程序变量需要紧跟着该指令。比如该程序中的fibs, size, space, head这四个变量。
-
.text
格式:.text [address]
说明:
定义程序的代码段,初始地址为address,若无address参数,初始地址为设置的默认地址。
该指令后面就是程序代码。
在MARS中如果前面没有使用.data伪指令,可以不使用.text直接编写程序代码,代码将放置在前面设置的代码段默认地址中,但如果前面使用了.data伪指令,务必在代码段开始前使用.text进行标注。 -
.space
格式:[name]: .space [n]
说明:
申请n个字节未初始化的内存空间,类似于其他语言中的数组声明。
这段数据的初始地址保存在标签name中。
name的地址是由.data段的初始地址加上前面所申请的数据大小计算得出的。由于前面申请的空间大小不定,有可能会出现后来申请的空间没有字对齐的情况,从而在使用sw,lw一类指令时出现错误,所以在申请空间时尽可能让n为4的倍数,防止在数据存取过程中出现问题。
在本例中,事先申请了48个字节也就是12个字的内存空间,用来保存我们之后计算出来的12个Fibonacci数,地址标签为fibs。
4) .word
格式:[name]: .word [data1],[data2] ….
说明:
在内存数据段中以字为单位连续存储数据data1,data2,… (也就是将datax写入对应的1个字的空间,注意.word和.space的区别)
这段数据的初始地址保存在标签name中。计算方式与上面相同。
在本例中,把需要计算的Fibonacci数的个数保存在了内存数据段,地址标签为size。
- .asciiz
格式:[name]: . asciiz “[content]”
说明:
以字节为单位存储字符串,末尾以NULL结尾。
这个字符串在内存数据区的初始地址保存在标签name中。
注意.asciiz与.ascii这两条伪指令的区别。
.asciiz由于是按字节存储,可能会导致之后分配的空间首地址无法字对齐的情况发生,请大家自行思考解决方法。
本例中,声明了两个字符串,一个是输出时需要用到的空格符,一个是输出语句,地址标签分别为space和head。
.ascii和.asciz的区别是,.asciz会在字符串后自动添加结束符\0.