最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。
1.比特、字节、字、双字
在计算机中: 1比特:1位 1字节:8位 1字:16位 ,15-8(高字节)---> 7-0(低字节) 1双字:31-16(高字)---> 15-0(低字)
2.指令和指令集
机器指令就是一列二进制数字,计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。 机器语言就是机器指令的集合。 指令一般由操作码和操作数构成,也有些指令只有操作码,没有操作数。 小端序:或叫低端字节序,内存高字节存放在高地址,内存的低字节保存在低地址 大端序:与小端序相反 指令和数据为什么要分开存放: 因为指令和数据都是二进制数,是一模一样的,即:都是一些由高低电平组和,而处理器是自动按顺序提取指令并加以执行的,在指令中混杂数据会导致处理器不能正常工作,因此,指令和数据要分开存放。存放代码的区域叫代码区,存放数据的区叫数据区,联想一下:一个二进制程序的代码段和数据段也是分开存放的。
3.汇编语言
处理器都是依靠机器指令来工作的,但是机器指令是一些没有规律的数字,编写机器指令的程序,难以书写,难以阅读,难以理解,这样就发明了汇编语言。 汇编指令就是机器指令便于记忆的书写格式,有对应的机器码。 伪指令就是没有对应机器码,由编译器执行,计算机并不执行。
汇编指令---(编译器)--->机器指令,即:MOV ax, bx ---(编译器)---> 10001000111011000 寄存器:CPU可以存储数据的器件
4.CPU对存储单元的读写
CPU要进行数据的读写,必须和外部器件进行三类交互:存储单元的地址(地址信息),器件选择,读写命令(控制信息),读写的数据(数据信息) 那么,CPU通过什么交互这三种信息呢?答案是:总线,即:地址总线、控制总线、数据总线。 如:从存储芯片中读取数据 (1)CPU通过地址总线将地址信息(如:0x0001)发出 (2)CPU通过控制总线发出内存读命令,选中存储芯片,并通知存储芯片要从中读取数据 (3)存储器将地址信息(如:0x0001)中的数据通过数据总线送入CPU 如:向存储芯片写入数据 (1)CPU通过地址总线将地址信息(如:0x0002)发出 (2)CPU通过控制总线发出内存写命令,选中存储芯片,并通知存储芯片要写入数据 (3)CPU通过数据总线将数据送入存储芯片地址(如:0x0002) 地址总线: 我们知道CPU是通过总线来指定存储单元的,如果一个CPU有10根地址总线,那么他的寻址空间就是0~1023,即:0x0~0x3FF,地址总线宽度决定了CPU的寻址能力。 数据总线: CPU与内存或其他芯片之间传递数据是通过数据总线进行的,数据总线的宽度就决定了数据传输速度,8根数据总线,一次可以传递8位(bit)二进制数据,16根总线就可以一次传递2字节数据。数据总线决定了CPU一次传输数据量。 控制总线: CPU对于外部器件(外部芯片)的控制是通过控制总线完成的,有多少根控制总线,就意味着CPU对外提供了多少种控制,所以控制总线决定了CPU的控制能力。
5.内存地址空间
BIOS:Base Input/Output System,基本输入输出系统 内存、网卡、显卡等外部芯片,虽然都是独立器件,但是在以下两点是相同的: (1)都和CPU的总线相连 (2)CPU对他们进行读和写的时候,都通过控制线发出内存读写命令 也就是说,CPU对这些设备操控的时候,都作为内存来对待,把他们都看成一个由若干个存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间,在汇编语言中,我们所面对的就是内存地址空间。 即:逻辑存储器(假想的)= 内存+网卡内存+显卡显存 + ...... (或者叫映射,将这些器件的物理地址映射到逻辑存储器的逻辑地址,每个器件占一段逻辑地址,CPU对这段逻辑地址读写,就是对真实器件的读写) 逻辑存储器的大小就取决于上面说的CPU的寻址空间(也就是看有几根数据总线)