机器码在哪看 机器码


机器码在哪看 机器码


程序语言(C,Java等)是人类能够理解的语言,因此我们可以用程序语言编写软件,交给CPU去执行,如果你直接将程序语言交给CPU去执行,CPU压根就不能理解这种语言,CPU只认识它自己的语言-机器语言即机器码,因此我们需要将程序语言翻译成机器码,翻译的方式有两种,一种是编译,另外一种是解释,编译的意思是把整个程序一次性翻译成机器码,解释的意思说,一句一句地翻译,不管怎么样,我们最终交给CPU的是机器码,让CPU去根据机器码去做它该做的事情 。
C翻译成机器码
可以把计算机当做一个黑盒子,输入机器码和数据,CPU执行后输出内容到内存,如下图所示
机器码执行图
汇编语言是人类能够理解的机器指令,后续我们举例子时,直接用汇编语言表示机器指令,它们是等价的 。
一.什么是机器码?
机器码也叫机器指令,就像我们人类发出的指令一样,比如:“小明,去卫生间里拿一把扫帚去打扫房间,机器码就是这条指令,这条指令里就包含了干什么事情,去哪里干 。
1.1 机器码都有些什么内容
机器码是与计算机硬件紧密关联的,不同的CPU,机器码不一样,就好比不同的国家,语言不一样类似,比如我们常用的CPU如Inter Pentium系列,酷睿系列,AMD 锐龙,ARM,MIPS,IBM PowerPC等,他们的机器码就各不相同,但都有一个共同的规范就如下图所示 。
机器码包含的内容
如上图所示机器码共同的规范就是他们都包括操作码,控制位(可选),操作数(可选),操作数可以有多个(一般1-3个)甚至没有 。
操作码:表示指令类型,比如ADD表示加法指令,SUB表示减法指令 。一个处理器可以包含非常复杂,面面俱到的指令,也可以包含十分精简,短小精干的指令,正因如此,在CPU界分成了两大门派CISC(复杂指令集)和RISC(精简指令集),CISC属于大包大揽,啥都想干,RISC是我只敢我能做的事情,其他的事情交给编译器,下面的表格为这两个门派的成员
CISC
RISC
Inter,AMD
ARM,MIPS,IBM PowerPC
控制位:几乎用不到,不做详解
操作数:表示指令需要操作的数据,在机器码中,操作数可不一定是放在那里,等着你直接去拿的,有以下几种获取的方式
立即数寻址:立即数是一个整数,例如5,不需要从寄存器或者内存中获取,它本身就是操作数,例如ARM CPU下的指令
ADDr1,r2,#5
上面代码中5就是立即数,是常量,直接将R2寄存器中的内容与5相加,存储到r1寄存器中 。
直接寻址:从内存中直接获取操作数,例如Inter Pentium CPU下的指令
【机器码在哪看 机器码】MOV AX,[2468]
上面代码将内存地址2468上指向的内容写入到ax寄存器
间接寻址:不直接从内存地址获取操作数,而是将内存地址存储在寄存器中,通过寄存器间接获取操作数,例如ARM下的指令
LDRr1, [r2]
上面代码,r2寄存器中存储的是内存地址,上面指令表达的意思是,将r2寄存器中存储的内存地址指向的内容写入到r1寄存器 。
偏移量间接寻址:它是间接寻址变种的一种,例如ARM下的指令
LDR r2,[r3,#8]
上面代码,r3寄存器中存储的是内存地址,上面指令表达的意思是,将r3寄存器中存储的内存地址加上偏移8后算出的内存地址指向的内容写入到r2寄存器 。
1.2 机器码的格式
正如上文提到不同的CPU类型机器码不同,有的CPU机器码支持动态长度,动态扩展,如Inter系列,它有时候可以一条指令中有多个操作码,有的CPU的机器码长度是固定的,如ARM,我们可以分析大多数的机器码,大多数的机器码占一个字(32位或64位),一般超过一个字的机器码不多,可能只有Inter系列会有,一般用不到,这里不做阐述 。

推荐阅读