我是一名大二的学生,专业是信科。现在在自学,发笔记,主要是觉得这样自己可以理解的更加透彻,如果能对像我一样的菜鸟有帮助的话那就更好了,在看这本书之前,我自学了王爽编的《汇编语言》,所以在理解起来要稍微轻松一些。
如果哪位牛人看到了能给提出错误,不足和意见那真的非常感谢!(希望别有骂声。。。)
第二章:计算机的语言
本章主要讲解MIPS汇编语言,汇编语言有好几种,主要有Inter x86,ARM,MIPS,因为处理器结构不同,不同的汇编语言对应着不同的处理器,就像每个国家有自己的语言一样。
重要概念介绍:
寄存器:“寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。”--百度百科。通俗的说,我理解的寄存器就是处理器中的内存,用来存储指令和数据,不过速度要比普通的内存快很多。寄存器有16位的,32位的,现在也有64位的了,这章中,寄存器的大小是32位的,意思就是一次最多可以放32位的数据,且CPU中有32个寄存器。
字:“字是用于表示其自然的数据单位的术语。在这个特定计算机中,字是其用来一次性处理事务的一个固定长度的位(bit)组。”--百度百科。字节是八位的,大家都知道。字通俗理解就是CPU一次能处理的位组,比如8086CPU,寄存器是16位的,传输的最大宽度也是16位的,运算器一次最多能处理16位的数据,所以8086CPU的字是16位的。本章介绍的MIPS汇编语言,CPU中寄存器是32位的,所以对于这个CPU字就是32位的(MIPS也有64位的)。当然有时为了兼容,新的CPU虽然可以处理更多位数的数据,但字的大小还是与旧版的CPU一样。
这章的重点还是在于如何使用MIPS,以及mips和C的联系,进一步体现汇编语言的作用。
(这是第一次发笔记,先写一点点试试吧~)
注:无特殊说明,下面C中的变量都是32位的。
MIPS中的加减法:
EXAMPLE:
C: a=b+c;
d=a-e;
如果我们先不用寄存器,依然用变量,用MIPS来写的话,就是
MIPS: add a,b,c
sub d,a,e
即add是加法指令,add a,b,c相当于a=b+c,同理,sub就是减法指令了。
程序变量运行起来的时候是要加载到寄存器里的,所以现在把程序变量和寄存器对应起来。a,b,c,d,e依次$s0,$s1,$s2,$s3,$s4 (这五个就是mips里面的寄存器,前面的$相当于一个标识),那么MIPS就要改成:
mips: add $s0,$s1,$s2
sub $s3,$s0,$s4
这就是mips的加减法指令。
MIPS存取数指令:
真正的程序中,变量是很多的,并且还有复杂的数据结构,单单几个寄存器是不够的,所以需要将这些数据结构放入到内存中,在使用的时候将它取出来放到寄存器中,不用的时候就把它存入到内存中。这就是存取数指令的作用。
取数指令就是讲数据从存储器拷贝到寄存器的数据传送指令,助记符位lw(load word),即取一个字大小的数据。
EXAMPLE:
C: g=h+A[8];
设数组A的起始地址或称基址,存放在寄存器$s3中。g,h依次分配给$s1,$s2。
这里牵扯到一些寻址的知识,稍微说一下,寻址就是找寻内存的地址,内存的地址就相当于门牌号一样,内存单元已经排好序,如1,2,3,4 。寻址就是找到这个门牌号。mips是按字节寻址的。按字节寻址,存储空间的最小编址单位是字节,按字寻址,存储空间的最小编址单位是字。举例说,这里的数组A的每个元素,是占四个字节的,所以说A[8],第九个元素,是从第32个字节开始。
所以说A[8],用mips表示就是 32($s3),$s3代表着基址,32是偏移地址,真正的地址=基址+偏移地址。
所以用MIPS表示
mips: lw $s1,32($s3)
同理,存数指令是将寄存器中的内容拷贝到内存中,助记符位sw(store word),用法与存数指令是一样的。