本是青灯不归客,却因浊酒恋红尘
文章目录
- 前言
- 4.3.1 高级语言与机器级代码之间的对应
- 4.3.2 常用的X86汇编指令
- 4.3.3 ATu0026T格式和Intel格式
- 4.3.4 选择语句的机器级表示
- 4.3.5 循环语句的机器级表示
- 4.4 CiSC和RiSC
前言
接下来这部分主要讲的就是高级语言与汇编语言的对应关系,高级语言通过编译程序(编译器)编译成汇编程序,再通过汇编程序变成二进制的机器语言,一条高级语言可能对应多个编译语言,一个编译语言对应一条机器语言,机器级代码包含机器语言和汇编语言,通常给出某段简单程序的C语言,汇编语言,机器语言表示,能集合C语言看懂汇编语言的关键语句(看懂常用指令,选择结构,循环结构,函数调用即可)
4.3.1 高级语言与机器级代码之间的对应
以mov指令为例
如下图,蓝色标注的是寄存器,紫色标注的是立即数,绿色标注的同时打一个中阔号这是指一个内存地址,而在其前面的红色字体的dword和byte则表示的是内存中读取几个字节,如下中我们在寄存器中直接指明了两个名字的寄存器进行操作,这是不是就是寄存器寻址,第二句中,前部分就是寄存器寻址,后部分就是立即寻址,第三句中后面的那个操作数就是直接寻址
寄存器
如下图你会发现寄存器的都是以E开头的,在x86的cpu中寄存器是以E开头的那么这个寄存器的总长就是32bit,通用寄存器都是以X进行结尾
相对于变址寄存器和堆栈基指针,堆栈顶指针相比,通用寄存器更灵活,我们若是名字使用的时候去掉E也就是AX,BX,CX,DX 则表示使用的是低16bit,甚至我们可以划分的更小一些,划分8bit也是可以的
之前我们说过中括号里面的是主存地址,但是下面这个图中你会发现中括号中的是一个寄存器,若是你能联想本章的前部分,你可能会想到这里是寄存器间接寻址,h的后缀表示是一个16进制的
本节总结
此图对应开头的两个问题,并做出了回答
4.3.2 常用的X86汇编指令
本节探讨的常见的指令有哪些,每一个指令是对数据进行什么样的处理,这里主要讲的算数运算,逻辑运算
d:destination目的
s:source来源地
这里需要特别注意一个除法,你会发现只有一个操作数,这里的是除数,而被除数是被提前存放于edx和eax中,这里也就是隐含寻址,edx:eax的意思是有的时候需要进行位扩展,进行除法运算
王道书上讲解
这里同样需要注意左边这个数不能是常量,还有就是X86中不允许两个操作数同时来自于主存,因为访问主存的次数越多,速度自然也就越慢
4.3.3 ATu0026T格式和Intel格式
之前我们学过的X86汇编语言,分为两种格式,前面学习的就是intel格式(Windows的常用格式),这里讲一下AT&T格式(Unix,Linnx的常用格式),最大的一个区别是源操作数和目的操作数的位置是相反的
4.3.4 选择语句的机器级表示
ip计数器其实也就是程序计数器PC ,jum指令和我们之前学过的指令是一样的,这个地址就是jum的操作数,而这个操作数无非就是来自于寄存器,主存,常数,但是程序员怎么能知道最终这个操作数被存放于什么地址,就算知道书写也太过麻烦,而且不方便挪动代码,一个解决方案就是用一个标号去锚定一个位置,就是有点像C语言中的goto语句,
条件转移指令
通常条件转移指令要配合cmp来一起使用
4.3.5 循环语句的机器级表示
除了循环之外在X86中还有一个loop指令,这个指令特殊之处在于会自动的对ecx进行减减的操作,所以这里不能使用其他的寄存器来代替ecx,用ecx中的值来判断是否需要继续进行循环
4.4 CiSC和RiSC
这两个有些类似一个只给你提供了一个简单的语句,另外一个给你提供许多封装好的函数
CISC复杂指令集系统:一条指令完成一个复杂的基本功能
RISC精简指令集系统:一条指令完成一个基本“动作”多条指令组合完成一个复杂的基本功能
这里如下图想到之前我们提到的 直接寻址使用的就是CISC的指令系统,
指令流水线:因为CISC中各个指令的执行时间相差较大,指令流水线的实现比较复杂,但是也可以通过一定的方式实现,RISC各个指令执行时间在一个周期基本上都能完成,也就实现流水线比较方便,并且效率会更高,