汇编语言(8086CPU[16位])
机器语言
早期的程序设计均使用机器语言,程序员用0、1数字编成的程序代码打在纸带或卡片上,1代表打孔,0就代表不打孔,再将程序通过纸带机或卡片机输入计算机,然后进行运算。而机器语言是由若干个机器指令集合而成的,简单点就是一台机器能够正确运行的命令,电子计算机的机器指令是一列二进制数字,计算机将它转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
假如使用8086CPU运算m = 768 + 12288 - 1280,机器码如下:
101110000000000000000011
000001010000000000110000
001011010000000000000101
如果上述程序中的某个1或0写错,那么结果可想而知
汇编语言的产生
书写和阅读机器码程序不是一件简单的事,上面只是一个非常简单的小程序,但已经暴露出了机器码的晦涩难懂和不易差错,要记住这些抽象的二进制码,那岂不是难上加难。于是,汇编语言诞生了。
汇编语言的主体是汇编指令,汇编指令和机器指令的差距在于指令的表示方法上,汇编指令更便于记忆和阅读,下面将展示一个操作分别用汇编指令和机器指令表示
操 作:将寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:mov ax,bx
寄存器,其实就是CPU中可以存储数据的器件,一个CPU中有多个寄存器,AX和BX是两个代号不同的寄存器
汇编指令写好后,那么怎么才能让计算机执行程序员用汇编指令编写的程序呢?,这就需要一个能够将这些汇编指令转换为机器指令的翻译程序,这个翻译程序称为编译器
程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行
汇编语言的组成
汇编语言由以下3类指令组成:
- 汇编指令:机器码的助记符,有对应的机器码,是汇编语言的核心,决定汇编语言的特性
- 伪 指 令:它没有对应的机器码,由编译器执行,和C语言注释一样,计算机并不执行
- 其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码
存储器(内存)
要想让一个CPU工作,就必须向它提供指令和数据,指令和数据在存储器中存放,
指令和数据:
指令和数据是应用上的概念,在内存或磁盘上,它们没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看做指令,有的信息看做数据,为同样的信息赋予了不同的意义,例如,内存中的二进制信息1000100111011000,计算机既可以看作大小89D8H的数据来处理,也可以将其看作汇编指令mov ax,bx去执行
存储单元:
存储器被划分为若干个存储单元,一个计算机的最小信息单位是bit(一个二进制位,8个bit组成一个Byte(字节),也就是8个二进制位(00000001),
计量单位:1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
CPU对存储器的读写:
CPU要从内存中读数据,首先要指定存储单元的地址,而且CPU在读写数据时还要指明对哪一个器件进行操作,进行哪种操作,读还是写,所以说CPU要想进行数据读写,必须和芯片进行以下3类的信息交互
- 存储单元的地址(地址信息)
- 器件的选择,读或写的命令(控制信息)
- 读或写的数据(数据信息)
但是CPU是通过什么将地址、数据、控制信息传到存储器芯片的呢?,计算机能够处理、传输的信息都是电信号,电信号要用导线传递。在计算机中有专门连接CPU和其他芯片的导线,通常称为总线,从物理方面来说,总线就是若干个导线的集合,根据传送信息的不同,在逻辑上总线又分为3类,地址总线、控制总线、数据总线
下面的图片所表示的就是CPU从3号存储单元中读取数据的过程
- CPU通过地址线将地址信息3发出
- CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据
- 存储器将3号单元的数据8通过数据线送入CPU,写入的操作和读取的操作相似
上面解释了CPU是如何进行数据读写的,但如何去命令计算机进行数据的读写呢?。要让一个计算机工作,应该向他输入能够驱动它进行工作的电平信息(机器码)
对于8086CPU,下面的机器码,能够完成从3号单元读数据
机器码:101000010000001100000000
含 义:从3号单元读取数据送入寄存器AX中
CPU接受这条机器码后将完成上面所述的读写工作,但机器码难于记忆,用汇编指令来表示如下:
机器码:10100001 00000011 00000000
对应的汇编指令:mov ax,[3]
含 义:传送3号单元的内容进入寄存器AX
地址总线
根据上述,说明CPU是通过地址总线来指定存储器单元,所以说地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址
在计算机中,一根导线可以传送的稳定状态只有两种,高电平或低电平,用二进制表示就是1或0。现假设一个CPU有10根地址总线,10根导线可以传送10位二进制数据,那么10位二进制数据可以表示多少个不同的数据呢?。答案是2的10次方个,也就是1024个,最小数为0,最大数为1023
一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N,这个CPU最多可以寻找2的N次方个内存单元
数据总线
CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外接的数据传送速度。8根数据总线一次可传送一个8位二进制数据(即一个字节)。
8088CPU的数据总线宽度按为8,而8086CPU的数据总线宽度为16.下面分别看一下它们向内存中写入数据89D8H时,是如何通过数据总线传送数据的。
8088CPU示例:因为8088CPU数据总线宽度只有8位,一次只能传8位数据,所以向内存写入数据89D8H需要传送两次
8086示例:8086CPU有16根数据线,一次就可以将所有数据传送完毕
控制总线
CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。
前面所说的内存读写命令是由几根控制线综合发出的,其中有一根称为“读信号输出”的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据。有一根称为“写信号输出”的控制线则负责传送写信号。
TIPS
- 文章中的89D8H,后缀字母H代表十六进制(大佬无视)
B(Binary)二进制 ,比如101B 就代表二进制,包括0、1两个数字
O(Octal)八进制 比如123O 就代表8进制,包括0-7共8个数字
D(Decimal)十进制,比如232 + 1 = 233D,包括0-9共十个数字,十进制字母D平时忽略,
H(Hex)十六进制 比如CBH就代表16进制,包括0-9、A-F共16个数字或字母,A表示10,由此递增