写在前面
本文是根据"MIPS Assembly Language Programming CS50 Discussion and Project Book. Daniel J. Ellard"总结的。其中有大量的翻译文体以及个人的看法想法,当然,内容没有书上那么详尽。
这一章节会涉及MIPS的变量的声明、数据的输入输出、取地址、分支跳转语句(用以实行循环、判断等),基本上对应于任何一门高级语言的最基本操作。
简介
机器语言
正如我们在前一章中所看到的,计算机指令可以表示为位序列。一般来说,这是程序可能的最低表示级别——每条指令都相当于CPU的单个不可分割的动作。这种表示被称为机器语言,因为它是机器可以直接“理解”的唯一形式
汇编语言
一个高一层的表示(而且对人类来说更容易使用)称为汇编语言。汇编语言与机器语言有着非常密切的关系,通常有一种直接的方法将汇编语言编写的程序翻译成机器语言。(此算法通常由一个名为汇编程序(assembler)的程序实现。)
因为机器和汇编语言关系很近,每个不同的机器体系结构通常都有自己的汇编语言(事实上,每个体系结构可能有几个),并且每个都是唯一的。用 assember(而不是机器语言)编程的优势在于,汇编语言更容易让人阅读和理解。
开始编程
在这一章节中不会正式介绍所有指令,只是为了熟悉汇编和部分算法
1. 初步了解汇编
涉及到的新指令/标签
#
/**/
li
add
main
addi
syscall
正文
下面由一个add.asm为例开始了解汇编(语法结构等等),且暂时不严格要求指令之间的不同之处(后续会介绍具有类似功能的指令也会有一些差异)
1.1 注释
在开始编写程序的可执行语句之前,我们需要编写一个描述程序应该做什么的注释。
#和/**/都可以写注释
1.2 寻找正确的指令
由于MIPS体系结构的指令相对较少,很快你就会记住你需要的所有指令,但是随着你开始,你需要花一些时间浏览指令列表,寻找那些你可以用来做你想做的事情的指令。这些可以在第二部分找到。
加法运算需要三个操作数(operant)
li(load immediate value):将32位常量(32-bit constant)放入指定寄存器中
# add.asm
# begin of add.asm
li $t1,1 #load 1into register $t1
add $t0,$t1,2 #$t0 = $t1 + 2
1.3 补全程序
上面两条指令执行我们想要的计算,但它们并不构成一个完整的程序。与C类似,汇编语言程序必须包含一些附加信息,这些信息告诉汇编程序的开始和结束位置。此信息的确切形式因汇编程序而异(请注意,对于给定的体系结构,可能有多个汇编程序,而对于MIPS体系结构,可能有多个汇编程序)。本教程假设 SPIM被用作汇编和运行时环境。
(1)Label和main
标签(Label)是内存中地址的符号名称。在MIPS程序集中,标签是符号名(遵循与C符号名相同的