参考书籍《汇编语言》王爽 著/清华大学出版社
菜单导航:一、汇编基础知识
一、基础知识
1、汇编指令是机器指令的助记符,同机器指令一一对应
2、每一种CPU都有自己的汇编指令集
3、CPU可以直接使用的信息在存储器中存放
4、在存储器中指令和数据没有任何区别,都是二进制信息
5、存储单元从零开始顺序编号
6、一个存储单元可以存储8个bit, 即8位二进制数
7、1Byte = 8bit ; 1KB = 1024B ; 1MB = 1024KB ; 1GB = 1024MB
8、CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3类信息的交互:
- 存储单元的地址(地址信息)
- 器件的选择,读或写的命令(控制信息)
- 读或写的数据(数据信息)
9、那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。
在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。
总线从物理上来讲,就是一根根导线的集合。根据传送信息的不同,总线从逻辑上又分为3类:地址、控制、数据
每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。
一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能。
-
地址总线:地址总线的宽度决定了CPU的寻址能力
- 比如8086cpu,它的地址总线宽度为20,所以它的寻址能力是2^20 = 2^10 * 2^10 = 1024 * 1024 = 1M
- 怎么理解?就是说8086有20根线,每根线控制一个0或者1,每次可以同时操作20根线发出一个0或者1的电信号,
- 则有排列组合2^20=1024 * 1024 种可能性,即8086最多可以找到1024 * 1024 个内存单元(从0 --> 1024*1024),
- 一个内存单元表示一个字节,也就是说8086最多可以寻找到1024 * 1024 = 1M个数量的内存地址;
- 也就是说如果cpu的地址总线宽度是20,则给它配置1M的内存条已经够了,如果配置了2M就是浪费,因为它最多只能找到1M个内存单元,也最多只能用到1M个内存单元,另外1M个内存单元没有能力找到更是用不上了。
-
数据总线:数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量
- 比如8086cpu的数据总线宽度是16,则每次可以传递2个字节的数据。
- 怎么计算出来的?16根线,每根线控制一个0或者1,每次可以同时操作16根线发出一个0或者1的电信号;
- 数据总线和地址总线理解上不一样,这里的同时操作16位0或者1,也就是传递16个0或者1的二进制信号;
- 就是说每次传递2个字节的数据(16bit = 2Byte)
- 控制总线:控制总线的宽度决定了CPU对系统中其他器件的控制能力
10、做个小练习
- 一个CPU 的寻址能力为8KB,那么它的地址总线的宽度为____
- 8080,8088,80286,80386 的地址总线宽度分别为16根,20根,24根,32根.那么他们的寻址能力分别为多少____KB, ____MB,____MB,____GB?
- 8080,8088,8086,80286,80386 的数据总线宽度分别为8根,8根,16根,16根,32根.那么它们一次可以传输的数据为:____B,____B,____B,____B,____B,
- 从内存中读取1024字节的数据,8086至少要读____次,80386至少要读取____次.
答案:
1、一个CPU 的寻址能力为8KB,那么它的地址总线的宽度为__13__View Code
2、8080,8088,80286,80386 的地址总线宽度分别为16根,20根,24根,32根.那么他们的寻址能力分别为多少__64__KB, __1__MB,__16__MB,__4__GB
3、8080,8088,8086,80286,80386 的数据总线宽度分别为8根,8根,16根,16根,32根.那么它们一次可以传输的数据为:__1__B,__1__B,__2__B,__2__B,__4__B
4、从内存中读取1024字节的数据,8086至少要读__512__次,80386至少要读取__256__次.
二、寄存器
1、从物理结构来讲,CPU包括运算逻辑部件、寄存器部件和控制部件等
- 运算逻辑部件(Logic components): 可以执行定点或浮点算术运算操作、移位操作以及逻辑操作,也可执行地址运算和转换;
- 寄存器部件,包括寄存器、专用寄存器和控制寄存器。 通用寄存器又可分定点数和浮点数两类,它们用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。 通用寄存器是cpu的重要部件之一。
- 控制部件: 主要是负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。其结构有两种:一种是以微存储为核心的微程序控制方式;一种是以逻辑硬布线结构为主的控制方式。
2、对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制;
不同的cpu,寄存器的个数、结构是不同的。比如8086是16位结构的cpu,
8086有14个16位的寄存器,每个可以存放2个字节。
3、通用寄存器的作用
- AX、BX、CX、DX这四个寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途)
- 通常,cpu会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算。
举例说明,在内存中有块红色内存空间的值是3,现在想把它的值加1,并将新的计算结果存储到蓝色内存空间,如图所示
那么这个在cpu的执行步骤是怎样的呢?
1)、cpu首先会将红色内存空间的值放到AX寄存器中:mov ax, 红色内存空间
2)、然后让AX寄存器与1相加:add ax, 1
3)、最后将值赋值给内存空间:mov 蓝色内存空间,ax
4、数据寄存器的兼容:
- AX、BX、CX、DX这四个通用寄存器都是16位的,
- 但是上一代的8086寄存器都是8位,为了保证兼容, 这四个寄存器都可用2个独立的8位寄存器来使用
- H代表高位寄存器
- L代表低位寄存器
5、汇编指令举例
接下来看一下CPU执行下图中的每条指令后,对寄存器中的数据进行的改变:
说明,假设原AX中的值:0000H, 原BX中的值:0000H
为什么程序段中最后一条指令 add ax,bx, 在执行前ax和bx中的数据都为8226H, 相加后所得值为044CH, 而不是:1044CH ?
因为ax为16位寄存器,只能存放4位16进制的数据,所以最高位的1不能在ax中保存,ax最后保存的数据为:044CH
再来看一段程序段的指令,注意高位和低位寄存器的计算
最后一个指令 add al,93H后AX中的数据为0058H, 为啥?
执行前,al中的数据为C5H, 相加93H为158H, 但是al为一个独立8位寄存器,和ah没有关系,CPU在执行这条指令时认为ah和al时两个不相关的寄存器。
所以只能存放两位十六进制的数据,所以最高位的1丢失。
另外,在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如下图这些是正确的指令:
----------------------------------------
而下面的指令等都是错误的指令