上次我们讲了汇编语言,这期我们来探究到编程语言的最低层——机器语言。不同架构的机器有不同的汇编语言,它的原因其实是因为不同架构机器的机器语言不同。
如果上次读者有仔细看的话,就会看到我们讲了两种架构——x86和MIPS。我只了解过MIPS的机器语言,所以我们就以它为例子来讲解。
其实如果已经了解汇编语言的话,机器语言根本就不是什么难事。每一条汇编语句都对应一条机器语言指令。所以汇编语言和机器语言是一一对应的关系。因此理论上只要有一张汇编语言和机器语言的对照表,你就可以直接用0和1来写程序,当然没有人会这样做,因为太麻烦了。
下面是一张MIPS汇编语言和机器语言的对照表。
一条MIPS机器语言有32位,也就是说有32个1或0,它被分为几段以代表指令中不同的元素比如要执行的操作、源操作数、目的操作数等。在MIPS机器语言中有三种类型的指令(其实也是汇编语言中的三种类型指令),分别为R类型,I类型和J类型。不同类型的指令,它的一条32位长的机器指令分段的方式就不一样。
我们以R类型为例来具体讲解。它的32位指令被分成6段。分别为6位长度的op(操作码)、5位长度的rs(源操作数)、5位长度的rt(第二个源操作数)、5位长度的rd(目的操作数)、5位长度的shamt(位移量)、6位长度的funct(功能码)。R类型的指令的op 6位都是0,代表它是R类型。rs,rt,rd中填写需要操作的寄存器的编号的二进制形式,这张表上显示了寄存器和编号的对应关系。位移量一般情况下都是0.功能码则决定了具体是哪种指令,比如是add(加法)还是sub(减法)。
所以,
add $s0,$s0,$s1
的机器语言应该这样写:
00000010000100011000000000100000(这不是乱码哦)