20192423杨斯凌 2021-2022-2 《汇编语言程序设计》前四章学习报告

第一章


汇编语言

  • 汇编指令是符号化的机器指令,它与机器指令一一对应——使用助记符(如MOV、ADD)表示相应的操作,使用地址或符号名(如AX)表示操作数。
  • 汇编语言是汇编指令集(含伪指令集)和使用它们规则的统称。
  • 伪指令是在程序设计时所需要的说明性指示语句,便于组织程序结构,无对应的机器指令
  • 本质上说:汇编指令就是符号化的机器指令,汇编语言就是符号化的机器语言。

数制

数制进位规则基数权值举例
十进制 0~9 逢10进1 10 10^k
二进制 0,1 逢2进1 2 2^k
十六进制 0~9,A~F 逢16进1 16 16^k
八进制 0~7 逢8进1 8 8^k

数制转换

十进制→二进制

  • 降幂法
  1. 写出要转换的十进制数
  2. 写出小于此数的各位权值,直到1为止(包括1)
  3. 用要转换的数减去与之最接近的权值,如果够减则在相应位置记下1,否则计0;同时记录差数,差数成为下一轮要转换的数;直到权值为1的位置处有值为止
  4. 从左到右依次写出各位,即为相应的二进制数
  • 除法
  1. 整数
    将要转换的十进制数的整数不断除以2,直到商0为止,记下各次的余数(包括商0的那次)
    将第一个余数至最后一个余数从右向左排列写出即为相应的二进制数
  2. 小数
    将要转换的小数部分不断乘以2,直到结果的小数部分为0或给定的精度为止,记下各次积的整数部分(包括0的那次)
    将第一个整数部分值至最后一个整数部分值从左向右排列写出即为相应的二进制数

二进制→十进制

  • 按权展开求和——一个二进制数的各位二进制数码乘以与其对应的权值之和

十进制→十六进制

  • 降幂法
  • 除法

二进制→十六进制

  • 从最低位(右起)开始每四位直接转换为一位十六进制数值

十六进制→二进制

  • 从最低位(右起)开始每位直接展开为四位二进制数值

带符号数的表示

  • 用最高位作为符号位,0代表“+”,1代表“-”,其余位用作数值位,代表数值。

补码

  • 基本规则——将一个数化为n位二进制形式后,最高位用于表示符号,0表示正数,1表示负数。
    正数:与原码相同,最高位为0,其余位为相应二进制值
    负数
    方法1:2n-该数的绝对值的二进制形式
    方法2:该数绝对值的各位取反后末位加1

  • 补码的数值范围为[- 2n-1,2n-1-1]
    8位二进制补码表示的数值范围是-128~127
    16位二进制补码表示的数值范围是-32768~32767

  • 加法规则 :[X+Y]补 = [X]补 + [Y]补
    减法规则 :[X-Y]补 = [X]补 + [-Y]补

真值→补码
正数:相应的二进制形式
负数:绝对值相应的二进制形式各位求反末位加1

补码→真值
二进制形式最高位为0:二进制对应的值即为真值
二进制形式最高位为1:各位求反末位加1得到真值绝对值的二进制形式,在该值前面添加负号即为真值


字符表示

  • 字符:字母、数字及专门符号
    ASCII (American Standard Code for Information Interchange)码,即美国信息交换标准代码:用一个字节来表示一个字符,低7位为字符的ASCII值。
  • 常用的ASCII码
    ‘A ’ ~ ‘Z ’ : 41H~5AH
    ‘a’ ~ ‘z’ : 61H~7A H
    ‘0’ ~‘9’ : 30H~39H
    换行 0AH
    回车 0DH
    空格 20H

逻辑运算

与运算(AND)

ABA AND B
0 0 0
0 1 0
1 0 0
1 1 1

或运算(OR)

ABA OR B
0 0 0
0 1 1
1 0 1
1 1 1

非运算(NOT)

ANOT A
0 1
1 0

异或运算(XOR)

ABA XOR B
0 0 0
0 1 1
1 0 1
1 1 0

第二章

IBM-PC微机基本结构


一. 微机的一般构成

  • 计算机一般应包括五大部件:

      运算器、控制器、存储器、输入设备和输出设备。
      将运算器和控制器两大部件集成在一个集成电路芯片上,称为中央处理器 ,简称CPU,也叫微处理器.
    

1. 中央处理器CPU

微型计算机中的中央处理器也叫微处理器。它包括运算器和控制器。

功能:
分析从主存储器取来的各条指令的功能,控制计算机各部件完成指定功能的各项操作。
2. 主存储器

- 主存储器是用来存放程序和数据的部件。它由若干个存储单元构成。
- 存储单元的多少表示存储器的容量。每个存储单元使用一个唯一的编号来标识,称为存储单元的地址。
- 对每个存储单元内容的存和取是按照地址进行访问的。
- 计算机存储信息的最小单位是二进制位bit,一位可存储一个二进制数0或1。每8位组成一个字节(BYTE)。
- 在大多数计算机中,存储器的组织都是以字节为基本单位。每一个基本单位称为一个存储单元。

在计算机中,除了主存储器之外,一般还配置有辅助存储器,简称辅存。由于它的位置是在主机之外,因此也叫做外存。

3. 输入输出设备及接口

-输入设备将外部信息(程序、数据和命令)送入计算机。包括键盘、鼠标等。
-输出设备将计算机处理后的结果转换为人或其它系统能识别的信息形式向外输出。如显示器、打印机等。
-有的设备既具有输入功能又具有输出功能。如磁盘、磁带、触摸显示屏等。

I/O接口是主机与I/O设备之间设置的逻辑控制部件。通过它实现主机与I/O设备间的信息传送。

4. 系统总线

-系统总线将CPU、存储器和I/O设备连接起来,实现各大部件之间的各种信息传送。
-系统总线包括地址总线、数据总线和控制总线三组。它们分别用于传送不同的信息。

Intel 8086/8088 CPU的功能结构

CPU执行指令序列就是重复执行以下两个步骤:

  • 从存储器中取指令
  • 执行指令规定的操作

这两个步骤的执行又分为串行方式和指令流水线方式。

  1. 串行方式
    (1)当CPU在指令执行阶段,不需要占用系统总线,但此时总线也不工作,因此系统总线的空闲时间比较多 。
    (2)在从存储器取指令、取数据或存数据时,总线处于忙状态,其所占用的时间也较长。而CPU却只需要花很短的时间去处理,因此大部分时间处于闲置状态。
    采用串行工作方式的计算机其运行速度较慢

  2. 指令流水线方式
    采用指令流水线工作方式的计算机具有较高的工作效率。CPU内部采用了一种先进的指令流水线结构,这种结构可以有效而充分地利用各主要硬件资源。
    要实现指令流水线方式,从CPU组成结构上要划分成多个单元。8086/8088CPU被划分成两个单元。

1. 执行单元EU
EU的主要任务是分析与执行指令,具体包括:

A、从指令队列中取出指令代码,由控制器译码后产生 相应的控制信号,控制各部件完成指令规足的操作。
B、对操作数执行各种指定的算术或逻辑运算。
C、向总线接口单元BIU发送访问主存或I/O的命令,并 提供相应的地址和传送的数据。

2. 总线接口单元BIU
BIU负责CPU与存储器、I/O的信息传送。具体包括:

A、取指令——根据CS寄存器和指令指针IP形成20位的物 理地址,从相应的存储器单元中取出指令,暂存到指令队 列中,等待EU取走并执行。
B、存取数据——在EU执行指令的过程中,需要与存储器 或I/O端口传送数据时,由EU提供的数据和地址,结合段 寄存器,通过系统总线与存储器或I/O进行数据的存取。

EU和BIU是既分工又合作的两个独立部分。它们的操 作在一定程度上是并行工作的,分别完成不同的任务,从 而大大加快了指令执行速度。


Intel 8086/8088CPU寄存器结构及其用途

一、通用寄存器

Intel 8086/8088有8个16位通用寄存器,它们具有良好 的通用性,并且还可以用作某个特定的功能,可以由程序 设计人员进行编程访问。
1. 数据寄存器

它包括AX、BX、CX和DX四个寄存器。它们中的每一 个既可以是16位寄存器,也可以分成两个8位寄存器使用。 即可以当作8个独立的8位寄存器使用。
数据寄存器既可以用来存放参加运算的操作数,也可以 存放运算的结果。在多数情况下,使用这些寄存器时必须在 指令中明确指示。

在有些指令中,不需要明确指出使用的寄存器名,即 隐念使用了某寄存器,称为隐含使用。
个别指令对寄存器有特定的使用,并且又必须在指令中 指明它的名字,这类寄存器的使用称为特定使用。

2. 指针寄存器

指针寄存器有堆栈指针SP和基址指针BP
它们一般被用来存放16位地址,在形成20位的物理地 址时常被作为偏移量使用。

SP指针——在进行堆栈操作时,被隐含使用,被用来指向 堆栈顶部单元。
BP指针——被用来指向堆栈段内某一存储单元。BP除用作 地址指针外也可以象数据寄存器一样,存放参加运算的操 作数和运算的结果。

3. 变址寄存器
有两个16位的变址寄存器SI和DL 一般被用来作地址指针。

SI——源变址寄存器	
DI—— 目的变址寄存器

同BP寄存器一样,SI和DI也可以用作通用数据寄存器存放操作数和运算结果。

二、段寄存器

8086/8088CPU在使用存储器时,将它划分成若干个段。每个段用来存放不同目的内容。每个存储段用一个段寄存器来指明该段的起始位置(也叫 段基址)。
CPU在访问存储器时必须指明两个内容:

(1)所访问的存储单元属于哪个段,即指明使用的段 寄存器。
(2)该存储单元与段起始地址(段基址)相距多少, 即偏移量。

在程序设计中,一个程序将存储器划分成多少个存 储段是任意的。但在程序运行的任何时刻最多只有4个 段,分别由CS、DS、ES和SS指定。

三、指令指针IP

CPU在从存储器取指令时,以段寄存器CS作为代码段的 基址指针,以IP的内容作为偏移量,共同形成一条指令 的存放地址。
当CPU从内存中取岀一条指令后,IP内容自动修改为指 向下一条指令。

注意:IP的内容不能被直接访问,既不能用指令去读IP 的值,也不能用指令给它赋值。但是可以通过某些指令的 执行而自动修改IP的内容。

  • 下面两种指令可以自动改变IP寄存器的内容。

      转移指令将指令中的目的地址的偏移量送入IP
      子程序调用指令CALL,将IP原有内容自动压入堆栈, 而将子程序的入口地址偏移量自动送入IP,而返回指令 RET,又自动从堆栈中弹回原有IP的内容。
    

四、标志寄存器

标志寄存器是用来反映CPU在程序运行时的某些状态, 如是否有进位、奇偶性、结果的符号、结果是否为零等等。
1. 进位标志位CF

在进行算术运算时,若最高位(对字操作是第15位,字节操作是第7位)产生进位或借位时CF被自动置“1”,否则置“0”
在移位类指令中,CF也被用来存放从最高位(左移时)或最 低位(右移时)移岀的数值(0或1) o

2. 奇偶标志位PF

当指令操作结果的低8位中含有1的个数为偶数时,贝IJPF 被置1,否则PF被置0。

注意:PF只反映操作结果的低8位的奇偶性,与指令操作数的长度无关。

3. 辅助进位标志位AF

在进行算术运算时,若低字节的低四位向高4位产 生进位或借位,即第3位产生进位或借位时,AF位被置1, 否则置0。AF标志位用于十进制运算的调整。

注意:AF只反映运算结果低八位,与操作数长度无关。

4. 零值标志位ZF

若运算结果各位全为0,贝IJZF被置1,否则置0。

5. 符号标志位SF

将运算结果视为带符号数,当运算结果为负数时SF 被置1,为正数时,则置0。
由于第7位是字节操作数的符号位,而第15位是字操 作数的符号位,因此,SF位与运算结果的最高位(第7 位或第15位)相同。

6. 溢岀标志位OF

当运算结果超过机器用补码所能表示数的范围时, 则OF置1,否则置0.
字节数据,机器用补码所能表示的数范围为-128〜+127。 字数据的表示范围为:-32768〜+32767

注意:溢岀与进位是两个完全不同的概念,不能相互混淆。

7. 单步标志位TF

单步标志也叫跟踪位,该标志为控制标志位。单步标志 位供调试程序使用。
当TF位被设置为1时,每执行一条指令后,CPU暂停运 行,即产生单步中断。

8. 中断允许标志位IF

该标志位为控制标志位。当IF被设置为1时,CPU可以 响应可屏蔽中断,否则不允许响应可屏蔽中断。

9. 方向标志位DF

DF也是控制标志位。它被用来规定串操作指令的增减 方向。
当DF=O时,串操作指令自动使变址寄存器(SI和DI) 的内容递増。当DF=1时,串操作指令自动使变址寄存器的 内容递减。

存储器组织结构

一、存储器的组成

1. 存储器是由若干个存储单元构成存储单元的多少就表示了存储器的容量.
2. 每个存储单元存放相同长度的二进制数一个存储单元的长度一般为8位二进制数,即一个字节。
3. 每个存储单元有一个唯一的地址编号,简称地址。
4. 任何两个相邻字节单元就构成一个字单元
一个字存储单元(WORD)的长度为16位二进制数,即两个字节。字单元的地址为两个字节单元中较小地址字节单元的地址。16位长数据的存放规则是低8位放在较低地址字节单元中,高8位放在较高地址字节单元中。
5. 在定义一个地址时必须指岀是字节或字类型属性

二、存储器的段结构

8086/8088系统的存储器段结构具有以下几个特点:

1. 8086/8088CPU将1MB的存储空间划分成若干个段,每 个段最大长度为64K (65536)个字节单元组成。
2.每个段的基址(段基址)必须是一个小节的首址。
    段基址——一个段的起始地址。
    每个小节的首地址最低位必为0
3.逻辑段在物理存储器中可以是邻接的、间隔的、 部分重叠的和完全重叠的等4种情况。
4.在任一时刻,一个程序只能访问4个当前段中的内容。
    4个当前段分别是代码段、数据段、堆栈段和附加段。

三、逻辑地址与物理地址及对应关系

1. 物理地址
在1MB的存储空间中,每个存储单元的物理地址是唯 一的,它就是该存储单元的20位地址。
8086/8088的物理地址范围:00000H〜0FFFFFH

2. 逻辑地址
在程序设计中,为了便于程序的开发和对存储器进行动 态管理,使用了逻辑地址。
逻辑地址包括两个部分:段基值和偏移量

段基值:存放在某一个段寄存器中,是一个逻辑段的起始 单元地址(段基址)的高16位。
偏移量:表示某个存储单元与它所在段的段基址之间的字 节距离。

3. 逻辑地址转换为物理地址
当CPU要访问存储器时,需要由总线接口单元BIU将逻辑地址转换成物理地址

转换方法:将逻辑地址的段基值左移4位,形成20位的段基址(低位为0)然后与16位的偏移量相加,结果即为20位的物理地址。

4.逻辑地址的来源
在程序的执行过程中,CPU根据不同操作类型访问存储器,其逻辑地址中段基值和偏移量的来源是不一样的。


堆栈及其操作方法

堆栈是一个特定的存储区,访问该存储区一般需要按 照专门的规则进行操作。
堆栈的用途:主要用于暂存数据以及在过程调用或处理 中断时保存断点信息。

一、堆栈的构造

堆栈一般分为:专用堆栈存储器和软件堆栈

专用堆栈存储器:按堆栈的工作方式专门设计的存储器
软件堆栈:由程序设计人员用软件在内存中划岀的一块存储区 作为堆栈来使用。8086/8088釆用这种方式。

堆栈的一端是固定的,称为栈底。栈底是堆栈存储区的最大地址单元。
另一端是浮动的,称为栈顶。在任何时刻,栈顶是最后存入 信息的存储单元。栈顶是随着堆栈中存放信息的多少而改变。
为了指示现在堆栈中存放数据位置,通常设置一个寄存 器SP来指示栈顶位置。SP的内容始终指向栈顶单元,堆栈中数据进岀都由SP来控制
在堆栈中存取数据的规则是:“先进后出FILO”。

二、8086/8088堆栈的组织

在8086/8088微机中堆栈是由堆栈段寄存器SS指示的一段存储区。
顶由椎栈指针SP指示。
SP内容为最大(初始) 值时,表示堆栈为空。而当(SP) =0时,表示堆栈全满。
通过改变堆栈段寄存器SS的内容,即可改变到另一个 堆栈段,当改变了堆栈段寄存器SS的内容后,必须紧接着 赋予SP新值。

三、堆栈操作

1. 设置堆栈

设置堆栈主要是对堆栈段寄存器SS和堆栈指针SP赋值。

2. 进栈PUSH

进栈就是把数据存入堆栈。由指令PUSH或者由机器自动 实现,可以将通用寄存器、段寄存器或字存储单元的内容压 入堆栈顶部。

进栈的执行过程:
(1)首先将堆栈指针SP减2,即指向一个空的堆栈字单元

  • SP<=(SP)-2

(2)将要储存的内容(寄存器或存储单元的内容)送入SP指向的字单元中。

  • (SP) v=数据

3. 岀栈POP

岀栈操作由POP指令或机器自动实现,它从堆栈顶 部弾出--个字到通用寄存器、段寄存器或字存储单元。

岀栈的操作过程:
(1)将SP指向的字单元(即栈顶字单元)内容送往指定 的寄存器或存储器。

  • 寄存器/存储器v=((SP))

(2)堆栈指针SP内容加2,

  • SP<= (SP) +2

第三章 寻址方式与指令系统

寻址方式

—条指令通常由两大部分构成:

操作码表示该指令应完成的具体操作,如加法、减法、 乘法、移位等等。在汇编语言中使用一定的符号来表示,称 为助记符。如ADD、PUSH、POP、MOV等等。
操作数表示该指令的操作对象。如移位操作的被移位数, 加法操作的加数等等。它可以是一个操作数,也可以是多个 操作数。这取决于操作码部分的具体需要。

Intel 8086/8088各指令中提供操作数的方法有以下四种:

(1)	立即数操作数——操作数在指令代码中提供
(2)	寄存器操作数——操作数在CPU的通用寄存器或 段寄存器中
(3)	存储器操作数——操作数在内存的存储单元中
(4)	I/O端口操作数——操作数在输入/输出接口的寄 存器中

1. 立即数寻址
立即数寻址方式的指令中,所需操作数直接包含在指令 代码中,这种操作数称为立即数。
2. 寄存器寻址
寄存器寻址方式是指指令中所需的操作数在CPU的某个 寄存器中。寄存器可以是8位或16位通用寄存器,或者是段 寄存器。
3. 直接寻址
在直接寻址方式的指令中,操作数的有效地址EA只有 位移技地址分量。
(1)用符号表示
例:MOV BX, VAR =>MOV BX, DS: VAR 它表示将数据段中,偏移了VAR个字节距离的字单元 内容送到寄存器BX中。
(2)用常数表示
例:MOV AX, DS: [64H]
它表示从当前数据段开始,偏移100个字节的字单元内容 送到AX中。
注意:用常数表示时,必须用方括号括起来。段寄存 器不能省略。

4. 寄存器间接寻址

操作数有效地址EA直接从基址寄存器(BX或BP)或 变址寄存器(SI或DI)中获得。

5. 基址寻址和变址寻址
操作数的有效地址EA等于基地址分量或变址分量加上 指令中给出的位移量。
指令中使用BX或BP时为基址寻址。指令中使用SI或DI时 为变址寻址。

6. 基址变址寻址
操作数的有效地址是三个地址分量之和,即:

  • EA=基址+变址+位移量

当基址选用BX时隐含使用段寄存器DS,而选用BP时 则隐含使用段寄存器SS。

7. 串操作寻址方式

在寻找源操作数时,隐含使用SI作为地址指针。
在寻找目的串时,隐含使用DI作为地址指针。
在串操作完成之后,自动对SI和DI进行修改,使它们指 向下一个操作数。

8. I/O端口寻址
(1)存储器编址方法
将I/O端口视为存储器的一个单元,对端口的访问就如 同访问存储单元一样。访问存储器的指令和各种寻址方式 同样适用对I/O端口的访问。
特点:程序设计灵活,但需要占用存储地址空间。
(2) I/O端口编址方法
I/O端口的地址与存储器地址分开,并使用专门的输入指令和 输出指令。

  • 直接端口寻址
    在指令中直接给岀端口地址,端口地址一般采用2位十六进 制数,也可以用符号表示。
  • 寄存器间接端口寻址
    寄存器间接端口寻址:把I/O端口的地址先送到DX中,用 DX作间接寻址寄存器。
    如果访问的端口地址值大于255,则必须用I/O端口的间 接寻址方式。

指令系统

一、传送类指令

1. 通用数据传送指令
指令格式:MOV DEST, SRC

当指令执行完后,目的操作数原有的内容被源操作数内 容覆盖,即目的操作数和源操作数具有相同内容。

MOV指令在使用时需注意以下几个问题:

(1)立即数只能作源操作数,且它不能传送给段寄存器。
(2)段寄存器CS只能作源操作数,段寄存器之间不能直 接传送。
(3)存储单元之间不能直接传送数据
(4) MOV指令不影响标志位

2.交换指令
指令格式:XCHG DEST, SRC
作用:源操作数和目的操作数两者内容相互交换。
指令对标志寄存器各位无影响

数据交换可以在寄存器之间或寄存器与存储器单元之 冋进行。但是不能在存储单元之间直接进行数据交换。寄 存器只能使用通用寄存器。

3.标志传送指令
(1)取标志寄存器指令

  • 指令格式:LAHF
  • 作用:将标志寄存器的低8位送入AH寄存器,即将标志
    SF、ZF、AF、PF和CF分别送入AH的第7、6、4、2、0 位,而AH的第5、3、1位不确定。

指令执行对标志寄存器各位无影响,即标志寄存器各位不变.

(2)存储标志寄存器指令

  • 指令格式:SAH F
  • 作用:将寄存器AH中的第7、6、4、2、0位分别送入标志寄 存攜的SF、ZF、AF、PF和CF各标志位。而标志寄存器高8 位中的各标志位不受影响。

(3)标志进栈指令

  • 指令格式:PUSH F
  • 作用:先将堆栈指针SP减2,使其指向堆栈顶部的空字单元, 然后将16位标志寄存器的内容送SP指向的字单元。

(4)标志出栈指令

  • 指令格式:POP F
  • 作用:将由SP指向的堆栈顶部的一个字单元的内容送 入标志寄存器,然后SP的内容加2

4.地址传送指令

(1)装入有效地址

  • 格式:LEA DEST, SRC
  • 作用:将SRC存储单元地址中的偏移量,即有效地址EA 传送到一个16位通用寄存器中。指令执行对标志寄存器各位无影响。

(2)装入地址指针指令

  • 格式:LDS DEST, SRC 
  •            LES DEST, SRC
  • 作用:把SRC存储单元开始的4个字节单元的内容 (32位地址指针)送入DEST通用寄存器和段寄存器 DS (LDS指令)或ES (LES指令),其中低字单 元内容为偏移量送通用寄存器,高字单元内容为段 基值送DS或ES。

二、算术运算类指令

1.加法指令

  • 指令格式:ADD DEST, SRC
  • 功能:目的操作数和源操作数和加,其和存放到 目的操作数中,而源操作数内容保持不变,即
    DEST<=(DEST)+(SRC)。

2.带进位加法指令

  • 指令格式:ADC DEST, SRC
  • 该指令的功能与ADD基本相同,所不同的是其结果 还要加上进位标志CF的值,即:
    DEST<=(DEST)+(SRC)+CF

3 .加1指令

  • 指令格式:INC DEST
  • 该指令为单操作数指令,其功能是将目的操作数加
    1,并送回到目的操作数,
    即:DEST<=(DEST)+1

4 .减法指令

  • 指令格式:SUB DEST, SRC
  • 功能:目的操作数的内容减去源操作数的内容,结果 送入目的操作数,源操作数中内容保持不变。
    即:DEST<= (DEST) — (SRC)

5 .带借位减法

  • 指令格式:SBB DEST, SRC
  • 该指令的功能与SUB指令基本相同,不同的是在两 个操作数相减后再减去进位标志CF的值。
    即:DEST<=(DEST) —(SRC)—CF。

6.减1指令

  • 指令格式:DEC DEST
  • 该指令为单操作数指令,将目的操作数的内容减1 后,送回到目的操作数。
    即:DEST<=(DEST) —1

7.求负数指令

  • 指令格式:NEG DEST
  • 功能:用零减去目的操作数的内容,并送回目的操 作数。
    即:DEST<=0-(DEST)

三、位操作类指令

1.逻辑运算指令
逻辑运算指令共有4条,它们的指令格式分别是:
逻辑“与”指令 AND DEST,SRC
逻辑“或”指令 OR DEST,SRC
逻辑“异或”指令 XOR DEST,SRC
逻辑“非”指令 NOT DEST

DESTSRCANDORXORNOT
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

2.测试指令

  • 指令格式:TEST DEST, SRC
  • 该指令的功能与AND指令相似,实现源操作数与 目的操作数进行按位“逻辑与"运算,对标志位 的影响与AND指令相同,但运算的结果不送入目 的操作数,即目的操作数内容也将保持不变

3.移位/循环移位指令

(1)算术移位

算术左移SAL DEST,COUNT
算术右移 SAR DEST,COUNT

(2)逻辑移位

逻辑左移SHL DEST,COUNT
逻辑右移 SHR DEST,COUNT

(3)循环移位
小循环:

循环左移ROL DEST,COUNT
循环右移 ROR DEST,COUNT

大循环:

带进位循环左移RCL DEST,COUNT
带进位循环右移 RCR DEST,COUNT

四、处理器控制类指令

1. 标志位操作指令
它们都是无操作数指令,操作数隐含为标志寄存器的 某个标志位。能直接操作的标志位有CF、IF和DF。

(1)消除进位标志 CLC ;置CF为0
(2)置1进位标志 STC ;置CF为 1
(3)进位标志取反 CMC ; CF的值取反
(4)清除方向标志 CLD;置DF为0
(5)置1方向标志 STD;置DF为 1
(6)清除中断标志 CLI;置IF为0
(7)置1中断标志 STI;置IF为 1

2. 与外部事件同步的指令

  • HLT ;暂停指令
  • WAIT ;等待指令
  • ESC ;外部协处理器指令前缀
  • LOCK ;总线锁定指令

3. 空操作指令NOP
执行一次NOP占用CPU三个时钟周期,它不改变任 何寄存器或存储单元内容,主要用于延时。


指令编码

一、双操作数指令编码格式

1. 操作特征部分
这部分为指令编码的首字节,它又分为以下三个段。
(1) OPCODE:操作码字段
该字段长度为6bit。它表示了该指令所执行的功能 和两个操作数的来源。
(2)方向字段d
该字段与第2部分寻址特征一起来决定源操作数和 目的操作数的来源。
(3)字/字节字段W
当W=1时,表示两操作数长度为字;当W=0时,表 示两操作数长度为字节。

2. 寻址特征部分

  • 当d=l时,则目的操作数由REG字段确定,而源操作 数由MOD和R/M字段确定o
  • 当d=0时,则目的操作数由MOD和R/M字段确定,而 源操作数由REG字段确定。

(1) REG字段
由REG字段确定的一个操作数是某一通用寄存器的 内容,即使用的是寄存器寻址方式。

REG000001010011
段寄存器 ES CS SS DS

(2)寻址方式字段MOD和寄存器/存储器字段R/M

这两个字段共同确定一个操作数。该操作数可以 在寄存器中,也可以在存储器中

3. 位移量部分

根据寻址特征中MOD和R/M字段确定的有效地址 计算方法,位移量可以是以下三种情况之一:

  • 没有位移量
  • 1字节位移量disp8
  • 2字节位移量displ6

4. 立即数部分

如果指令的源操作数为立即数,则指令编码中包含 有该部分。它总是位于指令编码的最后1〜2字节。

二、单操作数指令编码格式

这种编码格式适用于只有一个操作数的指令,如INC、 DEC、移位/循环等指令。指令编码为2〜3字节。

操作特征部分:
包括OPCODE、V和W三个字段,其中V字段只有移位/ 循环指令中才有该字段。其它指令中没有该字段。

  • V=0时,指令中使用常数1作为移位或循环次数。
  • V=1时,指令中使用寄存器CL作移位次数。
    由于单操作数指令中只有一个操作数,因此寻址特征部分就不需要REG字段,而该字段被用作辅助操作码。

三、与AX或AL有关的指令编码格式

这种编码格式用于隐含指定AX/AL作为一个操作数 的双操作数指令。
采用这种编码格式的指令,除一个操作数隐含指定为 AX/AL外,另一个操作数可以是立即数或存储单元。
立即数:则编码中应有1〜2字节的立即数
存储单元:只能使用直接寻址方式,位 移量由disp字段给岀。

四、其它指令编码格式

除上述三种编码格式外,还有一些指令的编码格式更简单。如标志位操作指令、堆栈操作指令等。 这些指令的编码格式一般只有一个字节。



第四章 汇编语言程序格式

汇编语言语句种类及其格式

一、指令语句

1 .标号字段

  • 标号是可选字段,它后面必须有“:”标号是一 条指令的符号地址,代表了该指令的第一个字节存放地址。
  • 标号一般放在一个程序段或子程序的入口处,控制 程序的执行转到该程序位置。
  • 例 ADDR1: MOV AL, 100

2 .指令助记符字段

  • 该字段是一条指令的必选项,它表示这条语句要求 CPU完成什么具体操作,如MOV、ADD、SHL等。
  • 有些指令还可以在指令助记符的前面加上前缀,实 现一定的附加操作。

3.操作数字段

  • 一条指令可以有一个操作数、两个操作数或者无操作数。

4.注释字段

  • 注释字段为可选项,该字段以分号“;”开始。
  • 它的作用是为阅读程序的人加上一些说明性内容
  • 注释字段不会产生机器目标代码,它不会影响程 序和指令的功能。
  • 注释字段可以是一条指令的后面部分,也可以是 整个语句行。

二、伪指令语句

伪指令语句又叫命令语句
伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。

1.符号名字段

  • 该字段为可选项。根据伪指令的不同,符号名可 以是常量名、变量名、过程名、结构名和记录名
  • 一条伪指令语句的符号名可以作其它伪指令语句 或指令语句的操作数,这时它表示一个常量或存储器地址

2.伪指令符字段

  • 该字段是伪指令语句的必选项,它规定了汇编 程序所要完成的具体操作。

3.操作数字段

  • 该字段是否需要,以及需要几个是由伪指令符 字段来决定。
  • 操作数可以是一个常数

4.注释字段

  • 注释字段为可选项,该字段必须以分号开始。 其作用与指令语句的注释字段相同。

三、标识符

指令语句中的标号利伪指令语句中符号名统 称为标识符。标识符是由若干个字符构成的。
标识符构成规则:
1.字符的个数为1〜31个;
2.第一个字符必须是字母、问号、@或下划线“” 这4种字符之一;
3.从第二个字符开始,可以是字母、数字、@、“

或问号“?”;
4.不能使用属于系统专用的保留字。


汇编语言数据

在汇编语言中常用的数据形式有:常数、变 量和标号

一、常数

常数有以下几种形式:

1.二进制数:以字母B结尾。
2.八进制数:以字母O或Q结尾。
3.十进制数:以字母D结尾,或者没有结尾字 母。
4.十六进制数:以字母H结尾,如果常数的第一个数字为字母,为了与标识符加以区别,必须在其前面冠以数字“0”。
5.实数。
6.字符串常数:用引号(单引号或双引号)括起 来的一个或多个字符,这些字符以它的ASCII码 值存储在内存。

常数在程序中可以用在以下几种情况:

(1)作指令语句的源操作数
(2)在指令语句的直接寻址方式、变址(基址)寻 址方式或基址变址寻址方式中作位移量。
(3)在数据定义伪指令中使用

二、变量

1.变量的定义与预置
定义变量就是给变量在内存中分配一定的存储单 元。也就是给这个存储单元赋与一个符号名,即变量 名,同时还要将这些存储单元预置初值。
变量定义的一般格式:

定义变量含义
DB 定义字节变量
DW 定义字变量
DD 表达式1,表达式2... 定义4字节变量
DQ 定义8字节变量
DT 定义10字节变量

其中表达式1、表达式2是给存储单元赋的初值。

当变量被定义后,就具有了以下三个属性:
(1)段属性
它表示变量存放在哪一个逻辑段中。
(2)偏移量属性(OFFSET)
它表示变量所在位置与段起始点之间的字节数。
段属性和偏移量属性就构造了变量的逻辑地址
(3)类型属性
它表示变量占用存储单元的字节数。

在变量的定义语句中,给变量赋初值的表达式可以使 用下面4种形式:
(1)数值表达式

  • 例如:DATA1 DB 32, 30H

(2) ?表达式

  • 不帯引号的问号“?"表示可以预置任意内容。

(3)字符串表达式

  • 对于DB伪指令,字符串为用引号括起来的不超过255 个字符。给每一个字符分配一个字节单元。字符串按从左 到右,将字符的ASCII编码值以地址递增的排列顺序依次 存放。

(4) DUP表达式

  • DUP称为重复数据操作符。
  • 格式:
    变量名 DW/DB/DD 表达式1 DUP (表达式2)

其中:表达式1是重复的次数,表达式2是重复的内容。

2.变量的使用
(1)在指令语句中引用

  • 在指令语句中直接引用变量名就是对其存储单元的内容进 行存取
  • 当变量出现在变址(基址)寻址或基址变址寻址的操作数 中时表示取用该变量的偏移量。

(2)在伪指令语句中引用

三、标号

  • 标号写在一条指令的前面,它就是该指令在内存的 存放地址的符号表示,也就是指令地址的别名。
  • 标号主要用在程序中需要改变程序的执行顺序时, 用来标记转移的目的地,即作转移指令的操作数。

每个标号具有三属性

(1)段属性(SEG)
它表示该标号所代表的地址在娜个逻辑段中,即段基值。
(2)偏移量属性(OFFSET)
它表示该标号所代表的地址在段内与段起点间的字节 数,即地址的偏移量。
(3)距离属性(也叫类型属性)
它表示该标号可以被段内还是段间的指令调用。

  • NEAR (近): 该标号只能作段内转移,也就是说只能
    是与该标号所指指令同在一个逻辑段的转移指令和 调用指令才能使用它。
  • FAR (远): 该标号可以被非本段的转移和调用指令使用。
    标号的距离属性可以右两种方法来指定:
    a.隐含方式
    b.用LABEL伪指令给标号指定距离属性

符号定义语句

一、等值语句

语句格式:符号名 EQU 表达式

  • 功能:用符号名来表示EQU右边的表达式。后面的程序中 一旦岀现该符号名,汇编程序将把它替换成该表达式。
    表达式可以是任何形式,常见的以下:

1.常数或数值表达式
COUNT EQU 5
NUM EQU COUNT+5
2 .地址表达式
ADRI EQU DS: [BP+14]
ADRI被定义为在DS数据段中以BP作基址寻址的一个 存储单元。
3.变量、寄存器名或指令助记符

二、等号语句

格式:符号名 =表达式
-等号语句与等值语句具有相同的作用。但等号语句可以 对一个符号进行多次定义。


表达式与运算符

表达式是指令或伪指令语句操作数的常见形式。它由 常数、变量、标号等通过操作运算符连接而成。

一、算术运算符

+、-、*、/、MOD、SHL、SHR、[]

1.运算符“+”和“-”也可作单目运算符,表示数的正负。
2. 使用“+”、“-”、“*”、和“/”运算符时,参加运算 的数和运算结果都是整数
3.“/”运算为取商的整数部分,而“MOD”运算取除法运 算的余数。
4.“SHR ”和“SHL ”为逻辑移位运算符
“SHR”为右移,左边移出来的空位用0补入
“SHL”为左移,右边移出来的空位用0补入
5.下标运算符“[]”具有相加的作用
一般使用格式: 表达式1 [表达式2]

二、逻辑运算符

逻辑运算符有NOT、AND、OR和XOR等四个,它们执 行的都是按位逻辑运算。

三、关系运算符

关系运算符包括:

运算符含义
EQ 等于
NE 不等于
LT 小 于
LE 小于等于
GT 大于
GE 大于等于

关系运算的结果只能是**“真”(全1)或“假”(全0)**

四、数值返回运算符

1.SEG运算符
作用:取变量或标号所在段的段基值。

2.OFFSET运算符
该运算符的作用是取变量或标号在段内的偏移量。

3.TYPE运算符
作用:取变量或标号的类型属性, 来说就是取它的字节长度。

4.LENGTH运算符
该运算符用于取变量的长度
>如果变量是用重复数据操作符DUP说明的,则LENGTH运 算取外层DUP给定的值。
>如果没有用DUP说明,贝0LENGTH运算返回值总是1。

5.SIZE运算符
该运算符只能作用于变量,SIZE取值等于LENGTH和 TYPE两个运算符返回值的乘积。

五、属性修改运算符

1.PTR运算符

  • 使用格式: 类型PTR地址表达式
  • 作用:将地址表达式所指定的标号、变量或用其它形式表 示的存储器地址的类型属性修改为“类型”所指的值。
    类型可以是BYTE、WORD、DWORD、NEAR和FAR。 这种修改是临时的,只在含有该运算符的语句内有效。

2.HIGH/LOW 运算符

  • 使用格式:HIGH表达式 
  •                   LOW表达式
  • 这两个运算符用来将表达式的偵分离出高字节和低字节。

注意:HIGH/LOW运算符不能用来分离一个变量、寄 存器或存储器单元的高字节与低字节。

3.THIS运算符

  • THIS运算符一般与等值运算符EQU连用,用来定 义一个变量或标号的类型属性。所定义的变量或标号的
    段基值利偏移量与紧跟其后的变量或标号相同。
六、运算符的优先级

在一个表达式中如果存在多个运算符时,在计算时就有先 后顺序问题。不同的运算符具有不同的运算优先级别。

优先级别运算符
(最高)1 LENGTH, SIZE ,圆括号
2 PTR, OFFSET, SEG, TYPE, THIS
3 HIGH, LOW
4 *, /, MOD, SHR, SHL
5 + ,-
6 EQ, NE, LT, LE, GT, GE
7 NOT
8 AND
(最低)9 OR, XOR

汇编程序在计算表达式时,按以下规则进行运算:

  • 先执行优先级别高的运算,再算较低级别运算;
  • 相同优先级别的操作,按照在表达式中的顺序,从 左到右进行;
  • 可以用圖括号改变运算的顺序。

程序的段结构

一、段定义伪指令
  • 伪指令SEGMENT和ENDS用于定义一个逻辑段。使 用时必须配对,分别表示定义的开始与结束。
  • 格式:
    段名SEGMENT [定位类型][组合类型]『'类别名']
    ......本段语句序列
    段名ENDS

1、段名

  • 段名是用户自己任意选定的,符合标识符定义 规则的一个名称。
  • 最好选用与该逻辑段用途相关的名称。如第--个数 据段为DATA1,第二个数据为DATA2等。
  • 一个段的升始与结尾用的段名必须-致。

2、定位类型

(1)PAGE:表示该段从一个页面的边界开始
由于一个页面为256个字节,并且页面编号从0开始,因此, PAGE定位类型的段起始地址的最后8位二进制数一定为0, 即以00H结尾的地址。
(2)PARA:表示该段从一个小节的边界开始
如果用户未选定位类型,则缺省为PARA。
(3) WORD:表示该段从一个偶数字节地址开始,即段起始 单元地址的最后一位二进制数一定是0。
(4) BYTE:表示该段起始单元地址可以是任一地址值。
注意:定位类型为PAGE和PARA时,段起始地址与段基址 相同。定位类型为WORD和BYTE时,段起始地址与段基址 可能不同。

3、组合类型

(1)若未指定组合类型,表示本段与其它段无连接关系。在 装入内存时,本段有自己的物理段,因此有自己的段基址
(2) PUBLIC:在满足定位类型的前提下,将与该段同名的 段邻接在一起,形成一个新的逻辑段,共用一个段基址。段 内的所有偏移量调整为相对于新逻辑段的段基址。
(3) COMMON:产生一个覆盖段。在多个模块连接时,把 该段与其它也用COMMON说明的同名段置成相同的段基址, 这样可达到共享同一存储区。共享存储区的长度由同名段中 最大的段确定。
(4) STACK:把所有同名段连接成一个连续段,且系统自动 对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指 针SP
用户程序中应至少有一个段用STACK说明,否则需要用 户程序自己初始化SS和SP。
(5) AT表达式:表示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。
(6) MEMORY:表示本段在存储器中应定位在所有其它段之 后的最高地址上。如果有多个用MEMORY说明的段,则只处 理第一个用MEMORY说明的段。其余的被视为COMMON

4.类别名

  • 类别名为某一个段或几个相同类型段设定的类型名称。系 统在进行连接处理时,把类别名相同的段存放在相邻的存储 区,但段的划分与使用仍按原来的设定。
  • 类别名必须用单引号引起来。所用字符串可任意选定,
二、段寻址伪指令
  • 段寻址伪指令ASSUME的作用是告诉汇编程序,在处理源 程序时,定义的段与哪个寄存器关联。
  • 一般格式:ASSUME段寄存器名:段名,段寄存器名:段名,..
三、段寄存器的装入

1、DS和ES的装入
在程序中,使用数据传送语句来实现对DS和ES的装入。

2、SS的装入
SS的装入有两种方法

(1)在段定义伪指令的组合类型项中,使用STACK参 数,并在段寻址伪指令ASSUME语句中把该段与SS段寄 存器关联。
(2)如果在段定义伪指令的组合类型中,未使用STACK 参数,或者是在程序中要调换到另一个堆栈,这时,可以 使用类似于DS和ES的装入方法。

3、CS的装入

装入CS和IP一般有下面两种情况。

(1)由系统软件按照结束伪指令指定的地址装入初始的CS和IP

(2)在程序运行期间,当执行某些指令时,CPU自动修改 CS和IP,使它们指向新的代码段。


过程定义伪指令(PROC/ENDP)

过程定义伪指令格式如下:
过程名 PROC [NEAR/FAR]
...
RET
...
过程名ENDP

  • 过程名是子程序的名称,它被用作过程调用指令CALL的目的操作数。

当前位置计数器$与定位伪指令ORG(Origin)

  • 定位伪指令ORG ——用来改变位置计数器的值。
  • 格式:ORG 数值表达式
  • 作用:将数值表达式的值赋给当前位置计数器$。ORG语 句为其后的数据或指令设置起始偏移量。
  • 表达式的值必须为正值。表达式中也可以包含有当前 位置计数器的现行值$。

标题伪指令TITLE

  • 语句格式:TITLE 标题名
  • 作用:给所在程序指定一个标题。以便在列表文件的每一页 的第一行都显示这个标题。其中标题是用户任意选用的字符 串,字符个数不能超过60。

从程序返回操作系统的方法

一、使用程序段前缀PSP (Program Segment Prefix)实现返回

1.将用户程序编制成一个过程,类型为FAR;
2.将PSP的起始逻辑地址压栈,即将INT 20H指令的地址压栈;
3.在用户程序结尾处,使用一条RET指令。执行该指令将使 保存在堆栈中的PSP的起始地址弹出到CS和IP中。
程序结构:

DATA SEGMENT
…
DATA ENDS
STACK1 SEGMENT STACK
…
STACK1 ENDS  CODE SEGMENT  BEGIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK1  PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA  MOV DS,AX
…
RET  BEGIN ENDP  CODE ENDS
END BEGIN

二、使用DOS系统功能调用实现返回

执行DOS功能调用4CH,也可以控制用户程序结束, 并返回DOS操作系统。
在程序结束时,使用两条指令:
MOV AH, 4CH INT 21H
代码段的结构为:

CODE SEGMENT
ASSUME CS:CODE	
BEGIN:MOV AX, DATA
MOV DS, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN


学习体会

汇编语言既是最低级的语言也是最底层的,与我们计算机内部的结构联系十分密切,而且在《汇编语言程序设计》这门课前四章的学习中也深刻的了解到了这一点。比如说寄存器、中断、还要各种寻址方式以及进栈出栈,好多的都是和计算机硬件有关。前面几章都是对计算机内部结构和一些常用的指令以及寻址方式的讲解。

但只通过几天浅显的学习汇编语言,感觉对于所学的知识点掌握程度并不是很良好,总有一种抓不住重点的感觉。希望在接下来的学习中能学以致用。