x86汇编语言(1) 汇编语言的前世今生
用电来表示数字
导线中的开关有开和关两种状态,计算机使用0和1来表示数字,导线闭合表示1,导线断开表示0
所以我们可以用一排导线来表示一个二进制数
装上灯泡后,也可以看灯泡的亮暗表示二进制数
二进制加法机
加法器的结构:两个输入端只要一修改,输出端的结构立马发生改变
具有记忆功能的器件——寄存器
具有存储功能的触发器的结构说明:左边是输入,下边是锁存开关,当按下锁存开关,右边就会把左边的数据给保存起来,锁存断开后,再修改左边的输入,右边存储的数据也不会发生改变。
一个触发器只能保存一个bit,我们用多个触发器来表示一个完整的二进制数,将它们组合在一起,就形成了寄存器(锁存器)。
带寄存器的加法机
加法机结构:左边为输入端,下面有预置和相加两个按键开关,按下预置将输入端的数据保存到寄存器R上,右边的灯泡直接与寄存器R连接,根据灯泡的亮暗可以得出寄存器R的内容,按下相加键会把寄存器R的内容与左边的输入相加,然后保存到寄存器R中。
能做四则运算的机器
结构说明:多了其它运算的控制按钮,都是一样先往寄存器R预置一个数,输入端再指定一个数,按下运算开关,最后将运算结果保存到寄存器R中。
机器指令
当只有一个运算器时,复杂一点的运算就运算不了了,如下图:
当运算完207+9后,寄存器R的内容保存了中间结果216,但216在寄存器R中又不能覆盖掉,所以我们需要多加几个寄存器,下面是两个寄存器的示意图:
多了一个寄存器Z后,就可以进行更为复杂的运算了。比如(207 + 9)/(56 - 48),可以先分别输入207和9,分别保存到寄存器R和Z中,再将寄存器R与Z的内容相加,相加结果再放入寄存器R中;输入56,再往寄存器Z存入56,再往输入端输入48,将输入端的内容与寄存器Z的内容相加,存进寄存器Z中;最后取出寄存器R、Z的内容,用寄存器R的数据去除以寄存器Z的数据,将结果保存在寄存器R中,这样整个运算就完成了。
**以上涉及的操作有:将外数存往寄存器R或Z,取出寄存器的内容进行各种运算,将寄存器的内容与外数相加,将计算结果保存到寄存器中等等。这些操作每一种都需要一个开关来控制,当有很多中操作时,这时就需要很多个开关。**于是,我们可以用一排导线了来控制,这排导线的一个二进制数就可以来表示一个操作,同时还有一个控制开关,按下开关表示导线上的二进制数对应的操作执行。如下图所示:
这样5个开关可以组合出2的5次方个二进制数,即可以表示32种操作,我们将这一排开关组合出的二进制数称为指令。
内存
上面的指令很多,我们可以将代表指令的二进制数保存在内存中,运算时可以从内存中取出指令再进行执行
其中每一个小方块表示一个内存单元,主流计算机里每个内存单元可以保存8个bit的二进制数,每个内存单元通过从下往上的编号进行识别,这些编号称为内存单元的地址,我们可以通过地址线来访问某个地址的内存单元,
地址线的数量决定可以访问的内存单元的地址范围,如8根地址线可以访问256个内存单元,内存单元的地址用十六进制来表示,即可以访问的内存单元的地址范围为00-FF。
计算机中的字节
主流计算机中每个内存单元有8位,即1个字节
内存的容量可以用内存单元的数量来表示:
内存中的指令需要存入或者取出,这就需要一个输入/输出端(数据线)、访问的内存单元位置(地址线)、读/写控制,完整的结果如下图所示:
自动计算
改进后的运算器通过地址线、数据线和控制线与内存相连,运算器中有寄存器R和Z,用于保存运算数,指令指针寄存器用来保存指令的地址,初始化的地址为第一条要执行的指令的地址。运算器开始工作时,先将指令指针寄存器的指令送到地址线上,内存将该地址的内存单元的指令内容通过数据线送到运算器上,运算器再根据指令内容去执行相应的操作。执行完成后,指令指针寄存器的内容执行下一条指令的地址(根据指令的长度可以计算出),继续执行下去。
示例:其中有些指令是有操作数和操作符组成,操作数也叫立即数。
处理器
改进后的处理器
8008(8位)和8086(16位)
处理器的位数是指指令执行部件的位数,如32位的处理器,可以提供的寻址范围为0-2的32次方,内存理论上最大为4GB。
指令的分类
汇编语言的诞生
机器指令
汇编语言是使用文本符号来代替指令
汇编程序执行翻译过程