学到的知识,很大的一部分会被忘却,而被忘记的知识的影子却保护你避免陷入很多的错觉。——伊顿公学校长威廉·考利
为什么要学习汇编语言?
汇编语言是很多相关课程的重要基础,比如:操作系统、接口技术等。它是底层编程语言,是计算机系统提供给用户最快最有效的语言,也是能对硬件直接编程的语言。因此,对空间和时间要求很高的程序,或需要直接控制硬件的程序,必须使用汇编语言进行程序设计。
汇编语言的特点
- 面向机器的低级语言,与处理器密切相关。通常是为特定的计算机或计算机系列专门设计的。
- 保持了机器语言的优点,具有直接和简捷的特点。
- 可有效地访问、控制计算机的各种硬件设备, 如磁盘、存储器、CPU、I/O端口等。
- 目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。
- 经常与高级语言配合使用,应用十分广泛。
汇编语言的主要应用场合
- 要求执行效率高、反应快的领域,如:操作系统内核,实时系统等;
- 与硬件资源密切相关的软件开发,如:设备驱动程序等;
- 大型系统性能的瓶颈,或频繁被使用的子程序或程序段;高级绘图程序、视频游戏程序一般是用汇编语言编写的。
- 受存储容量限制的应用领域,如:家用电器的计算机控制功能等。
学习资源
BCD码
BCD码(Binary Coded Decimal)是一种二-十进制的编码,它使用4位二进制数表示一位十进制数。最常用的BCD码是8421码,又叫NBCD码(Natural Binary Coded Decimal Code),由于4位二进制数可表示16种状态,只取前10种状态0000-1001来表示十进制数码0-9,从左到右每位二进制数的权分别是8、4、2、1,因此又叫8421码。
例如:十进制数1258对应的BCD码是0001001001011000
;
反之,BCD码1001 1000 0111 0010
对应的十进制数是9872。
压缩BCD码:用一个字节表达两位BCD码,比如 0100 1001
表示49
。
非压缩BCD码:将8位二进制的高4位设置为0,仅用低4位表达一位BCD码。比如00000100 00001001
表示49
。
80x86微处理器
80X86是美国Intel公司生产的微处理器系列。
微处理器:把运算器和控制器集成在一个芯片上,构成的中央处理器(CPU)。
微机:即微计算机系统,由微处理器配上存储器、输入输出设备和系统软件等构成。各硬件用系统总线连接在一起。
系统总线包括数据总线(DB)、地址总线(AB)和控制总线(CB)三组。
基于微处理器的计算机系统构成
数据总线宽度
数据总线宽度16位:决定了数据的传输速率。
机器字长16位
机器字长为16位:可表示数的范围为0000~FFFFH(2^16 = 64K)
地址总线宽度
地址总线宽度为20位:寻址空间为2^20 = 1024KB = 1MB。
8086总线的工作周期
计算机是在时钟控制下进行工作的,若干个时钟完成一个基本操作,一个基本操作就是一个总线周期,CPU有若干种典型操作,构成相应的总线周期。如存储器的读写总线周期,I/O读写总线周期等。
执行一条指令的时间称为指令周期,指令周期是由若干总线周期构成。
8086/8088的基本总线周期是由4个时钟周期组成,在执行WAIT指令或READY引脚输入的状态为低电平时,都需要在 T3 和 T4 之间插入1个或若干个等待时钟周期 Tw 。
T1状态
CPU向多路复用总线上发送地址信息,指出要寻址的内存单元地址或I/O端口地址。这期间CPU还要ALE(正向脉冲),在ALE下降沿将内存单元地址或I/O端口地址打入地址锁存器。
T2状态
CPU从总线上撤销有效地址,使地址总线低16位呈高阻状态,为数据传输做准备。总线的高4位( A19 ~ A16 )输出总线周期的状态信息,用于表示中断允许状态及正在使用的段寄存器名。
T3状态
A19 ~ A16 上的状态信息不变,地址总线低16位上出现CPU要写出的或准备读入的数据。若外设与内存来不及与总线交换数据,则应通过CPU的READY信号,在 T3 前沿(下降沿)之前向CPU申请插入等待状态 TW ,在 T3 及 TW 前沿查询READY信号,查到高电平则结束等待状态,进入下一状态。否则继续插入等待。
T4状态之总线周期结束
在一个总线周期之后,若不立即进入下一个总线周期,即CPU不与内存或外设交换数据或者指令队列已满,系统总线处于空闲状态,CPU执行总线空闲周期,总线空闲周期一般由一个或多个时钟周期组成。
中央处理器
CPU包含了三个部分:算术逻辑、控制逻辑、寄存器组。
总线接口部件BIU (Bus Interface Unit)
内部设有四个段地址寄存器,一个指令指针寄存器IP,一个6字节指令队列缓冲器,20位地址加法器和总线控制电路。
主要功能:根据执行部件EU的请求,负责从内存单元中预取指令,并将它们送到指令队列缓冲器暂存。即负责完成CPU与存储器或I/O设备之间的数据传送。
执行部件EU(Execution Unit)
执行部件中包含算术逻辑单元(ALU)、通用寄存器、状态标志寄存器、数据暂存寄存器和执行部件的控制电路。
主要功能:从BIU的指令队列中取出指令代码,经指令译码器译码后执行指令所规定的全部功能。执行指令所得结果或执行指令所需的数据,都由EU向BIU发出命令,对存储器或I/O接口进行读/写操作。
寄存器组
数据寄存器
名称 | 寄存器英文名 | 寄存器说明 |
---|---|---|
AX | Accumulator | 累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。 |
BX | Base | 基址寄存器,常用于存放存储单元地址。 计算地址的时候用作基地址寄存器,用于扩展寻址,起变址的作用。 |
CX | Count | 计数寄存器,一般作为循环或串操作等指令中的隐含计数器;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器。 |
DX | Count | 数据寄存器,常用来存放双字数据的高16位,或存放外设端口地址,比如双字的乘除法。 存放操作数和列表数据,在某些I/O操作期间,用来,在乘除运算中有专用。 |
共同特点:
这四个十六位的寄存器可以分为:
- 高8位:AH,BH, CH,DH;
- 低8位:AL,BL,CL,DL。
- 这两组八位寄存器可以分别寻址,并单独使用。
指针寄存器
寄存器名称 | 寄存器英文名 | 寄存器说明 |
---|---|---|
SP | Stack Pointer | 堆栈指针寄存器。与SS(堆栈段寄存器)配合使用来确定堆栈段栈顶的位置,也就是说SP用于存放栈顶的偏移地址。 |
BP | Base Pointer | 基址指针寄存器,可用作SS的一个相对基址位置(用于存放堆栈段中某一存储单元的偏移地址。) |
说明:指针寄存器和变址寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
变址寄存器
寄存器名称 | 寄存器英文名 | 寄存器说明 |
---|---|---|
SI | Source Index | 源变址寄存器可用来存放相对于DS段之源变址指针,也就是说,源操作数偏址存放在SI中。 |
DI | Destination Index | 目的变址寄存器,可用来存放相对于 ES段的目的变址指针,也就是说,目的操作数偏址存放在DI中。 |
说明:
SI和DI一般与数据段寄存器DS联合使用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能,所以用来变址是十分方便的。
在串处理中,SI和DI作为隐含的源变址和目的变址寄存器,此时SI和DI联用,DI和附加段寄存器ES联用,分别达到了在数据段和附加段寻址的目的。
指针寄存器和变址寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
指令指针IP(Instruction Pointer)
指令指针IP是一个16位专用寄存器(指令指针寄存器),它指向当前需要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动加上指令长度的值,指向下一个指令字节。
注意:IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address),程序不能直接访问IP。
任意时刻,CPU将CS:IP指向的内存单元中的内容看作指令。
标志寄存器FR(Flag Register)
8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其中6位是状态位,3位是控制位。
标志寄存器FR:
条件标志
状态信息是由中央处理机根据计算结果自动设置的。
标志名称 | 说明 |
---|---|
OF | 溢出标志位OF(overflow flag)用于反映有符号数加减运算所得结果是否溢出。 如果运算结果超过当前运算位数所能表示的范围,则称为溢出。溢出时OF=1,否则OF= 0。 注意,这里所讲的溢出,只是对有符号数运算而言,对无符号数没有意义。 |
SF | 符号标志SF(sign flag)用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。正数SF=0,负数SF为1。 注意:SF是对有符号数运算有意义的标志位。 |
ZF | 零标志ZF(zero flag)用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。 |
AF | 辅助进位标志AF(auxiliary flag)记录运算时第3位(字节运算)或第7位(字运算)产生的进位或借位值。例如,执行加法指令时第3位有进位时AF=1,否则AF=0。 |
PF | 奇偶标志PF(parity flag)用于反映运算结果中“1”的个数的奇偶性。当结果操作数中1的个数为偶数时PF=l,否则PF=0。 |
CF | 进位标志CF(carry flag)主要用来反映运算是否产生进位或借位。当最高有效位有进位或借位时CF=1,否则置CF=0。 注意:CF是对无符号数运算有意义的标志位 |
无符号数比较示例:
控制标志
控制标志是系统程序或用户程序根据需要用指令设置的。
标志名称 | 说明 |
---|---|
DF | 方向标志DF(direction flag)位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。当DF位为1时,每次操作后使变址寄存器SI和DI减量;当DF为0时,则使SI和DI增量。 |
IF | 中断允许标志IF(interrupt flag)位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下: (1)当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求; (2)当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。 总的来说:IF为1时,开中断,否则关中断。 |
TF | 跟踪标志TF(trap flag), 也叫做陷阱标志。该标志可用于程序调试。TF标志没有专门的指令来设置或清楚。 (1)如果TF=1,则CPU处于单步执行指令的工作方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令。 (2)如果TF=0,则处于连续工作模式。 总的来说:TF=1时,每条指令执行完后产生陷井,TF=0时,CPU正常工作不产生陷井。 |
Debug中标志位的符号表示
标志 | 1 | 0 |
---|---|---|
OF | OV | NV |
DF | DN | UP |
IF | EI | DI |
SF | NG | PL |
ZF | ZR | NZ |
AF | AC | NA |
PF | PE | PO |
CF | CY | NC |
标志寄存器FLAGS
这是一个存放条件码标志、控制标志和系统标志的寄存器。
段寄存器(Segment Register)
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
名称 | 全称 | 说明 |
---|---|---|
CS(Code Segment) | 代码段寄存器 | 代码段存放当前正在运行的程序 |
DS(Data Segment) | 数据段寄存器 | 数据段存放当前正在运行程序所有的数据,如果程序使用了串处理指令,则其操作数也会存放在数据段中。 处理串的时候,DS默认为源串。 |
SS(Stack Segment) | 堆栈段寄存器 | 定义了堆栈所在的区域。 |
ES(Extra Segment) | 附加段寄存器 | 这是一个辅助的数据区,也是串处理指令的目的操作数存放区。 处理串的时候,ES默认为目的串。 |
附录
存储器
存储器是计算机的记忆部件,用来存放程序和数据。按所在的位置,存储器可以分成主存储器和辅助存储器。
主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成,其成本高,容量小,但速度快。
辅助存储器可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低,容量大,但速度较慢。
存储单元
存储器被划分为若干个存储单元,每个存储单元有一个惟一的存储器地址,从0开始顺序编号,存储单元的地址是无符号数, n位二进制数共能表示2^n个存储单元的地址。
类型
Name | 全称 | 说明 |
---|---|---|
DB | define byte | 定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 |
BW | define word | 定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2 |
DD | define double(word) | 定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4 |
字地址
字地址:一个字存放到存储器要占用连续的两个字节单元。字的低字节(低8位)存放在低地址中,高字节(高8位)存放在高地址中,字单元的地址用低地址表示。
例如:34560H的字单元的内容是1234H,而地址为78780H时字单元的内容是3332H。记作:
- (34560H)=1234H
(78780H)= 3332H
同一个地址既可以看成字节单元,也可以看作是字单元、双字单元、或者是4字单元的地址,这要根据使用情况而定。字单元地址可以是偶数,也可以是奇数。但是,在8086和80286中&