汇编语言(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,由此递增

Last modification:June 16, 2021
If you think my article is useful to you, please feel free to appreciate