程序语言(C,Java等)是人类能够理解的语言,所以我们可以用程序语言编写软件,交给它,CPU执行,如果您直接将程序语言交给程序语言,CPU去执行,CPU根本听不懂这种语言,CPU只知道自己的语言——机器语言就是机器代码,所以我们需要把程序语言翻译成机器代码。翻译有两种方法,一种是编译,另一种是解释。编译意味着将整个程序一次翻译成机器代码。解释的意思是逐句翻译。无论如何,我们最终把它交给了它CPU是机器码,让CPU根据机器代码做它应该做的事。

C翻译成机器代码
可将计算机作为黑盒,输入机器代码和数据,CPU执行后输出内容到内存
汇编语言是人类可以理解的机器指令。在后续的例子中,我们直接用汇编语言来表示机器指令,它们是等价的。
一.什么是机器代码?
机器代码也被称为机器指令,就像我们人类发出的指令一样,例如:“小明,去卫生间拿扫帚打扫房间,机器代码就是这个指令,这个指令包含了做什么,去哪里做。
1.机器码有哪些内容?
机器代码与计算机硬件密切相关,不同CPU,机器代码不同,就像不同的国家,语言不同,比如我们常用的CPU如InterPentium系列,酷睿系列,AMD锐龙,ARM,MIPS,IBMPowerPC等等,他们的机器代码不同,但都有一个共同的规范。

机器代码包含的内容
如上图所示,机器代码的共同规范是,它们都包括操作代码、控制位(可选)、操作数(可选)、多个(一般1-3个)甚至没有。

操作码:表示指令类型,如ADD表示加法指令,SUB表示减法指令。一个处理器可以包含非常复杂、面对面的指令,也可以包含非常简洁、短小精干的指令。正因为如此,CPU分为两大门派CISC(复杂指令集)和RISC(简化指令集),CISC属于大包大揽,什么都想做,RISC我只敢做我能做的事。其他的交给编译器。下表是这两个学校的成员

CISC
RISC
Inter,AMD
ARM,MIPS,IBMPowerPC
控制位置:几乎不用,不详细说明
操作数:表示指令需要操作的数据。在机器代码中,操作数不一定放在那里,等着你直接拿。获取它有以下方法
立即数寻址:立即数是一个整数,例如5,不需要从寄存器或内存中获取,它本身就是操作数,例如,ARMCPU下的指令
ADDr1,r2,#5
以上代码5是立即数,是常量,直接将R2寄存器中的内容与5相加,存储到r1寄存器中。
直接寻址:直接从内存中获取操作数,如InterPentiumCPU下的指令
MOVAX,[2468]
上述代码将内存地址2468上指向的内容写入ax寄存器
间接地址:不直接从内存地址获取操作数,而是将内存地址存储在寄存器中,通过寄存器间接获取操作数,如ARM下的指令
LDRr1,[r2]
上面代码,r2存储在寄存器中的内存地址,上述指令表示,将存储在内存地址中。r2.将存储在寄存器中的内存地址存器r1寄存器。
偏移量间接寻址:它是一种间接寻址变种,如ARM下的指令
LDRr2,[r3,#8]
上面代码,r3存储在寄存器中的内存地址,上述指令表示,将存储在内存地址中。r3.存储在寄存器中的内存地址和偏移8后计算的内存地址指向的内容写入r2寄存器。

1.2机器码格式
正如上面提到的不同CPU不同类型的机器代码,有的不同,CPU机器代码支持动态长度和动态扩展,如Inter系列,有时一个指令中可以有多个操作码,有的,CPU机器码长度固定,如ARM,我们可以分析大多数机器代码,大多数机器代码占一个字(32或64),一般超过一个字的机器代码不多,可能只有Inter会有系列,一般不用,这里不做阐述。

大多数机器码格式包括以下四种:

三个地址机器码格式
三地址机器码格式主要是RISCCPU在下面使用ARM汇编指令
ADDr1,r2,r3
上述代码表示将r2寄存器中的值加上r3寄存器中的值,写入到达r1寄存器

双地址机器码格式
双地址机器码格式主要是CISCCPU在下面使用InterPentium汇编指令
ADDAXBX
上述代码已经说过了BX寄存器的内容及AX加入后,写入AX双地址机器码的缺点也很明显,比如,AX执行命令后,寄存器值被覆盖,无法重用。

单个地址机器码格式
单个地址机器码格式在RISC,CISCCPU它会用到,比如下面ARM汇编指令
LDAr1
上述代码表示将r1.将寄存器的值添加到累加器(一种用于存储中间结果的寄存器)中,单个地址机器代码实际上有两个操作数,一个是r1、另一个是累加器,因为LDAr1已经意味着添加累加器,所有这些都不需要指定。

零地址机器码格式
零地址机器代码格式一般操作栈顶数据,不需要寄存器参与,零地址机器代码格式不使用地址,对于单个操作数操作,如增加、减少、负、零等一元操作,直接使用栈顶数据,双操作数从栈顶两个数,然后操作,以下例子,如下面的表达式
Z=(A+B).(C-D)
PUSHA;A入栈PUSHB;B入栈ADD;栈顶两个数出栈,加起来,然后结果进栈PUSHC;C入栈PUSHD;D入栈SUB;栈顶的两个数据相互减少,然后进入栈顶MUL;栈顶的两个数据出栈,相乘,然后结果进栈POPZ;栈顶数据出栈

二.2.1寄存器
寄存器和内存都是存储器,在功能上与内存没有区别,用于存储数据。从其他角度来看,寄存器和内存有以下区别
a.寄存器的速度比内存快,所以为了加快速度CPU以获取指令或数据的速度访问最近的数据

 

发表回复

后才能评论