x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01

首先感谢李忠老师的《x86汇编从实模式到保护模式》,这本书让我彻底了解了程序是如何被一步一步的执行的。在我知道这些原理细节之后,继续学习其他高级编程语言时,比如C,C++,java,很轻松的就理解了这些高级编程语言中的概念。在实际运用的时候如鱼得水。因掌握了原理,因此写的每一部分代码,都心中有数,内心舒坦。

现在我就将我的感悟分享给各位,愿大家学有所成。

什么是CPU?

CPU的全称是Central Processing Unit 中央处理单元,它本质就是一块集成电路,我们将这样的集成电路,也叫做芯片。

大家熟悉的芯片有Intel,ARM。那么Intel 和 ARM张什么样子呢?请看下图

Intel芯片

x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01_第1张图片

ARM芯片

x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01_第2张图片

CPU的作用

cpu的作用是什么呢?cpu的作用很简单,就是用于执行指令。你可以把cpu想象成一个客服人员,我对客服说,给我一杯水,客服听到我说的话后,就会拿一杯水给我。这里我说的话,其实就是指令,拿一杯水就是客服执行指令后的结果。由此,你可以联想到,只要我给CPU一个指令,那么CPU执行了这个指令后,必然也会给我相应的结果。这就是CPU的本质作用,我们给指令,然后CPU出结果。

CPU的指令

CPU本质上就是一个集成电路,它不是人,肯定无法理解人类的文字,它是由电路组成,想要和它进行通信,就必须以电信号来进行。那么问题来了,我们怎么给它电信号呢

实际上,我们在敲击键盘的时候,比如你敲了一个0,这个0,其实最终就会被键盘自动的转换成相应的电信号。对于人而言,我们可以通过键盘,间接的发出电信号。

现在我们继续深入思考,CPU能识别什么样的电信号呢?

cpu只能识别一组由高低电平组成的电信号,为了方便用文字描述高低电平组成的电信号。人类用0代表低电平,用1表示高电平。如下,就是一组CPU能识别的电信号。

101110000000000100000000

看到这么一长串的数字,你内心是不是有一种奔溃的冲动,这都是什么玩意,鬼知道,这是什么意思。对于人类而言,确实很难理解这是什么意思,但对于cpu而言,它确可以很轻松的理解。

说了这么多,其实就是让你明白CPU的指令本质上就是一组由0和1组成的字符串

先说下101110000000000100000000这串电信号是什么意思,它的意思是将数字1保存到寄存器ax里。

寄存器是cpu内部的一个存储单元,跟内存一样,都是用来保存数据的。ax只是cpu众多寄存器中的一个,也就是说还有其他bx,cx,dx等这些寄存器。

再来看一个CPU的指令

100000111100000000000010

这串指令的意思是将ax里的值和数字2进行相加,然后将相加的结果再次保存到ax里。

汇编指令

cpu指令是由0和1组成的字符串,难以阅读不说,光看表面,你根本就不知道它想表达个什么意思。在编写的时候,也容易出错。要是少写一个0或者是1,那么cpu在执行的时候,就会解释成其他的含义。于是人类就想出个办法,用人类熟悉的符号来代替cpu指令,比如:

101110000000000100000000 可以用mov ax,1 来代替

100000111100000000000010 可以用add ax,2来代替

......

为了方便描述,于是人类就将mov ax,1,add ax ,2统一叫做汇编指令。

每一条cpu指令,都会有一条唯一对应的汇编指令。对于程序猿来说,那就有福了,在编写程序的时候,可以不用写cpu指令,你直接写汇编指令就是了。

汇编编译器

这里有一个问题,CPU只能识别由0和1组成的指令,像我们写的汇编指令,它根本就无法识别。因此,我们需要一个转换工具,将汇编指令转化为cpu指令。人类将这种转换工具叫做汇编编译器

开始实践

打开,它可以方便的写汇编指令,没有这个软件的朋友,先看一下汇编编写软件和编译器的集成

在里面写入如下内容

x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01_第3张图片

保存该文件

x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01_第4张图片

点击编译本文档

x86汇编从实模式到保护模式-带你轻松入门编程-彻底理解程序的本质01_第5张图片

 

编译本文档后,会多出一个文件,叫做test.lst

打开该文件后,内容如下

这个其实就是汇编指令和cpu指令的对应文件,此时,你可能会疑惑,cpu指令不是0和1组成的二进制串吗?怎么变成了

B80100这种16进制的数字了,实际上这里仅仅是用16进制代替2进制的显示,因为2进制实在太长,不便书写和描述,因此

人类就用16进制来代替2进制的显示。比如B80100和101110000000000100000000在数值上是相等的。不信,可以用计算器换算一下。

x86汇编从实模式到保护模式-带你轻松入门编程-让CPU执行我们写的汇编指令02

 

 

你可能感兴趣的:(x86汇编)