为逆向准备的汇编语言基础,如果有错误请及时指出
什么是机器语言?
机器语言是机器指令的集合,说通俗点就是计算机唯一能识别的语言,再俗一点就是0和1
机器指令
一台机器可以正确执行的命令
例如:指令:01010000 (汇编指令PUSH AX) 代表:把AX推入堆栈
汇编语言的产生
上面可以看到,01010000这个指令直接看机器码,我们很难看懂这条指令的意思,所以为了能更方便的书写代码,这个时候,汇编语言就产生了。
汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,就是把机器语言的0和1用汇编语言的指令表示了,最终汇编语言还是会通过编译器编译成机器指令去给CPU执行.
截了一个图大概是这个样子

也可以这么理解,汇编指令是机器指令的助记符.
汇编语言的组成
- 汇编指令(机器码的助记符,例如MOV指令这些)
- 伪指令(编译器能识别并且执行,机器无法执行,没有对应的机器码)
- 其他符号(例如+,-,*,/,这类符号,也是没有对应的机器码,由编译器识别)
这里对伪指令详细解释一下(了解就行):
伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句。例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些是当前段,它们分别由哪个段寄存器指向;定义了哪些数据,存储单元是如何分配的等等。伪指令语句除定义的具体数据要生成目标代码外,其他均没有对应的目标代码。伪指令语句的这些命令功能是由汇编程序在汇编源程序时,通过执行一段程序来完成的,而不是在运行目标程序时实现的。
寄存器
什么是寄存器?
简单来讲,寄存器就是CPU中可以存储数据的器件,一个CPU中可以有很多个寄存器
存储器
什么是存储器?
在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,控制cpu运作,一个CPU如果要正常运作,就必须向它提供指令和数据.存储器有很多种,按其用途可分为主存储器和辅助存储器,主存储器简称主存,又称内存储器,也就是我们日常提到的内存.
这里我们提一下磁盘,磁盘中的程序和数据必须读取到内存中,才能被CPU使用.
指令和数据
-
指令和数据只是在应用上的概念
-
指令和数据在磁盘或内存中没有任何区别例如下面二进制数
1000100111011000 表示数据 89D8H
1000100111011000 表示指令 MOV AX,BX
那计算机是如何区分指令和数据的?这个我们后面再谈.
存储单元
-
存储器被划分为若干个存储单元,每个存储单元的编号都是从0开始
例如存储器有128个存储单元,那图片大概是这个样子的

CPU对内存的读写
CPU若想要内存的数据进行读写,必须和外部器件做3类信息的交互
- 存储单元的地址(地址信息)
- 器件的选择,读取或者写入的命令(控制信息)
- 读取或者写入的数据(数据信息)
这里也就突出了CPU的三大总线,即:
- 地址总线
- 数据总线
- 控制总线
读写流程

-
首先确认了地址号:3,那么CPU会去地址号为3的存储单元中对数据进行操作
-
然后收到的指令是"读"
-
再然后,会把地址3的存储单元所存储的数据(08)读出来

写入流程也是一样的这里不再赘述.
现在我们再回顾上面的那个问题,计算机是如何区分指令和数据的?
答案就是CPU的三大总线了,数据在哪条总线上传输的,CPU就会按哪条总线对传来的指令进行什么样的操作.
地址总线
- CPU通过地址总线来制定存储单元
- 地址总线能传送多少个不同的信息,CPU就能对多少个存储单元进行寻址
我们常说的64位,32位操作系统,就代表着地址总线的为64根、32根,地址总线的根数越多,寻址能力就越强.
计算方法如下:
一个CPU有N根地址总线,我们就可以说这个CPU的地址总线宽度为N,那么这个CPU就可以寻找2的N次方个存储单元.
数据总线
- CPU与内存或者其他器件数据的传送是通过数据总线完成的
- 数据总线的宽度决定了CPU传送的速度
这里举个例子,好比一条公路上有一辆车在运送货物,1次运送一吨的货物,运送2吨的货物至少要运2次,如果我们加宽公路,两辆车可以一起运送货物,这样就节省了一趟车的时间.
例:现在要传输一个数据,89D8
在8位CPU需要这么传(一次传8位)

第一次传11011000 第二次传10001001
而在16位

仅仅一次就能把以上数据全都传输过去
控制总线
CPU对外部控制器件是通过控制总线来完成的,一般来说,有多少根控制总线,意味着CPU能对外部有多少种控制,老规矩,看图

这里面的1011就是再是数据了,也不是指令,因为控制无非两种读、写,所以对应1、0这样子,只不过每条线控制不同的部件。
小结
- 汇编指令是机器指令的助记符,同机器指令一一对应
- 每一种CPU都有自己的汇编指令集
- CPU能直接使用的数据是在存储器中存放
- 在存储器中,指令和数据是没有区别的,都是1和0组成的二进制数据,用不同的总线进行区分
- 存储单元是从0开始顺序编号
- 一个存储单元可以存储1个字节(Byte)也就是8位(bit)二进制数
- 1B = 8b 1kb = 1024B 1MB = 1024kb 1G = 1024MB
- 一个CPU可以引出3条总线,标志这个CPU不同方面的性能
- 地址总线的宽度决定了CPU的寻址能力
- 数据总线的宽度决定了CPU与其他部件每次传输数据的数量,也就是CPU传输数据的速度
- 控制总线的宽度决定了CPU可以控制多少部件