第三章 汇编语言 (8学时 )
第二节 数据表示
第一节 基本概念
?知 识 概 述 ?
第三 节 例题及操作
第四节 汇编语言的基本元素
第五节 说明性语句
第六节 微处理器的基本指令集
第七节 COM文件的编程
第八节 宏
第九节 算术协处理器
退 出
第十节 CPU扩展指令集
第十一节 Win32汇编语言的编程
第一节 基本概念( 4学时)
3.1.1 汇编语言的由来
退 出
汇编语言:汇编语言的语句和其语法规则。
一、机器指令
机器指令:它是计算机能识别的一组二进制代
码,用于指出计算机所要进行的操作以及操作对象,
是在设计 CPU时,就已确定的编码。例如:
1,把数,16‖送到寄存器 AL中,用下列机器指
令实现:
10110000 00010000
操作码 操作数
3.1.1
2,把数,4‖与寄存器 AL的内容相加,结果仍放在 AL中,
用下列机器指令实现:
00000100 00000100
操作码 操作数
3,把寄存器 AL的内容送到地址为 6的单元中,用下列机器
指令实现:
10100010 00000110 00000000
操作码 操作数地址
不同的机器操作,由不同的代码指令实现。一个计算
机能够执行的所有代码指令的集合,就是该计算机的指令
系统。
退 出
3.1.1
二、机器语言与机器语言程序
1,机器语言:把指令系统及书写代码程序的语法规则
称为机器语言。
2,机器语言程序:用机器语言编写的程序称为机器语
言程序。
三、汇编语言
由于机器指令难于使用,人们采用符号代替二进制代码,
于是产生了符号化的汇编语句。例如:
机器指令 汇编语句
10110000 00010000 MOV AL,16
00000100 00000100 ADD AL,4
10100010 00000110 00000000 MOV ADDR6,AL
退 出
3.1.1
四、高级语言
这里仍用相同的两个数的加法运算为例,用机器语言、
汇编语言、高级语言实现的语句如下:
机器指令 汇编语句 高级语言
10110000 00010000 MOV AL,16
00000100 00000100 ADD AL,4 ADDR6=16+4
10100010 00000110 00000000 MOV ADDR6,AL
1,与汇编语言相比,高级语言有两个主要优点:
使用方便。易读、易写、易调试,因而容易学习,编
程速度也快。
便于移植。程序很容易从一种计算机换到另一种计算
机上运行。
退 出
3.1.1
2,与高级语言相比,汇编语言的优点是:
效率高。其程序比相同功能的高级语言程序所占
的内存少,运行速度快。
能将计算机的全部功能提供给用户使用。这是因
为,汇编语言能最直接最充分地描述计算机语言,使
用汇编语言就是使用机器语言。
五、汇编语言的应用领域
要求执行效率高,反应快的领域,如操作系统内
核、工业控制、实时系统;
系统频繁使用的子程序或程序段;
与硬件资源密切相关的软件开发,如设备驱动程
序等;
受内存容量限制的应用领域,如小型控制仪器、
仪表。
退 出
3.1.2 汇编程序
汇编程序:它能把用汇编语言编写的源程序翻译成 CPU能
识别的机器指令序列。这里,称该翻译程序为
汇编程序。 图 3.1是一次翻译过程的示意图。
退 出
第二节 数据表示( 2学时)
3.2.1 十六进制数及 Intel惯例
退 出
一、十六进制数
十六进制数是逢十六进 1位,每一位有 16种状
态,用 0,1,2,?,9,A,B,C,D,E,F表
示。如果十六进制数是以字符开头,为了与字符串
区别,须在十六进制数的开头加数码‘ 0’。
3
.
2
.
1
二,Intel存数的惯例
数据在内存中的存放有两种不同的格式,Big-Endian
格式和 Little-Endian格式。
在 Big-Endian格式中,数据的存放原则是:高地址
存放低字节,低地址存放高字节。这种存储格式如 图 3.2
所示。
在 Little-Endia格式中,数据的存放原则是:低地址
存放低字节,高地址存放高字节。这种存储格式如 图 3.3
所示。
Intel芯片的是按 Little-Endia格式存储数据 。
退 出
3.2.2 定点微处理器处理的数据类型
对于 Intel系列的 80?86 CPU能够处理 4种类型的数据。
一、无符号二进制数
1,8位无符号二进制数
形式:数值
其数值范围,0~255( 28-1)。
2,16为无符号二进制数
形式:数值
其数值范围,0~65535。
3,32为无符号二进制数
形式:数值
退 出
3.2.2
二、带符号二进制数
带符号的二进制数,其左边的一位(最高位)为
符号位,,0” 表示正,,1” 表示负。带符号的二进
制数用补码来表示。
1,8位有符号二进制数
形式,S 数码
其数值范围,-128( -27) ~+127( +( 27-1))。
2,16位有符号二进制数
15 0
形式,S 数码
其数值范围,-32 768( -215) ~+32 767( +( 215-
1))。
退 出
3.2.2
3,32位有符号二进制数
31 0
形式,S 数码
其数值范围,-2147483648( -231) ~+2147483647( +( 231-
1)) 。
三、无符号十进制数 BCD码
无符号十进制数 BCD( Binary-Coded Decimal)
每位数用 4位二进制数表示。显然,4位二进制数中
只有 0~9有效。这种数称为 BCD码,它的存放形式有
两种。
退 出
3.2.2
1,无符号组合式 BCD码
7 0
形式:十位数 个位数
一个字节存放两位十进制数。字节的十进制数
范围,0~99。
例如,34的组合式 BCD码为:
7 0
0011 0100 书写为,34H
例如,754组合式 BCD码为:
7 0 7 0
0000 0111 0101 0100 书写为,754H
退 出
3.2.2
2,无符号分离式 BCD码
7 0
形式,uuuu 数码
一个字节存放一位十进制数。字节的十进制数
范围,0~9。其中 u表示任意。
例如,34的无符号分离式 BCD码形式为:
7 0 7 0
uuuu 0011 uuuu 0100
若 u位为,0”,书写为,0304H
退 出
3.2.2
四、字符数据
用单引号括起来的字符成为字符数据。每个字符占 1
个字节。在计算机中用该字符对应的 ASCII表示。
例如,字符数据 ?ABCD?在内存中用十六进制表示为
41424344H,可记成,?ABCD?=41424344H
又如字符数据 ?53?,用十六进制表示则为 3533H,可记
成,?53?=3533H
寄存器或内存中二进制数码按哪一种数据来理解,其
值可能是不同的。例如 表 3.2中有 4个字节的数据,分别按
5种数据类型来理解,其值就各不相同。
退 出
第三节 例题及操作
为了较生动地由浅入深地讲述语法,也为了使读者能
较快地上机实践,我们这里先介绍一个用汇编语言编写的
完整段源程序及其相应的简化段源程序,并简要说明汇编
语言程序的上机操作步骤。
退 出
3.3.1 例题简介
源程序由语句组成,汇编语句一般可分为三部分,其
一般形式为:
[名字 ] 指令操作符 [操作数 1[,操作数 2[,操作数 3]]][;注释 ]
例 3-1计算 Z=( X-Y+3),其中 X=10,Y=4。
汇编语言对大小写不敏感,但是为了区分保留字与标
识符,本例中把保留字用大写表示,标识符用非大写标识
符表示,以示区分。
退 出
3.3.1
一、名字与指令操作符
1,名字:其定义类似于高级语言中的标识符的概念,
由用户给出。
2,指令的操作符:表示指令的主要操作或功能,通常
分为伪操作符与操作符两大类。
1)伪操作符:由汇编程序执行的操作。
2)操作符:由 CPU执行的操作。
二、操作数部分
1,两操作数语句
形式,[标号,]操作符 目标操作数,源操作数
退 出
3.3.1
功能:目标操作数 ?(目标操作数)操作 (源操作数)
操作数可以是变量、寄存器、段名或数据。
2,单操作数语句
形式,[标号,]操作符 操作数
功能:对单个操作数进行操作符规定的操作。
这里的操作数同以上说明。
3,无操作数语句
形式,[标号,]操作符
功能:执行操作符规定的操作。
从例子可以看出,汇编语言源程序由分段组成。该程
序有 3个分段。第 1个分段是堆栈段,第二个分段是数据段,
第 3个分段式程序段 。
退 出
3.3.2 上机操作步骤
汇编语言的运行分下列 3个步骤:
步骤 1:编辑源程序
首先是进入编辑程序,如 EDIT.COM,记事本及写字板
等编辑软件,键入源程序,正确输入完成后,命名存盘,
其中,ASM是汇编程序规定的源文件的扩展名。
步骤 2:汇编源程序及连接目标程序
汇编语言源程序可适用下列简化命令进行源程序编
译,MASM FILENAME.ASM
如果系统显示出有语法错误,则应在进入编辑程序进
行修改。如果系统显示出下列信息:
?
WARNING SEVERE
ERRORS ERRORS
0 0
退 出
3.3.2
则表示源程序无语法错误,已完成汇编,并得到一个
目标文件 FILENAME.OBJ。这是可用下列命令进行连接:
LINK FILENAME.OBJ
如果有错误信息,则还需要进入编辑程序进行修改。
如果无错误,则产生 FILENAME.EXE文件。
步骤 3:运行,EXE文件
运行 FILENAME.EXE文件,程序输出结果为 9。如果程
序结果有误,则可进入 DEBUG或 CV调试系统中运行、调试。
退 出
第四节 汇编语言的基本元素( 2学时)
3.4.1 符号
退 出
源程序中的符号有两类:
一类是保留字(事先由汇编程序约定的,它
们不用定义与说明,也不能更改);
另一类是名字(由用户定义)。
一、保留字
1,寄存器名称的约定
2,操作符的约定
3,伪操作符的约定
3.4.1
二、名字
定义名字必须遵守下列规则:
名字只能由下列字符组成:
字母 A?Z
数字 0?9
符号 $ @?, _
数字不能作为名字第一个字符。
名字的长度可达 31个字符,超过部分的字符被系统忽
略。
符合上面规定的字符组合并且不与任何保留字相同的
字符串被认为是合法的名字,否则是非法的名字。常见的
名字有以下几种。
退 出
3.4.1
1,标号及其属性
标号:是一个冒号“:”引入的名字,它代表所定义
语句对应代码指令的开始地址。该地址形式为:
该代码段的段地址:偏移地址
标号有 3个属性:
1)标号的段值属性:标号的段值属性就是标号所在段的段
地址。标号的段值属性可写成如下形式:
SEG 标号
如 SEG START就是 START所在代码段的段地址。
退 出
3.4.1
2)标号的偏移属性:标号的偏移属性是指标号所处位置的
偏移地址。标号的偏移属性可写成如下形式:
OFFSET 标号
如 OFFSET START就是 START所在代码段的偏移地址。
3)标号的类型属性:标号有 FAR与 NEAR之分,这个特性称
为标号的类型属性,其形式为:
TYPE 标号
该属性系统也定义了一个类型值:
若为近标号,则( TYPE 标号) =-1
若为远标号,则( TYPE 标号) =-2
对某段来说,远标号表示该标号的定义不在本段。近
标号表示该标号的定义在本段。因此,标号的类型是相对
的。
退 出
3.4.1
标号的默认类型为 NEAR型,标号的类型是相对的,也
就是说,标号的类型是在指令引用它时才确定下来的。
2,变量及属性
变量是用数据伪操作符定义的名字。一般数据用下列
伪操作符定义:
DB— 每个数据为 1个字节。
DW— 每个数据为 1个字,即 2个字节。
DD— 每个数为 1个双字,即 4个字节。
DQ— 每个数为 8个字节。
DT— 每个数为 10个字节。
变量有两重含义,它一方面代表所表示的变量的值,
另一方面表示变量所占空间的首地址。该地址形式为:
所在段的段地址:所在段的偏移地址
退 出
3.4.1
变量有 5个属性:
1)变量的段属性
变量的段值属性是指变量定义所在段的段地址。变量
的段值属性可写成如下形式:
SEG 变量
2)变量的偏移属性
变量的偏移属性是指变量所处位置的偏移地址。变量
的偏移属性可写成如下形式:
OFFSET 变量
3)变量的类型属性
变量所表示的数据元素的长度(以字节为单位)为变
量的类型,其形式为:
TYPE 变量
因而,TYPE 变量”这个表达式的值是 1~10之间的数
字。
退 出
3.4.1
4)变量的长度属性
变量所指数据元素的个数为变量的长度属性,其形式
为:
LENGTH 变量
但是变量的元素个数只对单项的重复子句有意义,对
其它变量,LENGTH 变量 =1。
5)变量的容量属性
变量的容量属性是指变量所表示数据所占空间的字节
和,其形式为:
SIZE 变量
但是变量的容量属性也只对单项的重复子句有意义,
实际上,SIZE 变量的值也可用下式计算:
SIZE 变量 =( LENGTH 变量) ?( TYPE 变量)
退 出
3.4.1
3,段名
用伪操作符 SEGMENT定义的名字为段名。
段定义形式为:
段名 SEGMENT ?
?
段名 ENDS
段名是所定义段的符号化段地址。
退 出
3.4.1
4,过程名
用伪操作符 PROC定义的名字成为过程名。
过程的定义形式为:
过程名 PROC 类型
?
过程名 ENDS
过程名与标号类似,只是远、近过程名的类型是在过
程的定义时由“类型”参数决定,类型为,FAR” 时为远
过程,类型为,NEAR” 时为近过程。过程名的默认类型为
近过程。远过程名是过程所处位置首地址的符号化地址,
表示形式为:
段地址:偏移地址
近过程名则是过程所处位置首地址的偏移地址的符号
化偏移地址。
退 出
3.4.2 常数
数值常数
汇编语言中的常数 字符串常数
属性常数
当前地址数
一、数值常数
数值常数分为整数常数和实数常数。
1,整数常数
按其基数的不同,可以有二进制数 B、八进制数 Q、十
进制数 D、十六进制数 H等几种不同的表示形式,汇编语言
中采用不同的后缀加以区分。
当一个数值数据后面没有后缀时,将默认为十进制数。
退 出
3.4.2
2,实数常数
实数常数在机内的表示有十进制和十六进制两种。
1)十进制实数
它是一个带小数点的十进制数或带方幂的十进制数。
例 5.89,2.0,5.1E6,其中 5.1E6=5.1?106
2)十六进制实数
用 R替换 H作标记的十六进制实数,为实数在机内的表
示形式。它与十六进制数一样必须以数字作首字符。例如:
42C88000R是 IEEE格式编码的短实数 100.25在机内的表示。
0C1C90000R是 IEEE格式编码的短实数 -25.125在机内的表
示。
退 出
3.4.2
二、字符串常数
字符串常数是由单引号,?”括起来的一串字符。例如:
?Assmbly Language and Programming?
?23?
退 出
3.4.2
三、属性常数
以上讲的名字的属性,都可以作为常数使用。
1,段值
形式,SEG 标号或变量
2,偏移值
形式,OFFSET 标号或变量
3,变量类型值
形式,TYPE 变量
4,变量长度值
形式,LENGTH 变量
5,字节总和值
形式,SIZE 变量
退 出
3.4.2
四、当前地址数
汇编语言允许把某些语句所处内存地址取出使用。
一种是 $代表当前位置的偏移地址。
一般有两种方式 另一种是 THIS指示当前位置的地址及
其 类型。
形式,[变量 ] THIS 类型。
类型为,BYTE” 时,表示所处位置是字节变量的地址。
类型为,WORD” 时,表示所处位置是字变量的地址。
类型为,DWORD” 时,表示所处位置是双字变量的地址。
类型为,NEAR” 时,表示所处位置是本段标号的地址。
类型为,FAR” 时,表示所处位置是远标号地址。
退 出
3.4.3 表达式
表达式:由数据和运算符组成,汇编语句在表达式中
允许使用的数据有数字和标识符,并且限制表达式在整数
范围内使用。
汇编语言表达式运算法则同高级语言一样,即:
首先计算高级优先级的运算符。
相同优先级的运算符按从左到右的顺序计算。
括号可以改变运算符的优先级,即应最先考虑括号中
的运算符。
汇编语言的表达式不能构成单独语句。
算术运算符
运算符 逻辑运算符
关系运算符。
退 出
3.4.3
一、算术运算符及移位运算符
1,*,/,MOD,SHL,SHR
形式:数据 1 * 数据 2或数据 1 / 数据 2
* 与 /是一般乘除法。
形式:数据 1 MOD 数据 2
其值为数据 1/数据 2的余数。
形式:数据 1 SHL 数据 2
其值为数据 1左移数据 2位的值。
形式:数据 1 SHR 数据 2
其值为数据 1右移数据 2位的值。
退 出
3.4.3
2,+,-
+,-为一般的加、减法。
算术运算符应用于数字数据,结果也是数字。
当算术运算符应用于存储器即地址数据时,其规
则就更加严格:只有当结果有明确的、有意义的物理
解释时,这些运算才有效的。
二、关系运算符
形式:数据 1 EQ 数据 2
判断数据 1 等于 数据 2?
形式:数据 1 NE 数据 2
判断数据 1 不等于 数据 2?
退 出
3.4.3
形式:数据 1 LT 数据 2
判断数据 1 小于 数据 2?
形式:数据 1 LE 数据 2
判断数据 1 小于等于 数据 2?
形式:数据 1 GT 数据 2
判断数据 1 大于 数据 2?
形式:数据 1 GE 数据 2
判断数据 1 大于等于 数据 2?
关系运算符的两个数据,或者都是
数字的,或 者是同一段的存储器地址。
退 出
3.4.3
三、逻辑运算符
形式,NOT 数据
表示把数据取反。
形式:数据 1 AND 数据 2
其值为数据 1与数据 2进行逻辑与运算。
形式:数据 1 OR 数据 2
其值为数据 1与数据 2进行逻辑或运算。
形式:数据 1 XOR 数据 2
其值为数据 1与数据 2进行逻辑异或运算。
逻辑运算符的数据只能是数字的。
退 出
第五节 说明性语句( 2学时)
退 出
汇编语言的语句有两种基本类型,即执行性语句与
说明性语句。
执行性语句也就是 CPU指令系统中的指令。
说明性语句由伪操作符定义,仅仅在汇编过程中告
诉汇编程序应如何汇编。常用说明性语句共有 5种类型。
内存变量定义语句:语句用于描述数据和给数据赋
值。包括简单内存变量和复合内存变量定义语句。
3.5
调整偏移量语句:调整偏移量语句是在内存变
量定义时用来调整内存变量起始偏移量的。
符号定义语句:为常量或表达式定义一个符号
名的语句。
程序结构语句:程序结构语句用于说明源程序
的结构和目标程序的结构。这些将在 3.6.2.7节讲解。
条件汇编语句:条件汇编语句用于说明汇编某
部分语句时的条件,满足条件汇编,否则跳过这部
分不予汇编。详细内容见 3.8.2节。
退 出
3.5.1 内存变量定义语句
一、简单内存变量定义语句
1,字节变量定义语句
形式,[变量名 ] DB EXP[,EXP]?
EXP除字符串外每个数值占 1个字节。 EXP可以是
整数表达式、字符串以及“?”。“?”在数据说
明语句中表示不确定的值,即不赋初值。
退 出
3.5.1
例如:
bVarA DB 101B,7,?D?,0FH,-1
DB 2*56,?INPUT PLEASE$?,?
DB 100 DUP(0)
bVarB DB 1,2,3,4,5,6
bVarC DB ?1?,?2?,?3?,?4?,?5?,?6?
见 内存分配图
退 出
3.5.1
2,字变量定义语句
形式,[变量名 ] DW EXP[,EXP]?
它的数值为 EXP,每个数值占 2个字节。 EXP可以
是整数表达式、字符串以及“?”。注意,EXP若是
字符串最多只能为两个字符,不足两个字符采用右对
齐,左补 0。整数表达式可包括属性常数,若取偏移
值,可省略标记,OFFSET” 。
例如:
wVarA DW 011B,-
32678,65535,0FH,2,5+7ACH,?AB?
wVarB DW wVarA,DISP
wVarC DW ?1?,?2?,?3?,?4?,?5?,?6?
退 出
3.5.1
3,双字变量定义语句
形式,[变量名 ] DD EXP[,EXP]?
它的数值为 EXP,每个数值占 4个字节。 EXP可以
是整数表达式、字符串以及“?”。表达式可包括
属性常数,变量及标号在这里取段值与偏移值时不
用标记,双字中低地址字存放偏移值,高地址字存
放段值。字符串最多可写 4个字符。
例如:
dVarA DD
101B,2D89AH,5,5.0,3F800000R,20E30
dVarB DD dVarA,wVarA
退 出
3.5.1
4,三字变量定义语句
形式,[变量名 ] DF EXP[,EXP]?
它的数值为 EXP,每个数值占 6个字节。 EXP可以
是常数表达式、字符串以及“?”。字符串最多可写
6个字符。
例如:
fVarA DF 56DC2301AB00H,-1
5,四字变量定义语句
形式,[变量名 ] DQ EXP[,EXP]?
它的数值为 EXP,每个数值占 8个字节。 EXP可以
是常数表达式、字符串以及“?”。字符串最多可写
8个字符。
退 出
3.5.1
例如:
qVarA DQ 1,-1,1.2,1.0,?A ?
6,十字节变量定义语句
形式,[变量名 ] DT EXP[,EXP]?
它的数值为 EXP,每个数值占 10个字节。 EXP可以
是常数表达式、字符串以及“?”。字符串最多可写
10个字符。实数在内存中一律为暂时实数形式。注意,
在该语句中十进制整数的标记,D” 通常不可省略。
省略后表示 BCD码数。
例如:
tVarA DT 1.0,567834,567834D,3FFF5600000000000000R
退 出
3.5.1
二、复合内存变量定义语句
1,重复子句
形式:重复次数 DUP(EXP[,EXP] ?)
其中重复次数取非零正整数,EXP可以是常数表
达式、字符串以及“?”。
例如:
bArray DB 100 DUP(?)
dArray DD 4 DUP(160),90 DUP(?A5?)
tArray DT 4.4,10 DUP(56)
退 出
3.5.1
2,结构类型
1)结构类型的定义
用 STRUC和 ENDS可以把一系列数据定义语句括起
来作为一种新的、用户定义的结构类型。其一般说明
格式如下:
结构名 STRUC
变量定义序列
?
?
结构名 ENDS
结构名代表整个结构类型,开始和结束两个结构
名必须一致。结构内被定义的变量为结构字段,变量
名即为字段名。
退 出
3.5.1
一个结构中允许含有任意多个字段,各字段的
类型和所占字节数也都可任意。如果字段有字段名,
则字段名必须唯一。每个字段可独立存取。
例如:
course STRUC
dNo DD 1
cName DB 'English'
wScore DW?
course ENDS
上例中,course是结构名,它含有三个字段:
dNo,cName和 wSCORE,这些字段的类型分别是 DD、
DB和 DW。结构 course的字段分布如 图 3.4所示。
退 出
3.5.1
2)结构类型变量的定义
它的说明形式与前面介绍的简单数据类型的变
量说明基本上一致。
形式,[变量名 ] 结构名 <[字段值表 ]>
字段值表是给字段赋初值,中间用逗号 ','分开,
其字段值的排列顺序及类型应与该结构说明时各字
段相一致;
如果结构变量中某字段用其说明时的缺省值,
那么,可用逗号来表示;如果所有字段都如此,则
可省去字段值表,但必须保留一对尖括号 "< >"。
退 出
3.5.1
例如:
courseEnglish course <>;使用缺省值
courseAssember course <2,’ Assember’,90>
courseMath course <,’Math’,78>;
使用缺省的学号
3)结构类型字段的引用
定义了结构类型的变量后,若要访问其结
构中的某个字段,则可采用如下形式:
结构变量名,字段名
退 出
3.5.1
下面二种方法都可以把结构变量 courseMath中
字段 wScore的内容赋给寄存器 AX,但如果在字段
wScore之前增加或减少了字段,那么,偏移量的引
用是需要改变,而字段名的引用是无需改变的。
( 1)用字段名引用
MOV AX,courseMath,wScore
( 2)用字段的偏移量引用
LEA BX,courseMath
MOV AX,[BX+11];其中 11是 wScore的偏移量
退 出
3.5.1
3,共用体类型
有时需要使几种不同类型的变量存放在同一段
内存单元中。例如,可把一个字变量、一个字节
变量、一个双字变量放在同一个地址开始的内存
单元中,如 图 3.5所示。这种使几个不同的变量共
占同一段内存的结构,称为“公用体”类型的结
构。
1)公用体类型的定义
共用体类型定义格式如下:
公用体名 UNION
? 变量定义序列
?
公用体名 ENDS
退 出
3.5.1
共用体类型中的各字段相互覆盖,即同样的存
储单元被多个不同的字段所对应,并且其每个字段
的偏移量都为 0。
共用体类型所占的字节数是其所有字段所占字
节数的最大值。
例如:
data UNION
wVar DW 9876H
bVar DB 09H
dVar DD 1234ABCDH
data ENDS
退 出
3.5.1
2)公用体类型变量的定义
形式,[变量名 ] 共用体名 <[字段值表 ]>
注意:共用体数据类型的变量只能用第一个字
段的数据类型来进行初始化。
例如:
dNum1 data <0F435h>
dNum2 data <54674357H>;初始化错误
3)公用体类型字段的引用
定义了供用体类型的变量后,就可根据需要,
以不同的字段名来存取该公用体类型中的数据。引
用其字段的具体形式如下:
公用体类型变量名,字段名
退 出
3.5.1
例如:
MOV AX,dNum1.wVar
MOV dNum1.bVar,BL
4,记录类型
汇编语言的记录类型与高级语言的记录类型不同,
它是为按二进制位存取数据提供方便的。
1)记录类型的定义
记录类型定义格式如下:
记录名 RECORD 字段名:宽度 [=EXP] [,字
段名:宽度 [=EXP],?]
退 出
3.5.1
其中记录名及字段名是用户定义的名字,宽度
取 1~16之间的整数,它表示字段所占的二进制的位
数,EXP是给相应字段赋初值,是个可选项。
一个记录最长为机器字长。信息一律按照字段
的先后顺序从信息区的高位向低位排列,右对齐,
左补 0。
例如:
recodeName RECORD x:7,y:4,z:5
则记录各字段的分配形式为,XXXX XXXY
YYYZ ZZZZ
recodeName1 RECORD a:2,b:3
则记录各字段的分配形式为,000AABBB
退 出
3.5.1
2)记录变量的定义
形式,[变量名 ] 记录名 <[字段值表 ]>
字段值表是给字段赋初值,中间用逗号 ','分开,
其字段值的排列顺序及大小应与该记录说明时各字
段相一致。
如果记录变量的某字段用其说明时的缺省值,
那么,可用逗号来表示;如果所有字段都如此,则
可省去字段值表,但必须保留一对尖括号 "<>"。
例如:
Name1 recordName <7,0,2>
退 出
3.5.1
3)记录的专用操作符
操作符 WIDTH和 MASK是用于记录类型变量的两个
属性操作符,犹如变量的 OFFSET和 SEG操作符的应用
一样。
( 1)操作符 WIDTH
操作符 WIDTH返回记录或其字段的二进制位数,
即其宽度。其一般书写格式如下:
WIDTH 记录名 或 WIDTH 记录字段名
假设有上面的记录 recordName定义,则有下列
属性结果:
WIDTH recordName=16
WIDTH X=7
WIDTH Y=4
WIDTH Z=5
退 出
3.5.1
( 2)操作符 MASK
操作符 MASK返回一个 8位或 16位二进制数。在
该二进制数中,被指定记录或字段的对应位的值为 1,
否则,其值为 0。其一般书写格式如下:
MASK 记录名 或 MASK 记录字段名
假设有上面的记录 recordName定义,则有下列
属性结果:
MASK X=0FE00H
MASK Y=01E0H
MASK Z=001FH
退 出
3.5.1
4)记录字段的引用
其书写格式如下:
记录字段名
字段名在使用中代表 1个数值,此数值是把该字
段右移到信息区最右端的移位次数。
假设有上面的记录 recordName定义,则有下列
属性结果:
x=9
y=5
z=0
退 出
3.5.2 调整偏移量定义语句
常用的调整偏移量伪指令有,EVEN,ALIGN和 ORG,
它们的主要目的是:为了更有效地读取内存单元的内
容。
一、偶对齐定义语句
形式, EVEN
功能:告诉汇编程序,本伪指令下面的内存变量
从下一个偶地址单元开始分配。
退 出
3.5.2
二、对齐定义语句
形式,ALIGN EXP
其中,EXP必须是 2的幂,如 2,4,8和 16等。
功能:告诉汇编程序,本伪指令下面的内存变
量必须从下一个能被 EXP整除的地址开始分配。
例如:
bVar1 DB 34H bVar1 DB 34H
EVEN 等价 ALIGN 2
wVar2 DW 8795H wVar2 DW 8795H
退 出
3.5.2
三、调整偏移量语句
形式,ORG EXP
其中,EXP的取值范围 0~65535。
功能:告诉汇编程序,本语句下面的内存变量
从该,EXP‖所指定的偏移地址开始分配。
例如,.COM文件的程序段中,程序代码必须从
0100H偏移地址开始存放,所以程序的第一句需用
ORG语句定义:
ORG 0100H
MOV AX,data
MOV DS,AX
退 出
3.5.3符号定义语句
MASM中有三种等价语句:赋值等价语句,数值等
价语句及串等价语句。
一、赋值等价语句
形式,名字 =EXP
其中,EXP可以是一个整数、常数表达式,地址
表达式,一个或两个字符。
功能:汇编时该名字用表达式的值取代,类似与
高级语言的符号数。允许重新定义。
例如:
lab=la-lb
price=30
?
price=40
退 出
3.5.3
二、数值等价语句
形式,名字 EQU EXP
功能:该语句与赋值等价语句功能一样,
唯一的区别是:用 EQU定义的名字不允许再定
义。
例如:
lab EQU la-lb
price EQU 30
?
price EQU 40;错误的定义
退 出
3.5.3
三、串等价语句
形式,名字 EQU <字符串 >
功能:汇编时该名字用其字符串取代。
例如:
bVar DB 12H,56H
wPt EQU <WORD PTR>
?
LEA BX,bVar
INC wPt[BX]
退 出
第六节 微处理器的基本指令集
( 20学时)
指令系统确定了 CPU所能完成的功能,是汇编语
言进行程序设计的最基本部分。前面曾讲解过如下
汇编语句:
[标号,/变量 ] 指令操作符 [操作数 1[,操作数 2[,操作数
3]]] [;注释 ]
操作数:操作数是指令或程序的主要处理对象。
退 出
3.6
机器中参加操作的数据存放位置有以下三种:
参加操作的数据就包含在指令中。
参加操作的数据在 CPU的某个寄存器中。
参加操作的数据在内存中,这时指令中的操作
数包含着寻找参加操作的数据所在地址的信息。
寻址方式:寻址方式就是寻找参加操作的数据
的偏移地址的方式。
指令中如何表达操作数就是正确运用汇编指令
的一个重要因素。
退 出
3.6.1寻址方式
一、立即寻址方式
这种寻址方式,就是上面所提到的第一种情况,
参加操作的数据就包含在指令代码中。通常操作数写
成,Im‖,表示立即寻址方式,,Im‖可以是汇编语言
的常数。
例如:
MOV AL,06H ;功能,AL?06H 指令代码,B0 06
MOV BX,100 ;功能,BX?0064H 指令代码,BB 6400
可以看出,指令中的源操作数部分的 06H,100就
包含在指令代码中,所以就是立即寻址方式,06H,
100就是立即数 Im。
退 出
3.6.1
二、寄存器寻址方式
这种寻址方式,就是上面所提到的第二种情况,参
加操作的数据在 CPU的某个寄存器中。通常操作数写成
,R”,表示寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
8位寄存器,AH,AL,BH,BL,CH,CL,DH和 DL,
通常写成,R8” ;
16位寄存器,AX,BX,CX,DX,SI,DI,SP和 BP,
通常写成,R16”,用,R” 代表 8位与 16位寄存器。
段寄存器,CS,SS,DS和 ES,通常写成,SegR” ;
退 出
3.6.1
例如:
MOV AL,06H ;指令中的目标操作数 AL就
是寄存器寻址方式
MOV DS,AX ;指令中的两个操作数 DS和
AX都是寄存器寻址方式
下面描述操作数的形式,均表示参加操作的数据
都在内存中,通常操作数写成,M”,表示内存的寻
址方式,那么寻找存储参加操作数据的内存单元有效
地址的方法有以下几种。
三、直接寻址
在指令中直接给出了参加操作数据的有效地址,
这种寻址方式为直接寻址。
退 出
3.6.1
例如:
MOV AX,[2000H];功能,AX?( DS:2000H)指令代码,A1 0020
MOV [2000H],AX;功能,DS:2000H?( AX)指令代码,A3 0020
可以看出,有效地址 2000H在指令代码中直接给出,
所以就是直接寻址。而在汇编语言源程序中,由于汇
编程序不支持数字化的直接地址,所以直接地址用内
存变量来表示,所以上例可写成:
退 出
3.6.1
ORG 2000H
wData DW 1234H
?
MOV AX,wData ;功能,AX?
( DS:2000H) 指令代码,A1 0020
MOV wData,AX ;功能:
DS:2000H?( AX) 指令代码,A3 0020
退 出
3.6.1
四、寄存器间接寻址
参加操作数据的有效地址用 SI,DI,BX和 BP这 4
个寄存器之一来指定,称这种寻址方式为寄存器间接
寻址方式。在不指定段的情况下,有下列规定:
若有效地址用 SI,DI和 BX之一来指定,则其默认
的段寄存器为 DS;
若有效地址用 BP来指定,则其默认的段寄存器为
SS。
例如:
MOV AL,[SI]
该指令是将 DS段中的偏移量为 SI的内存单元内容
传给 AL,如 图 3.6所示。
MOV AL,[BP]
该指令是将 SS段中的偏移量为 BP的内存单元内容
传给 AL,如 图 3.7所示。
退 出
3.6.1
五、相对寄存器寻址方式
参加操作数据的有效地址是由 SI,DI,BX和 BP
这 4个寄存器之一的内容和指令中的 8位或 16位偏移
量之和,段寄存器的默认情况同寄存器间接寻址。
在程序中,8位或 16位偏移量通常用内存变量来表示。
例如:
MOV AH,count[SI];
该指令的功能是将 DS段中的偏移量为 SI+count
的内存单元内容传给 AH,其执行过程如 图 3.8所示。
退 出
3.6.1
六、基址加变址寻址方式
参加操作数据的有效地址是一个基址寄存器
( BX,BP)和一个变址寄存器( SI,DI)的内容之和。
在不指定段的情况下,规定:如果有效地址中含有 BP,
则默认的段寄存器为 SS;否则,默认的段寄存器为 DS。
例如:
MOV AX,[BP][SI];
该指令的功能是将 SS段中的偏移量为( BP+SI)
的内存单元内容传给 AL,( BP+SI+1)的内存段元的
内容传给 AH,其执行过程如 图 3.9所示。
退 出
3.6.1
七、相对基址加变址寻址方式
参加操作数据的有效地址是一个基址寄存器( BX
或 BP)的值、一个变址寄存器( SI或 DI)的值和指令
中的 8位或 16位偏移量 3项之和。
例如:
MOV BX,mask[BX][SI]
该指令的功能是将 DS段中的偏移量为
( BX+SI+mask)的内存单元内容传给 BL,
( BP+SI+mask+1)的内存单元的内容传给 BH,其执行
过程如 图 3.10所示。
退 出
3.6.2 指令系统
指令系统是 CPU指令的集合,CPU除了具有运算
功能的指令外,还有一些实现其它功能的指令。通
常,把指令按其功能分成以下几类:
数据传送指令
算术运算指令
逻辑运算指令
串指令
转移指令
处理器控制指令
退 出
3.6.2
一、数据传送指令( 2学时)
1,MOV— 传送指令
形式,MOV 目标操作数,源操作数
功能:目标操作数 ?(源操作数)
该指令有如下 9种形式:
MOV R,R ;通用寄存器间传送
MOV R,Imm ;立即数送通用寄存器
MOV M,Imm ;立即数送内存单元
MOV M,R ;通用寄存器送内存单元
MOV R,M ;内存数送通用寄存器
MOV SegR,R;通用寄存器送段寄存器( CS除外)
退 出
3.6.2
MOV R,SegR;段寄存器送通用寄存器
MOV SegR,M;内存数送段寄存器( CS除外)
MOV M,SegR;段寄存器送内存单元
使用 MOV指令应注意:
源操作数和目的操作数不能同时为内存数,即
MOV M,M的指令形式是非法的;
两操作数的类型属性要一致,例如,MOV AX,BL
是非法指令;
操作数不能出现二义性,即至少一个操作数的类
型要明确,例如,MOV [BX],1000H是非法指令。更
要特别注意的是,立即数的是没有类型。
退 出
3.6.2
2,XCHG— 数据交换指令
形式,XCHG 目标操作数,源操作数
功能:目标操作数 ?(源操作数)
源操作数 ?(目标操作数)
该指令有如下 3种形式:
XCHG R,R ; R?R
XCHG R,M ; R?M
XCHG M,R ; M?R
退 出
3.6.2
3,地址传送类指令
微处理器有三条指令专门传送地址,它们的目
标操作数均是 16位的通用寄存器,源操作数都是内
存数。
1) LEA— 传送偏移地址指令
形式,LEA 目标操作数,源操作数
功能:目标操作数 ?源操作数的偏移地址
该指令只有如下 1种形式:
LEA R16,M ; R16?OFFSET M
假设,BUFF是内存变量名,例如:
LEA SI,BUFF
退 出
3.6.2
MOV SI,OFFSET BUFF
MOV SI,BUFF ;
2) LDS— 传送数据段地址指令
形式,LDS 目标操作数,源操作数
功能:目标操作数 ?(源操作数),DS?(源操作数
+2)
该指令只有如下 1种形式:
LDS R16,M; R16?( M),DS?( M+2)
例如:
LDS SI,[BX] ; SI?( DS,[BX])、( DS:
[BX+1]),DS?( DS,[BX+2])、;( DS,[BX+3])
退 出
3.6.2
3) LES— 传送附加段地址指令
形式,LES 目标操作数,源操作数
功能:目标操作数 ?(源操作数),ES?(源操作数
+2)
该指令只有如下 1种形式:
LES R16,M ; R16?( M),DS?( M+2)
例如:
LES SI,[BX] ; SI?( DS,[BX])、( DS,[BX+1])
ES?( DS,[BX+2])、;( DS,[BX+3])
例如,有一数据段定义如下:
mydata SEGMENT
ORG 1000H
退 出
3.6.2
dPt1 DD 15780100H
dPt2 DD 20001000H
wEa DW 4765H
mydata ENDS
有如下语句:
LEA SI,dPt1; SI?1000H
LEA BP,dPt2; BP?1004H
LDS DI,dPt1; DI?0100H,DS?1578H
LES BX,dPt2; BX?1000H,ES?2000H
LDS DI,wEa;非法指令
退 出
3.6.2
4,XLAT— 查表转换指令
形式,XLAT
功能,AL?( [BX+AL])
该指令的操作数都是隐含的,所执行的操作是将 BX为基地址,
AL为位移量的字节存储单元中的数送 AL。
例 3-2 例如数字 0~7对应的格雷码为:
序号 格雷码 十六进制值
0 000 00H
1 001 01H
2 011 03H
3 010 02H
4 110 06H
5 111 07H
6 101 05H
7 100 04H
退 出
3.6.2
要求从键盘输入一位 0~7的十进制数码,把它变成
格雷码再输出到显示器上。
分析, 因为十进制数码与格雷码之间没有函数关系,
所以就必须用查表指令来实现转换,不过须在数据段首
先建立格雷码表。
退 出
3.6.2
5,PUSH/POP— 堆栈操作指令
堆栈是以“后进先出”的规则存取信息的一种存
储机构。该存储区的存取地址由一个专门的地址寄存
器( SP)来管理。在信息的存与取的过程中,栈顶是
不断移动的,而栈底是固定不变的。对堆栈的操作主
要有两大类:进栈和出栈。
1)进栈
形式,PUSH 操作数 16
功能:系统自动完成两部操作,SP?SP-2,SP?操作
数 16
该指令有如下 3种形式:
PUSH R16 ; SP?SP-2,SP?R16
PUSH SegR ; SP?SP-2,SP?SegR
PUSH M16 ; SP?SP-2,SP?M16
退 出
3.6.2
2)出栈
形式,POP 操作数 16
功能:系统自动完成两部操作:操作数 16? SP,
SP?SP-2
该指令有如下 3种形式:
POP R16 ; R16? (SP),SP?SP-2
POP SegR ; SegR?(SP),SP?SP-2,( CS
除外)
POP M16 ; M16?(SP),SP?SP-2
退 出
3.6.2
例 3-3在例 3-2中显示界面不是很好,因为从键盘输入
的数码和格雷码混在一起,为了有所区分,希望显示
格式为:
键盘输入的数码 — 对应的格雷码
分析, 为了达到所要求的显示格式,我们只需在
例 3-2中显示格雷码前加显,—, 。但是,加显,—,
的系统程序的调用改变了 AL寄存器值,为了保护 AL中
的值,通常做法,都是将其压入堆栈,显示,—, 后,
在将其从堆栈中取出传给 AL。
退 出
3.6.2
现在我们来分析该程序的堆栈定义及操作。该程序
中的语句
.STACK 200H
就是对堆栈的定义,即就是在内存中划分出 200H字
节作为堆栈区,其地址为 SS:0000H~SS:01FFH,那么堆
栈指针 SP的初值为 0200H,如 图 3.11所示。程序中的堆
栈操作语句有:
PUSH AX ; SP?01FEH,SS:01FE? (AL),SS:01FF?
(AH),堆栈变化如 图 3.12所示
?
POP AX ; AL?(SS:01FE),AH?(SS:01FFH),
SP?0200H,堆栈变化如 图 3.13所示
退 出
3.6.2
二、算术运算指令( 4学时)
算术运算类指令对标志寄存器的均有影响,必须
特别注意。算术运算语句共有以下 5种类型:
二进制无符号数的算术运算语句
二进制无符号数的算术运算语句
无符号压缩 BCD码加减运算语句
无符号分离 BCD码算术运算语句
多字节运算语句
1,二进制无符号数的算术运算语句
退 出
3.6.2
1) ADD— 加法指令
形式,ADD 目标操作数,源操作数
功能:目标操作数 ?(目标操作数) +(源操作数)
该指令有如下 5种形式:
ADD R,R ;通用寄存器之间相加
ADD R,Imm ;通用寄存器与立即数之间相加
ADD M,Imm ;内存数与立即数相加
ADD M,R ;通用寄存器与内存数之间相加
ADD R,M ;内存数与通用寄存器之间相加
例如,设( AX) =4,( BX) =200H,( DX) =6,
( DI) =500H并( DS,502) =2
ADD AX,BX ;语句执行后( AX) =204
ADD DX,2[DI] ;语句执行后( DX) =8
退 出
3.6.2
2) SUB— 减法指令
形式,SUB 目标操作数,源操作数
功能:目标操作数 ?(目标操作数) ?(源操作数)
该指令有如下 5种形式:
SUB R,R ;通用寄存器之间相减
SUB R,Imm ;通用寄存器与立即数之间相减
SUB M,Imm ;内存数与立即数相减
SUB M,R ;通用寄存器与内存数之间相减
SUB R,M ;内存数与通用寄存器之间相减
例如,设( CX) =10,( DX) =2,( BX) =5,OFFSET
SW=100,( DS:105) =3
SUB CX,DX ;语句执行后( CX) =8
SUB CH,DL ;语句执行后( CH) =-2
SUB DX,SW[BX] ;执行语句后( DX) =-1
退 出
3.6.2
3) MUL— 乘法指令
形式,MUL 操作数
功能:当操作数为字节数据时,AX?(操作数) ?(AL)
当操作数为字数据时,DX-AX?(操作数) ? (AX)
该指令有如下 2种形式:
MUL R ; 8位寄存器,AX?(R)?(AL); 16位寄存器:
DX-AX?(R)?(AX)
MUL M ;字节类型,AX?(M)?(AL);字类型:
DX- AX?(M)?(AX)
对于单操作数的指令,要特别注意操作数的类型要明确。
例如,下面的指令都是非法指令
MUL [SI]
MUL 2[DI]
MUL [BX][SI]
退 出
3.6.2
4) DIV— 除法指令
形式,DIV OPRD
功能:当操作数为字节数据时,AL? (AX )?(操作
数),AH? (AX ) MOD(操作数)
当操作数为字数据时,AX ? (DX-AX)/(操作数),
DX ? (DX-AX) MOD (操作数)
该指令有如下 2种形式:
DIV R ; 8位寄存器,AL? (AX)/(R),AH?(AX)MOD; 16位寄存器,AX?(DX-AX)/(R),DX?(DX-
AX)MOD(R)
DIV M ;字节类型,AL?(AX)/(M),AH?(AX)MOD(M);字类型,AX?(DX-AX)/(M),DX? DX-
AX)MOD(M)
除法有溢出问题,凡字节运算商超过 255或字运算商
超过 65535时均为溢出,0做除数也为溢出。除法溢出时,
将立即产生 0号中断并转中断处理,程序停止执行。
退 出
3.6.2
5) CMP— 比较指令
形式,CMP 目标操作数,源操作数
功能:(目标操作数) ?(源操作数)
该指令有如下 5种形式:
CMP R,R ;通用寄存器之间比较
CMP R,Imm ;通用寄存器与立即数之间比较
CMP M,Imm ;内存数与立即数相减
CMP M,R ;通用寄存器与内存数之间比较
CMP R,M ;内存数与通用寄存器之间比较
从以上可以看出,比较指令与减法指令不同的是所产
生的两数之差并不取代目标操作数,指令执行后的结果仅
仅体现在改变了标志寄存器的内容,为后面的具有判别功
能的指令提供条件。
退 出
3.6.2
6) INC— 加 1指令
形式,INC 操作数
功能:操作数 ? (操作数) ?1
该指令有如下 2种形式:
INC R ; R?(R)?1
INC M ; M?(M)?1
7) DEC—— 减 1指令
形式,DEC 操作数
功能:操作数 ?(操作数) ?1
该指令有如下 2种形式:
DEC R ; R?(R)?1
DEC M ; M?(M)?1
退 出
3.6.2
8) NEG— 求负指令
形式,NEG 操作数
功能:操作数 ? 0?(操作数)
该指令有如下 2种形式:
NEG R ; R?0?(R)
NEG M ; M?0?(M)
例如,8位 [-3]补码 =11111101B=0FDH,执行如下指令:
MOV AL,-3 ; AL?0FDH
NEG AL ; AL?0?0FDH=03H,03H就是 -3的负数
MOV AL,3 ; AL?03H
NEG AL ; AL?0?03H=0FDH,0FDH就是 3的负数
退 出
3.6.2
2,二进制无符号数的算术运算语句
1) ADD—加法指令与 SUB—减法指令
对于二进制符号数的加减法运算,由于系统采用补码
表示法,故与无符号数的加减法指令是一样的。
2) IMUL—符号数乘法指令
形式,IMUL 操作数
功能:当操作数为字节数据时,AX?(操作数) ?(AL)
当操作数为字数据时,DX-AX?(操作数) ? (AX)
该指令有如下 2种形式:
IMUL R ; 8位寄存器,AX?(R)?(AL); 16位寄存器:; DX-AX?(R)?(AX)
IMUL M ;字节类型,AX?(M)?(AL);字类型,DX-AX?(M)?(AX)
退 出
3.6.2
例如,有如下语句:
wNum DW 8004H ; (wNum)=8004H
MOV AX,5 ; AX?5
MUL wNum ; DX?0002H,
AX?8014H
IMUL wNum ; DX?0FFFDH,
AX?8064H
退 出
3.6.2
3) IDIV— 符号数除法指令
形式,IDIV OPRD
功能:当操作数为字节数据时,AL? (AX )?(操作数),
AH? (AX ) MOD OPRD
当操作数为字数据时,AX ? (DX-AX)/(操作数),
DX ? (DX-AX) MOD OPRD
该指令有如下 2种形式:
IDIV R ; 8位寄存器,AL?(AX)/(R),AH?(AX)MOD(R); 16位寄存器,AX?(DX-AX)/(R),DX?(
DX-AX)MOD OPRD,
IDIV M ;字节类型,AL?(AX)/(M),AH?(AX)MOD(M);字类型,AX?(DX-AX)/(M),DX?(
DX-AX)MOD(M)
退 出
3.6.2
如果被除数不是除数的两倍长度,则要把被除数低一
半的符号位填充到高一半中,变成除数的双倍长度。其相
应的支持指令为:
形式,CBW
功能:将 AL中的符号扩展到 AH中,即将一个字节的带符
号数扩展成一个字。
形式,CWD
功能:将 AX中的符号扩展到 DX中,即将一个字的带符号
数扩展成双字。
退 出
3.6.2
例如,有如下语句:
SW DB -9
DATA DB 2
?
MOV AL,SW
CBW
IDIV DATA ;( AL) =-4
退 出
3.6.2
3.无符号组合式 BCD加减法运算指令
1) DAA—加法调整指令
形式,DAA
功能:如果 AL寄存器中低 4位大于 9或辅助进位( AF) =1,
则( AL) =( AL) +6并且( AF=1);如果( AL)
?0A0H或( CF) =1,则( AL) =( AL) +60H并且( CF)
=1。
2) DAS—减法调整指令
形式,DAS
功能:如果 AL寄存器中低 4位大于 9或辅助借位( AF) =1,
则( AL) =( AL) -6并且( AF) =1;如果( AL)
?0A0H或( CF) =1,则( AL) =( AL) -60H并且( CF)
=1。
退 出
3.6.2
进行组合式 BCD加法或加法运算实现用 ADD语
句或 SUB语句,使运算结果在 AL中,然后再用 DAA
或 DAS调整语句即可得组合式 BCD加减法的正确结
果。
例如,有如下语句:
MOV AL,43H ;( AL) =43H
MOV BL,29H ;( BL) =29H
ADD AL,BL ;( AL) =6CH
DAA ;( AL) =72H
MOV AL,43H ;( AL) =43H
MOV BL,29H ;( BL) =29H
SUB AL,BL ;( AL) =1AH
DAS ;( AL) =14H
退 出
3.6.2
4,无符号分离式 BCD运算指令
无符号分离式 BCD可进行四则运算,因而相
应有四种调整指令,它们都是对字节运算进行调
整。
1) AAA—ASCII加法调整指令
形式,AAA
功能:如果 AL的低 4位大于 9或( AF) =1
则:( AL) =( AL) +6
( AH) =( AH) +1
( AF) =( CF) =1
AL高 4位清零;
否则:( AF) =( CF) =0
AL高 4位清零;
退 出
3.6.2
例如,有如下语句:
MOV AH,0
MOV AL,?7? ;( AL) =37H
MOV BL,?4? ;( BL) =34H
ADD AL,BL ;( AL) =6BH
AAA ;( AX) =0101H
退 出
3.6.2
2) AAS—ASCII减法调整指令
形式,AAS
功能:如果 AL的低 4位大于 9或( AF) =1
则:( AL) =( AL) -6
( AH) =( AH) -1
( AF) =( CF) =1
AL高 4位清零;
否则:( AF) =( CF) =0
AL高 4位清零;
退 出
3.6.2
3) AAM—ASCII乘法调整指令
形式,AAM
功能:被调整的乘积在 AX中,其调整规则如下:
AH?( AL) /10,AL?( AL) %10
例如,有如下语句:
MOV AL,?9? ;( AL) =39H
MOV BL,?8? ;( BL) =38H
SUB AL,30H ;( AL) =09H
SUB BL,30H ;( BL) =08H
MUL BL ;( AX) =0048H
AAM ;( AX) =0702H
退 出
3.6.2
4) AAD—ASCII码除法调整指令
形式,AAD
功能:除法运算前,先调整 AX内容,使:
( AL) =( AL) +( AH) ?10
( AH) =0
即把非压缩十进制数变成二进制数。
例 3-4编写程序实现输入任意两个 0~9之间的数字,并分
别进行加法与乘法运算后在屏幕上。
分析:由于输入与输出的数据均为 ASCII码,故用分
离式 BCD码较为方便。又由于程序很简单,故采用寄存
器 CX存放数据,不用数据段。
退 出
3.6.2
5,多字节数运算指令
1) ADC—带进位加法指令
形式,ADDC 目标操作数,源操作数
功能:目标操作数 ?(目标操作数) +(源操作数) +CF
该指令有如下 5种形式:
ADDC R,R ;通用寄存器之间相加,再加进位位
ADDC R,Imm ;通用寄存器与立即数之间相加,再加
进位位
ADDC M,Imm ;内存数与立即数相加,再加进位位
ADDC M,R ;通用寄存器与内存数之间相加,再加
进位位
ADDC R,M ;内存数与通用寄存器之间相加,再加
进位位
退 出
3.6.2
例如,求 3B07B2H+65C2H的程序片断如下:
bNum1 DB 0B2H,07,3BH
bNum2 DB 0C2H,65H
?
MOV AL,bNum1
ADD AL,bNum2
MOV AH,bNum1+1
ADC AH,bNum2+1
MOV DL,bNum1+2
ADC DL,0
请问最后一条指令,为什么加 0?
退 出
3.6.2
2) SBB— 带借位减法指令
形式,SBB 目标操作数,源操作数
功能:目标操作数 ?(目标操作数) ?(源操作数) ?CF
该指令有如下 5种形式:
SBB R,R ;通用寄存器之间相减,再减借位位
SBB R,Imm ;通用寄存器与立即数之间相减,再减借
位位
SBB M,Imm ;内存数与立即数相减,再减借位位
SBB M,R ;通用寄存器与内存数之间相减,再减借
位位
SBB R,M ;内存数与通用寄存器之间相减,再减借位位
实现多字节减法和实现多字节加法方法一样,那么实现多字节乘
法及除法的思想我们通过下面的程序来介绍。
退 出
3.6.2
例如,求 3B07B2H?C2H的程序片断如下:
bMul1 DB 0B2H,07,3BH
bMul2 DB 0C2H
bResult DB 4 DUP( 0)
?
MOV AL,bMul1
MUL bMul2
MOV bResult,AL
MOV bResult+1,AH
MOV AL,bMul1+1
MUL bMul2
ADD bResult+1,AL
ADC bResult+2,AH
退 出
3.6.2
MOV AL,bMul1+2
MUL bMul2
ADD bResult+2,AL
ADC bResult+3,AH
例如,求 3B07B2H?C2H的程序片断如下:
bDiv1 DB 0B2H,07,3BH
bDiv2 DB 0C2H
bResult DB 4 DUP( 0)
?
MOV AH,0
MOV AL,bDiv1+2
DIV bDiv2
MOV bResult,AL
退 出
3.6.2
MOV AL,bDiv1+1
DIV bDiv2
MOV bResult+1,AL
MOV AL,bDiv1
DIV bDiv2
MOV bResult+2,AL
MOV bResult+3,AH
退 出
3.6.2
三、逻辑运算指令( 1)
因为逻辑运算类指令是在 ALU中完成的,所以除 NOT
指令外,均对 PF,SF及 ZF有影响,CF=OF=0,AF不确
定。
1,逻辑运算类指令
1) NOT—求反指令
形式,NOT 操作数
功能:操作数 ?操作数的每一位取反
该指令有如下 2种形式:
NOT R ; R?把 R寄存的每个二进制位取反
NOT M ; M?把 M寄存的每个二进制位取反
例如,设( AL) =46H,有如下语句:
NOT AL ;语句执行后( AL) =0B9H
退 出
3.6.2
2) AND—逻辑与指令
形式,AND 目标操作数,源操作数
功能:目标操作数 ?(目标操作数)按位逻辑与(源
操作数)
变异功能:任何位与 0相与,其相应位为 0;任何位与
1相与,其相应位维持不变
该指令有如下 5种形式:
AND R,R ;通用寄存器之间按位相与
AND R,Imm ;通用寄存器与立即数之间按位相与
AND M,Imm ;内存数与立即数按位相与
AND M,R ;通用寄存器与内存数之间按位相与
AND R,M ;内存数与通用寄存器之间按位相与
退 出
3.6.2
例如,设( AL) =76H,要求把其第 0,1和 5位清为 0,
其指令为:
AND AL,11011100B;
其计算过程如下所示:
0 1 1 1 0 1 1 0
AND 1 1 0 1 1 1 0 0
0 1 0 1 0 1 0 0
退 出
3.6.2
3) OR—逻辑或指令
形式,OR 目标操作数,源操作数
功能:目标操作数 ?(目标操作数)按位逻辑或(源操作
数)
变异功能:任何位与 1相或,其相应位置 1;任何位与
0相或,其相应位维持不变。
该指令有如下 5种形式:
OR R,R ;通用寄存器之间按位相或
OR R,Imm ;通用寄存器与立即数之间按位相或
OR M,Imm ;内存数与立即数按位相或
OR M,R ;通用寄存器与内存数之间按位相或
OR R,M ;内存数与通用寄存器之间按位相或
退 出
3.6.2
例如,设( BL) =46H,要求把其 1,3,4、和
6位置为 1,其指令为:
OR BL,01011010B ;
其计算过程如下所示:
0 1 0 0 0 1 1 0
OR 0 1 0 1 1 0 1 0
0 1 0 1 1 1 1 0
退 出
3.6.2
4) XOR—逻辑异或指令
形式,XOR 目标操作数,源操作数
功能:目标操作数 ?(目标操作数)按位逻辑异或(源操
作数)
变异功能:任何位与 1相异或,其相应位取反;任何位与 0
相异或,其相应位维持不变。
该指令有如下 5种形式:
XOR R,R ;通用寄存器之间按位相或
XOR R,Imm ;通用寄存器与立即数之间按位相或
XOR M,Imm ;内存数与立即数按位相或
XOR M,R ;通用寄存器与内存数之间按位相或
XOR R,M ;内存数与通用寄存器之间按位相或
退 出
3.6.2
例如,设( BL) =46H,要求把其 1,3,4、和 6位取
反,其指令为:
XOR BL,01011010B ;
其计算过程如下所示:
0 1 0 0 0 1 1 0
XOR 0 1 0 1 1 0 1 0
0 0 0 1 1 1 0 0
退 出
3.6.2
5) TEST—测试指令
形式,TEST 目标操作数,源操作数
功能:(目标操作数)按位逻辑与(源操作数),结果影
响标志位
该指令有如下 5种形式:
TEST R,R ;通用寄存器之间按位相与
TEST R,Imm ;通用寄存器与立即数之间按位相与
TEST M,Imm ;内存数与立即数按位相与
TEST M,R ;通用寄存器与内存数之间按位相与
TEST R,M ;内存数与通用寄存器之间按位相与
例如,设( AL) =76H,要求测试 AL的第 0,1和 5位是否
都为 0,其指令为,TEST AL,00100011
语句执行后 AL仍为 76H。同时,可测试 ZF位,若
ZF=1,表示 3位都为 0;若 ZF=0,表示 3位不全为 0。
退 出
3.6.2
四、移位类指令( 1)
移位类指令分为以下几种,如 图 3.14所示:
1,左右移指令
1)逻辑移位指令
( 1) SHL— 逻辑左移指令
形式 1,SHL 操作数,1
功能:操作数 ?操作数的内容连同 CF的内容一起
左移 1位,尾部空位补,0”, CF中的原有的内容丢弃。
如 图 3.15所示
变异功能:操作数左移 1位,具有乘 2的功能。
退 出
3.6.2
该指令有如下 2种形式:
SHL R,1 ;把通用寄存器的内容左移 1位
SHL M,1 ;把内存数的内容左移 1位
形式 2,SHL 操作数,CL
功能:操作数 ?操作数的内容连同 CF的内容一起左
移的次数,为 CL寄存的数。
变异功能:操作数左移 N位,具有乘 2N的功能。
( 2) SHR— 逻辑右移指令
形式 1,SHR 操作数,1
形式 2,SHR 操作数,CL
退 出
3.6.2
功能:操作数 ?操作数的内容连同 CF的内容一起右移
1位或( CL)位。高位移空的位补,0” 。如 图 3.16所示:
变异功能:操作数右移 N位,具有无符号数除以 2N的
功能。
该指令有如下 2种形式:
SHR R,1/CL;把通用寄存器的内容右移 1位或( CL)位
SHR M,1/CL;把内存数的内容左移 1位或( CL)位
2)算术移位指令
( 1) SAL— 算术左移指令
形式 1,SAL 操作数,1
形式 2,SAL 操作数,CL
功能:完全与逻辑左移指令一样。
退 出
3.6.2
( 2) SAR— 算术右移指令
形式 1,SHR 操作数,1
形式 2,SHR 操作数,CL
功能:操作数 ?操作数的内容连同 CF的内容一起右移 1
位或( CL)位。高位移空的位补“符号位”。
如 图 3.17所示:
变异功能:操作数右移 N位,具有带符号数除以 2N的功
能。
该指令有如下 2种形式:
SAR R,1/CL ;把通用寄存器的内容右移 1位或( CL)位
SAR M,1/CL ;把内存数的内容右移 1位或( CL)位
退 出
3.6.2
例 3-5编程序实现一个字节无符号数乘 64。
分析:实现此功能的算法有很多,但是最巧妙的方法
是通过该字节数 ?256?4来实现。
例 3-6编写一程序实现将字变量 W中的无符号数除以 8,商
和余数分别放入字变量 wQuot和字节变量 bRema将字变量。
分析:我们可以通过取字变量低 3位来得到余数,将
字变量右移 3位,实现除以 8,得到商的结果。
退 出
3.6.2
2,循环移位类指令
1)小循环移位指令
( 1) ROL— 不带进位循环左移
形式 1,ROL 操作数,1
功能:把操作数的内容首尾连接起来循环左移 1位。 CF的内
容为操作数最高位的原值,CF原值丢失。如 图 3.18所示:
形式 2,ROL 操作数,CL
功能:把操作数的内容首位连接起来进行循环左移,移位
的次数为 CL寄存的值。
该指令有如下 2种形式:
ROL R,1/CL;把通用寄存器的内容循环左移 1位或( CL)

ROL M,1/CL;把内存数的内容循环左移 1位或( CL)位
退 出
3.6.2
( 2) ROR— 不带进位的循环右移
形式 1,ROR 操作数,1
形式 2,ROR 操作数,CL
功能:把操作数的内容首尾连接起来循环右移 1位或( CL)
位。如 图 3.19所示。
该指令有如下 2种形式:
ROR R,1/CL ;把通用寄存器的内容循环右移
1位或( CL)位
ROR M,1/CL ;把内存数的内容循环右移
1位或( CL)位
退 出
3.6.2
2)大循环移位指令
( 1) RCL— 带进位的循环左移
形式 1,RCL 操作数,1
功能:把操作数的内容与 CF位一起循环左移 1位。如 图
3.20所示:
形式 2,RCL 操作数,CL
功能:把操作数的内容与 CF位一起进行循环左移,移位
的次数为 CL寄存的值。
该指令有如下 2种形式:
RCL R,1/CL;把通用寄存器的内容循环左移 1位或( CL)

RCL M,1/CL;把内存数的内容与 CF位一起循环左移 1位或
( CL)位
退 出
3.6.2
( 2) RCR— 带进位的循环右移
形式 1,RCR 操作数,1
形式 2,RCR 操作数,CL
功能:把操作数的内容与 CF位一起循环右移 1位或
( CL)位。如 图 3.21所示:
该指令有如下 2种形式:
RCR R,1/CL ;把通用寄存器的内容与 CF位一
起循环右移 1位或( CL)位
RCR M,1/CL ;把内存单元的内容与 CF位一起
循环右移 1位或( CL)位
退 出
3.6.2
例 3-7字变量 wNum中有一无符号数,编写计算( wNum)
?16?30,并将结果送入 wNum和 wNum?2种的程序。
分析:我们知道( wNum) ?16的结果不会超过 32位,
所以应用两个字来存放结果,而实际上,结果的高位字就
是 wNum中的高 4位,结果的低位字就是把 wNum左移 4位,
然后再加 30,即为最终结果。
退 出
3.6.2
五、标志位操作指令及处理器指令
1,标志位操作指令
标志位操作指令是一组对标志位置位、
复位、保存和恢复等操作的指令。
1)进位 CF操作指令
形式 1,CLC
功能,CF?0
形式 2,STC
功能,CF?1
形式 3,CMC
功能,CF?CF
退 出
3.6.2
2)方向位 DF操作指令
形式 1,CLD
功能,DF?0
形式 2,STD
功能,DF?1
3)中断允许位 IF操作指令
形式 1,CLI
功能,IF?0
形式 2,STI
功能,IF?1
退 出
3.6.2
4)存、取标志位操作指令
形式 1,LAHF
功能,AH?RFlag的低 8位
形式 2,SAHF
功能,RFlag的低 8位 ? AH
5)标志寄存器的保护操作
形式 1,PUSHF
功能:将 RFlag入栈
形式 1,POPF
功能:将 RFlag出栈
退 出
3.6.2
2,处理器指令
处理器指令是一组控制 CPU工作方式的指令。这组指
令的使用频率不高。
1) NOP— 空操作指令
形式,NOP
功能,CPU执行该指令是不完成任何具体功能,只占
用 3个时钟周期。
2) WAIT— 等待指令
形式,WAIT
功能,CPU执行该指令时,测试 CPU的引线。当线为高
电平,CPU进入等待状态,且每隔 3个时钟对的状态进行一
次测试,直到引线出现低电平时,CPU退出等待,顺序执
行下一条指令。
退 出
3.6.2
3) HLT— 暂停指令
该指令使 CPU进入暂停状态。只有当下面三种情况之
一发生时,CPU才退出暂停状态。这三种情况是,CPU的复
位输入端 RESET有效;非屏蔽中断产生请求;可屏蔽中断
产生请求,且标志寄存器的 IF=1。
4) LOCK—— 封锁总线前缀指令
它是一条前缀指令,可放在任何指令的前面,使得相
应指令的执行时,总线被锁定,使别的主设备不能使用总
线。
退 出
3.6.2
六、串指令( 2)
字符串操作指令的实质是对一片连续存储单元进行处
理,这片存储单元是由 DS:SI或 ES:DI来指定的。字符串操
作指令可对内存单元按字节、字进行处理,并能根据操作
对象的规定使 SI(或 DI)增减。具体规定如下:
当 DF=0时,变址寄存器 SI(或 DI)增加 1或 2;
当 DF=1时,变址寄存器 SI(或 DI)减少 1或 2;
在使用串指令前,须先进行以下设置:
使用串操作语句必须事先设置隐含的寄存器。
设置方向标志位 DF。
如果使用重复前缀,还必须把重复次数置 CX中。
退 出
3.6.2
1,串指令的形式及功能
1) LODS—— 取字符串数据指令
形式,LODS 地址表达式
功能,AL/AX?( DS:SI),调整 SI
该指令还有如下 2种形式:
LODSB ; AL?( DS:SI),SI?SI?1
LODSW ; AX?( DS:SI),SI?SI?2
2) STOS—— 置字符串数据指令
形式,STOS 地址表达式
功能:( ES:DI) ? AL/AX,调整 SI
该指令还有如下 2种形式:
STOSB ;( ES:DI) ? AL,DI?DI?1
STOSW ;( ES:DI) ?AX,DI?DI?2
退 出
3.6.2
3) MOVS——传送字符串指令
形式,MOVS 地址表达式
功能:( ES:DI) ?( DS:SI),调整 SI,DI
该指令还有如下 2种形式:
MOVSB ;( ES:DI) ?( DS:SI),SI?SI?1,
DI?DI?1
MOVSW ;( ES:DI) ?( DS:SI),SI?SI?2,
DI?DI?2
4) CMPS——比较字符串指令
形式,CMPS 地址表达式
功能:( ES:DI) ?( DS:SI),结果影响标志位,调整 SI,DI
该指令还有如下 2种形式:
退 出
3.6.2
CMPSB ;( ES:DI) ?( DS:SI),结果影响标志位,; SI?SI?1,DI?DI?1
CMPSW ;( ES:DI) ?( DS:SI),结果影响标志位,; SI?SI?2,DI?DI?2
5) SCAS——扫描字符串指令
形式,SCAS 地址表达
功能:( ES:DI) AL/AX,结果影响标志位,调整 DI
该指令还有如下 2种形式:
SCASB ;( ES:DI) ?AL,结果影响标志位,
DI?DI?1
SCASW ;( ES:DI) ?AX,结果影响标志位,
DI?DI?2
例 3-8编写一段程序,计算数字字符串 ?123456789?中的数
值之和。
退 出
3.6.2
2,重复前缀
重复前缀只能用在串操作指令的前面,重复次数应事先设置在 CX中。
有 3种形式的重复前缀:
1) REP—重复前缀
形式,REP 传送字符串指令或置字符串指令
功能:步骤 1,如果( CX) =0,则退出循环,执行下
面的语句。
步骤 2,如果( CX) ?0,则执行所写串操作指令一次且
CX=( CX) -1,转步骤 1。
例如:
REP MOVSB
REP MOVSW
REP STOSB
REP STOSW
退 出
3.6.2
2) REPE/REPZ—相等重复前缀
形式,REPE/REPZ 扫描字符串指令或比较字符串指令
功能:步骤 1,如果( CX) =0或( ZF) =1,则退出循环。
步骤 2,如果( CX) ?0且( ZF) =0,则执行所写
串操作指令一次且 CX=( CX) -1,转步骤 1。
例如:
REPE/REPZ SCASB
REPE/REPZ SCASW
REPE/REPZ CMPSB
REPE/REPZ CMPSW
退 出
3.6.2
3) REPNE/REPNZ—不相等重复前缀
形式,REPNE/REPNZ扫描字符串指令或比较字符串指令
功能:步骤 1,如果( CX) =0或( ZF) =0,则退出循环。
步骤 2,如果( CX) ?0且( ZF) =1,则执行所写串
操作指令一次且 CX=( CX) -1,转步骤 1。
例如:
REPNE/REPNZ SCASB
REPNE/REPNZ SCASW
REPNE/REPNZ CMPSB
REPNE/REPNZ CMPSW
例 3-9将显示器缓冲区的内容传送到 dBuf变量中,长度为
2000字,然后将显示器缓冲区写入空格,完成清屏功能。
分析:我们知道,显示器缓冲区的首地址为
0B800:0000H,我们可通过传送字符串指令,完成传送,
通过置字符串指令完成清屏功能。
退 出
3.6.2
七、程序控制类指令( 8)
程序控制类就是指改变了程序执行顺序的指令,也就
是通过改变 IP或 CS,IP的值,以达到控制程序执行顺序的
目的。控制类转移指令包括五类指令,即:
无条件转移
条件转移指令
循环控制指令
子程序调用与返回指令
中断指令
退 出
3.6.2
1,无条件转移和条件转移指令
形式,JMP OPRD
功能:若 OPRD为 16位数,则 IP?OPRD,实现段内转移;
若 OPRD为 32位数,则 IP?OPRD低 16,CS? OPRD高 16,
实现段间转移。
该指令有如下 3种形式:
JMP 标号 ;若标号为近标号,则 IP?OFFSET 标号,
实现段内的转移;若为远标号,则 IP?OFFSET 标号,CS?SEG
标号,实现段间的转移
JMP R16 ; IP?( R16),实现段内的转移
JMP M ;若 M为字单元,则 IP?( M),实现段 内转移;若 M为双字单元,则 IP?( M低 16),CS?
( M高 16),实现段间转移
退 出
3.6.2
2,条件转移指令
条件转移语句实现段内的短转移,即转移语句与转向
语句之间最大距离为 +127或 -128字节。条件转移指令是一
组极其重要的转移指令,它根据标志寄存器中的一个或多
个标志位来决定是否需要转移。
条件转移指令分为三大类:
基于无符号数的条件转移指令
基于有符号数的条件转移指令
基于算术标志位的的条件转移指令。
1)无符号数关系的判断的条件转移
( 1) JA/JNAE— 大于转移指令
形式,JA/JNAE 标号
功能:若大于( CF OR ZF=0)转移到标号处执行,否则
顺序执行。
退 出
3.6.2
( 2) JAE/JNA— 大于等于转移指令
形式,JAE/JNB 标号
功能:若大于等于( CF=0)转移到标号处执行,否则顺
序执行。
( 3) JB/JNAE— 小于转移指令
形式,JB/JNAE 标号
功能:若小于( CF=1)转移到标号处执行,否则顺序执
行。
( 4) JBE/JNA— 小于等于转移指令
形式,JBE/JNA 标号
功能:若小于( CF OR ZF=1)转移到标号处执行,否则
顺序执行。
( 5) JE/JZ— 等于转移指令
形式,JE/JZ 标号
功能:若等于( ZF=1)转移到标号处执行,否则顺序执
行。
退 出
3.6.2
( 6) JNE/JNZ— 不等于转移指令
形式,JNE/JNZ 标号
功能:若不等于( ZF=0)转移到标号处执行,否则顺序
执行。
2)符号数关系的判断的条件转移
( 1) JG/JNLE— 大于转移指令
形式,JG/JNLE 标号
功能:若大于(( SF XOR OF) OR ZF=0)转移到标号处
执行,否则顺序执行。
( 2) JGE/JNL— 大于等于转移指令
形式,JGE/JNL 标号
功能:若大于等于(( SF XOR OF) =0)转移到标号处
执行,否则顺序执行。
退 出
3.6.2
( 3) JL— 小于转移指令
形式,JL/JNGE 标号
功能:若小于(( SF XOR OF) =1)转移到标号处执
行,否则顺序执行。
( 4) JLE— 小于等于转移指令
形式,JLE/JNG 标号
功能:若小于等于(( SF XOR OF) =1 OR ZF=1)转移
到标号处执行,否则顺序执行。
带符号数的等于及不等于转移指令与无符号数的
等于及不等于转移指令一样。
3)标志位的判断的条件转移
( 1) JC— 有进位转移指令
形式,JC 标号
功能:有进位( CF=1)转移到标号处执行,否则顺序
执行。
退 出
3.6.2
( 2) JNC— 无进位转移指令
形式,JNC标号
功能:无进位( CF=0)转移到标号处执行,否则顺序
执行。
( 3) JO— 溢出转移指令
形式,JO 标号
功能:溢出( OF=1)转移到标号处执行,否则顺序执
行。
( 4) JNO— 无溢出转移指令
形式,JNO 标号
功能:溢出( OF=0)转移到标号处执行,否则顺序执
行。
( 5) JP/JPE— 偶性转移指令
形式,JP/JPE 标号
功能:若结果的低 8位有偶数个,1” ( PF=1)转移到
标号处执行,否则顺序执行。
退 出
3.6.2
( 6) JNP/JPO— 奇性转移指令
形式,JNP/JPO 标号
功能:若结果的低 8位有奇数个,1” ( PF=0)转移到标号处执行,
否则顺序执行。
( 7) JS— 负符号转移指令
形式,JS 标号
功能:若结果为负( SF=1)转移到标号处执行,否则顺序执行。
( 8) JNS— 正符号转移指令
形式,JNS 标号
功能:若结果为正( SF=0)转移到标号处执行,否则顺序执行。
( 9) JCXZ— 计数零转移指令
形式,JCXZ 标号
功能:若 CX=0转移到标号处执行,否则顺序执行。
退 出
3.6.2
例 3-10判断从键盘输入的 ASCII码是字母还是数字,若是
字母显示,C‖,若是数字显示,D‖。假设输入的字符只可
能是字母或数字。
分析:通过查看 ASCII码表可以看出,若是字母,则
其 ASCII码的 D6位为,1‖,若为数字,则其 ASCII码的 D6
位为,0‖。
例 3-11某工厂的产品共有 8种加工处理程序 P0~P7,而某产
品应根据不同情况,作不同处理,其选择由键入的值 0~7
来决定。若键入 0~7以外的健,则退出该产品的加工处理
程序。作为举例,假设每个处理程序的功能就是显示一个
字母,P0显示,A”, P1显示,B”, P2显示,C”, ?。
退 出
3.6.2
分析:我们可以用跳转表法实现分支,具体做法是,
在数据区开辟一片连续存储单元作为跳转表,表中顺序存
放各分支处理程序的跳转地址。跳转地址在跳转表中的位
置,即它们在表中的偏移始地址等于跳转标的首地址加上
它们各自的序号与所占字节数的乘积。
为了改善汇编语言源程序的结构,减少显式转移语句
所带来混乱,在宏汇编 MASM 6.11系统中,增加了表达分
支结构的 伪指令 。
退 出
3.6.2
3,循环控制指令
1) LOOP— 计数循环语句
形式,LOOP 短标号
功能,CX=( CX) -1;
若( CX) ?0,则( IP) =OFFSET 段标号,否则继续执
行下一句。
2) LOOPNZ/LOOPNE— 非零计数循环
形式,LOOPNZ/NE 短标号
功能,CX=( CX) -1;
若( CX) ?0且 ZF=0,则( IP) =OFFSET标号,否则继
续执行下一个语句。
3) LOOPZ/LOOPE— 零计数循环
形式,LOOPZ/E 短标号
退 出
3.6.2
功能,CX=( CX) -1
若( CX) ?0且 ZF=1,则( IP) =OFFSET标号,否则继续
执行下一个语句。
例 3-13求出前 20个斐波那契数,斐波那契数的定义为:
F0=0
F1=1
F( N+2) =F( N) +( N+1)
分析:我们用循环来完成求出前 20个斐波那契数,每
次循环需求出 2个斐波那契数,那么后 18个斐波那契数需
循环 9次。
同样,在 宏汇编 MASM 6.11系统 中,还增加了表达循
环结构的伪指令。
退 出
3.6.2
4,子程序调用与返回指令
定义子程序的一般格式如下:
子程序名 PROC [NEAR/FAR]
?
? ;子程序体
子程序名 ENDP
对子程序定义的具体规定如下:
“子程序名”必须是一个合法的标识符,并且二者要
前后一致;
PROC和 ENDP必须是成对出现的关键字,它们分别表示
子程序定义开始和结束;
子程序的类型有 NEAR,FAR之分,其缺省的类型是近
调用 NEAR型;
退 出
3.6.2
子程序名有 3个属性:段值、偏移量和类型。其段值
和偏移量对应于子程序的入口地址,其类型就是该子程序
的类型。
在编写子程序时,除了要考虑实现子程序程序功能的
方法,还要养成编制相应的说明文件的好习惯。其说明信
息一般包括以下几个方面内容:
功能描述;
入口参数和出口参数;
所用寄存器;
所采用的算法;
退 出
3.6.2
1) CALL— 调用指令
形式,CALL 操作数
功能:若 OPRD为 16位数,保留返回地址 IP于栈中:
SP?( SP) -2,( SS:SP) ?( IP);
实现段内转移,IP?OPRD。
若 OPRD为 32位数,保留返回地址 CS,IP于栈中:
SP?( SP) -2,( SS:SP) ?( CS),SP?
( SP) -2,( SS:SP) ?( IP);
实现段间转移,IP?OPRD低 16,CS? OPRD高 16。
该指令有如下 3种形式:
CALL 标号;若标号为近标号,;则 SP?( SP) -2,( SS:SP) ?( IP),
IP?OFFSET 标号
退 出
3.6.2;若为远标号,;则 SP?( SP) -2,( SS:SP) ?( CS),
SP?( SP) -2,;( SS:SP) ?( IP),IP?OFFSET 标号
CS?SEG 标号
JMP R16 ; SP?( SP) -2,( SS:SP) ?( IP),IP?
( R16)
JMP M ;若 M为字单元,SP?( SP) -2,( SS:SP) ?
( IP),IP?( M);若 M为双字单元,; SP?( SP) -2,( SS:SP) ?( CS),SP?
( SP) -2,;( SS:SP) ?( IP),则 IP?( M低 16),
CS?( M高 16)
退 出
3.6.2
2) RET— 返回指令
形式,RET [Imm]
功能:从栈取返回地址于指令指针中。
若为近过程返回指令,则 IP?( SS:SP),SP?( SP)
+2或 SP?( SP) +2+Imm;
若为远过程返回指令,则 IP?( SS:SP),SP?( SP)
+2,CS?( SS:SP),SP?( SP)
用户可以利用以上指令来设计包含子程序的程序,
但还解决以下 3个问题:
第一,主程序与子程序间的参数传递。其基本方法
有寄存器法、堆栈法和约定内存单元法。
第二,主程序和子程序公用寄存器问题。
第三,子程序所处位置。
退 出
3.6.2
例 3-16编写程序,按 5位十进制的形式显示寄存器 BX中的
内容,如果 BX的值小于 0,则应在显示数值之前显示,-” 。
假设该子程序与调用程序在同一段,要求用子程序完成 BX
数值的十进制显示。
分析:从题目要求中可以看出,该子程序的入口参数
是通过寄存器传递,无出口参数,该子程序应定义为 NEAR
型。我们可先判断 BX的值的正负,若为负,则显示,-”,
求其绝对值,采用除 10取余数的方法,从低位向高位求出
每位十进制数。
退 出
3.6.2
例 3-17编写程序,分类统计出一个字符串中数字字符、字
母和其它字符的个数。要求用子程序完成分类统计,假设
调用程序与子程序不在同一段。
分析:从题目要求可以看出,子程序要完成分类统计,
应把字符串作为入口参数,因为字符串可能很长,所以,
须用内存单元作为入口参数的传递,这时用 DS:DX来指定
字符串的首地址。这是子程序应定义为 FAR型。
退 出
3.6.2
递归调用的实现过程,这在高级语言的学习中都是
一个很难理解过程,我们用汇编语言编程实现,通过单
步执行,我们能够很清晰看到 CPU递归调用的实现过程及
原理。
例 3-18编写子程序实现求 n!。
分析:按照阶乘的定义:
1 n=0
n!=
n?(n-1)! n≥1
这是一个递归定义,可采用子程序实现阶乘的计算。
退 出
3.6.2
4,中断指令
1) INT— 软件中断指令
形式,INT Imm8
功能:把标志寄存器压栈,SP?( SP) -2,
( SS:SP) ?FR,清除标志位 IF和 TF;
把 CS压栈,SP?( SP) -2,( SS:SP) ?CS,
CS?( 0000,Imm8? 4+2);
把 IP压栈,SP?( SP) -2,( SS:SP) ?IP,
IP?( 0000,Imm8? 4),
2) IRET— 中断返回指令
形式,IRET
功能,IP?( SS:SP),SP?( SP) +2,CS?( SS:SP),
SP?( SP) +2,FR?( SS:SP),SP?( SP) +2
退 出
3.6.2
这里,Imm8称为 8位的中断号。中断和子程序的调用
在实现方面的主要差异是什么?
子程序的调用直接通过 CALL指令来实现,但中断的调
用只用 INT是不够的,须事先把中断服务程序的逻辑地址
存入 0000,Imm8? 4起始的 4个内存单元,才能保证程序的
正确调用。
子程序的返回指令是 RET,而中断服务程序的返回指
令是 IRET。
在通常情况下,子程序是由应用程序的开发者编写的,
而中断服务程序是由系统软件设计者编写的。如主板上的
ROM BIOS内的程序及 DOS系统中的功能程序,这些程序都
是系统人员设计的程序,用户调用时,都是通过 INT指令
来实现,具体的方法我们在 4.2中介绍。
子程序是在执行时,才调入内存,而中断服务程序是
常驻内存的。
退 出
3.6.2
例如,前面出现的显示字符串程序,DOS系统提供有
这样的程序,用户可直接调用,其参数要求如下:
功能号,AH?09H
入口参数,DS:DX指向需显示的字符串,该字符串需
用 ?$?为结束标志。
出口参数:无
中断指令,INT 21H
退 出
第七节 COM文件的编程
COM文件和 EXE文件都是可执行文件,COM
文件的主要特点如下:
COM文件只有一个段,其字节数不会超过 64K;
当操作系统装入 COM文件时,四个段寄存器
(CS,DS,ES和 SS)都 用 PSP的段值来初始化;
必须用伪指令 ORG 100H来说明空出前 256个
字节。
退 出
第七节
例 3-19 编写一个显示字符串,Hello,com‖的 COM
类型的程序。
分析:本程序的实现算法很简单,只是注意按
COM类型文件要求编程即可。
在 PWB编程环境下,设置菜单 Option→Project
Templates→Set Project Template→ 在列表框中选
DOS COM,然后汇编、连接即可指定生成 COM文件。
退 出
第八节 宏
宏:是把一段程序代码用一个特定标识符 (即:宏指令
名 )来表示 。
退 出
3.8.1 宏的定义及调用
一、宏定义
定义宏指令的一般格式如下:
宏指令名 MACRO [形参 1,形参 2,?]
?
? ;宏体
ENDM
对宏指令定义的具体规定如下:
MACRO和 ENDM是二个必须成对出现的关键字,它
们分别表示宏定义的开始和结束;
MACRO和 ENDM之间的部分是宏的定义体,它是由
指令、伪指令或引用其它宏所组成的程序片段,是宏所包
含的具体内容;
退 出
3.8.1
―宏指令名”是为所定义的宏指令起的名称,由程序
员指定的一个合法的标识符,它供宏调用时使用;
宏指令名可以与指令助忆符、伪指令名相同。在这种
情况下,宏指令优先,而同名的指令或伪指令都失效;
在 ENDM的前面不要再写一次宏名,这与段或子程序
定义的结束方式有所不同;
在宏定义的首部可以列举若干个形式参数,每个参数
之间要用逗号分隔。
退 出
3.8.1
例如,定义一条宏指令,实现两个字变量相加。
wAdd MACRO wVar1,wVar2
MOV AX,wVar2
ADD wVar1,AX
ENDM
上述宏定义虽然能满足题目的要求,但由于在定义体
中改变了寄存器 AX的值,这就使宏的调用破坏了 AX的值。
为了保护寄存器的现场,也像子程序设计那样,在宏体的
开始对所用寄存器保护,在宏结束恢复寄存器的值,可把
该宏定义改成如下形式:
退 出
3.8.1
wAdd MACRO wVar1,wVar2
PUSH AX
MOV AX,wVar2
ADD wVar1,AX
POP AX
ENDM
宏定义中的参数也可出现在操作助记符中。例如,若
希望定义的宏指令可以实现左移,也可以实现右移,具体
使用时由实际参数来指定其移位方向,于是我们可以有下
面宏定义:
退 出
3.8.1
Shift MACRO n,Reg,cDir
PUSH CX
MOV CL,n
SH&cDir Reg,CL
POP CX
ENDM
形式参数出现在助记符中时,若不在助记符的开头,
那么,形参前面必须加字符 &。必须指出的是,在调用时
所提供的实际参数应使宏体中的对应指令成为一条合法的
指令,这样例中所用的形参对应的实参只能是 R或 L。
退 出
3.8.1
二、宏调用及宏展开
1,宏调用
形式,宏指令名 [实参 1,实参 2,?]
其中:
实参的位置要与形参的位置要对应,但实参的个数可以
与形参的个数不相等;
当实参的个数多于形参的个数时,多出的实参被忽略;
当实参的个数少于形参的个数时,没有实参对应的形参
用“空”来对应。但在宏展开时,所得到的指令必须是合法
的汇编指令,否则,汇编程序将会给出出错信息。
在调用宏时,参数是通过“实参”替换“形参”的方式
来实现传递的。参数的形式灵活多样,参数可以是常数、寄
存器、存储单元和表达式,还可以是指令的操作码。
退 出
3.8.1
例如有了上面的宏定义 wAdd和 Shift后,程序中
就可以有下面的宏调用:
wA DW 1234H
wB DW 5678H
?
wAdd wA,wB
Shiift 4,AX,R
2,宏展开
宏展开是指在汇编过程中,当汇编遇到宏调
用语句时,它将用宏体中的一段程序来代替这条
宏调用语句,并且语句中的形式参数被实际参数
取代。
退 出
3.8.1
例如上面程序片段汇编后的宏展开形式:
wA DW 1234H wA DW 1234H
wB DW 5678H wB DW 5678H
? ?
PUSH AX
wAdd wA,wB MOV AX,wB
ADD wA,AX
POP AX
PUSH CX
Shiift 4,AX,R A,wB MOV CL,n
SHR AX,CL
POP CX
退 出
3.8.1
三、宏定义中的标号与变量
局部标号或变量由 LOCAL伪指令定义。
形式,LOCAL 标号 1,标号 2,?
伪指令 LOCAL必须是伪指令 MACRO后的第一条语句,
并且在 MACRO和 LOCAL之间也不允许有注释和分号标
志。
例如,定义一个求绝对值的宏:
Abs MACRO Num
LOCAL next
CMP Num,0
JGE next
NEG Num
next,
ENDM
退 出
3.8.1
四、重复宏
在编写源程序时,有时会出现连续相同或相似的
语句 (组 )。当出现这种情况时,可利用重复伪指令来
重复语句,从而达到简化程序的目的。
重复汇编伪指令有如下 3种。
1,伪指令 REPT
其一般使用格式如下:
REPT 数值表达式
?
? ;宏体
ENDM
功能:重复地执行宏体中的语句,重复次数由数值表
达式的值确定。
退 出
3.8.1
例如,定义 100个初值分别为 1,2,…,100 的字
节单元,该存储单元的起始符号地址为 Table。
这样的定义要求,按照前面所学的语句时难
以实现的,有了重复宏伪指令,实现如下:
Table EQU THIS BYTE
COUNT = 1
REPT 100
DB COUNT
COUNT = COUNT + 1
ENDM
退 出
3.8.1
2,伪指令 IRP
形式,IRP 形参,<实参 1,实参 2,?>
?
? ;宏体
ENDM
功能:将宏体重复汇编,重复汇编次数由尖括号括
起来的实参个数所决定。每次重复汇编语句
序列时,用一个实参替代形参。第一次用第
一个实参,第二次用第二个实参,直到实参
用完为止。
退 出
3.8.1
PopReg MACRO String
IRPC Reg,String
POP Reg&X
ENDM
ENDM
对上述宏定义的宏调用:
PopReg DCBA
退 出
3.8.1
五、宏与子程序的区别
宏和子程序都是为了简化源程序的编写,提高程序的
可维护性,但是它们二者之间存在着以下本质的区别:
汇编程序对宏通过宏展开来加入其定义体,宏调用多
少次,就相应展开多少次,所以,调用宏不会缩短目标程
序;而子程序代码不论调用多少次,其在目标程序中只出
现一次,因此,可简化相应的目标程序,从而节省存储空
间。
宏引用时,参数是通过“实参”替换“形参”的方式
来实现传递的,参数形式灵活多样,而子程序调用时,参
数是通过寄存器、堆栈或约定存储单元进行传递的;
利用宏调用语句执行重复语句,不会有额外的时间开
销,而用子程序执行重复语句,子程序的调用和返回均需
要时间;
退 出
3.8.2 条件汇编伪指令
条件汇编指汇编程序根据条件的不同汇编不同的程序段。
形式,IFnnnn 条件表达式
语句组 1
[ELSE
语句组 2]
ENDIF
其中,IFnnnn是表 3.3中的伪指令。
功能:若条件汇编伪指令后面的“条件表达式”为真,那么,
语句组 1将被汇编;否则,语句组 2将被汇编 (如果含有 ELSE
伪指令 )。
语句组 1或语句组 2内还可以包有条件汇编伪指令,这时,
就形成了嵌套的条件汇编伪指令。
每条条件汇编伪指令的具体含义如 表 3.3所示。
退 出
3.8.3 宏程序库
对于程序编制人员,常常希望编得较好的宏定义能为
较多的程序采用,且希望减少重复编写时的错误。这时,
可把若干个宏定义以文件的形式组成一个宏库,供其它源
程序使用。
当需要宏库文件中的宏定义时,可在新编制的源程序
中使用 INCLUDE伪指令。宏汇编程序在汇编源程序时,
如果遇到 INCLUD伪指令,把有关“宏库”文件包含在用
户的源程序中,如同这个程序中自己定义的宏一样,在后
面的程序中就可以对宏库中的宏定义直接进行宏调用。
MASM 6.11系统定义了大量的标准宏,程序员能很方
便地使用它们。主要的系统宏库文件有,DOS.INC和
BIOS.INC,它们存放在系统的 include子目录中。
退 出
第九节 算术协处理器
对于各种协处理器,指令系统和编程几乎完全相同,
主要区别是每种协处理器被设计成与 Intel的不同型号的微
处理器共同工作。
标识为 80?87的协处理器系列可以实现乘法、除法、
加法、减法、求平方根以及超越函数的运算。
退 出
3.9.1 算术协处理器的数据格式
一、整数
80?87CPU处理的整数有三种:字型整数、短型整数
及长型整数。它们都是有符号数二进制数,用补码表示。
1,字型整数
15 0
形式,S 数码
其数值范围,-32768( -215) ~+32767( +( 215-1))
在汇编语言环境下,其数据定义语句为:
wData1 DW 3 ;定义 16位字型变量 wData1,赋初值
为 3
退 出
3.9.1
2,短型整数
31 0
形式,S 数码
其数值范围,-2147483648( -231) ~+2147483647( +
( 231-1))
在汇编语言环境下,其数据定义语句为:
dData2 DD -65532 ;定义 32位短整型变量
dData2,赋初值为 -65532
退 出
3.9.1
3,长型整数
63 0
形式,S 数码
其数值范围,-9?1018( -263) ~+9?1018( +( 263-1))
在汇编语言环境下,其数据定义语句为:
qData3 DQ -9945 ;定义 64位长整型变量
qData3,赋初值为 -9945
用户常用的是字型整数和短型整数,有时也用长型整数。
退 出
3.9.1
二、实数
在计算机中,实数就是规格化的二进制浮点数表示,
规格化的二进制浮点数由三部分组成:数值的符号位、阶
码和有效数字(简称尾数),其形式为:
± 2K?( 1+a1+a2+ +?)
二进制浮点数在计算机中的表现形式采用的是 IEEE标
准,其格式为:
S J a1 a2 a3 … …
退 出
3.9.1
S为浮点数的符号位; J为阶码,它时 K的移码表示方
式,即 J=K+2N-1,其中 N是阶码的位数,这样,J就是一
个无符号数; a1 a2a3?为尾数,用原码表示。实数的具
体形式有以下三种:
1,短实数
31 30 23 22 0
形式,S J 尾数
一个数占 32位,J=28-1-1+K,K的范围为 -127~+127,
对应 J范围为 0~254。短实数表示数值的范围为:
-3.4?1038~3.4?1038
退 出
3.9.1
2,长实数
6362 52 51 0
形式,S J 尾数
一个数占 64位,J=211-1-1+K,长实数表示数值的范
围为:
-1.7?10308~+1.7?10308
3,暂时实数
79 78 64 63 0
形式,S J 尾数
一个数占 80位,J=215-1-1+K,其表示数值的范围为:
-1.1?104932~+1.1?104932
退 出
3.9.1
三,BCD码
一个 BCD码数据在内存中占 80位,共 10个字节。其
最高字节用来表示正负号,其余 9个字节,每个字节内含
两个 BCD码,所以,一个 BCD码数据可表示 18位十进制
数。
关于 BCD码的正负数,有如下规定:
若最高位字节的值为 00H,则表示该 BCD码为正数;
若最高位字节的值为 80H,则表示该 BCD码为负数。
退 出
3.9.1
79 72 71 16 15 8 7 0
形式:符号字节 … … BCD BCD BCD BCD
一个数占 80位,其表示数值的范围为:
-9.99?9?1017~+9.99?9?1017
17个 17个
在用汇编语言存储 BCD码时,可使用伪指令 DT来存储。
退 出
3.9.2 算术协处理器的内部结构
一,80?87的内部结构
图 3.24给出了算术协处理器的内部结构,它可分为两
个主要部分:控制单元和数字执行单元。
控制单元:定点微处理器和协处理器均监视指令流,如果
是 ESC指令,则由协处理器予以执行,否则由
定点微处理器执行。
数字执行单元:负责执行所有协处理器指令。
退 出
3.9.2
二,80?87程序设计模型
80?87种的寄存器分别为 8寄存器的堆栈、状态寄存
器、控制寄存器及标记寄存器。
1,8寄存器堆栈
协处理器中的堆栈包含 8个寄存器,每个为 80位宽。
这些堆栈寄存器中总包含一个 80位的扩展精度浮点数。
2,状态寄存器
状态寄存器是用来标识协处理器中指令执行情况的,
它相当于 CPU中的标志位寄存器。 80x87协处理器的状
态寄存器如 图 3.24所示。
退 出
3.9.2
状态寄存器各标志位 (或组合位 )的含义如下:
忙位 B(Busy):忙标志位用来表明协处理器是否正在执行
协处理器指令,它可用 FWAIT指令来测试。
条件编码位 C3-C0(Condition Code):表明了协处理器的
条件(参见 表 3.4)
栈顶位 TOP(Top-Of-Stack,ST):该三位二进制 000?111
用来表明当前作为栈顶的寄存器,通常是寄存器 0(其值
为 000)。
错误汇总位 ES(Error Summary),ES=
PE+UE+OE+ZE+DE+IE(逻辑或运算 ),在 8087协处理器
中,当 ES为 1时,将发出一个协处理器中断请求,但在其
后的协处理器中,不再产生这样的协处理器中断申请。
精度错误位 PE(Precision Error):该状态位用来表明运算
结果或操作数是否超过设定的精度范围。
退 出
3.9.2
下溢错误 UE(Underflow Error):该状态位用来表明一个非
0的结果太小,不能用控制字节所选定的当前精度来表示。
上溢错误 OE(Overflow):该状态位用来表明一个非 0的结果
太大,不能用控制字节所选定的当前精度来表示。
被零除错误 ZE(Zero Error):该状态位用来表明当前执行了
,0作除数”的除法运算。
非规格化错误 DE(Denormalized Error):该状态位用来表明
当前参与运算的操作数中至少有一个操作数是没有规格化
的。
非法操作错误 IE(Invalid Error):该状态位用来表明执行了一
个错误的操作,如:求负数的平方根,也可用来表明堆栈
的溢出错误、不确定的格式 (0/0,∞,-∞等 )错误,或用
NAN作为操作数。
退 出
3.9.2
3,控制寄存器
控制寄存器如 图 3.25所示。
无穷大控制 IC(Infinity Control):选择是仿射无穷大还
是投射无穷大。 0—投影,假定是无符号无穷; 1—仿射,
允许正、负无穷。
舍入控制 RC(Rounding Control):确定舍入的类型。
00—最接近或偶数,01—舍入成负无穷,10—舍入成正
无穷,11—忽略小数部分。
精度控制 PC(Precision Control):设置结果的精度。
00—单精度,01—保留,11—双精度,10—扩展精度。
异常屏蔽 EM( exception masks):决定异常错误是
否影响状态寄存器的错误位。若屏蔽位的值为 1,则状态
寄存器的对应位被屏蔽;反之,不屏蔽。控制寄存器设置
了精度错误屏蔽位 PM、下溢出屏蔽位 UM、上溢出屏蔽位
OM、除数为 0屏蔽位 ZM、非规格化操作数屏蔽位 DM及非
法操作屏蔽位 IM。
退 出
3.9.2
4,标记寄存器
标记寄存器用来表明协处理器堆栈中各存储单元内容
的状态,也就是说,该寄存器可表明堆栈中的数据是合法
的,还是非法的,是无穷,还是 0或空等。该标记寄存器
的结构如 图 3.26所示。
其中,TAG(i)的取值含义,00—合法,01—0,10—非法
或无穷,11—空
退 出
3.9.3 协处理器基本指令集
协处理器可以执行超过 68条不同的指令,汇编程序在
遇到协处理器指令助忆符时,都会将其转换成机器语言的
ESC指令,ESC指令代表了协处理器的操作码。
一、指令操作符的命名规则
协处理器指令的操作符在命名设计时,遵循了下列规
则:
在操作符后面加上字母 P:表示该指令执行完后,还
进行一次堆栈弹出操作。如,FADD和 FADDP等;
在操作符后面加上字母 R:表示该操作是反模式,它
仅限于减法、除法指令。如,FSUB和 FSUBR等;
正模式:栈顶数据=栈顶数据 op 指令操作数,或 OPN1
= OPN1 – OPN2
反模式:栈顶数据=指令操作数 op 栈顶数据,或
OPN1= OPN2 – OPN1
退 出
3.9.3
假设:栈顶数据为 20,内存变量 data的值为 5,分别
执行下列指令将有不同的结果。
FSUB data ;指令执行后,栈顶数据为 15
FSUBR data ;指令执行后,栈顶数据为 -15
操作符的第 2个字母是 I,表示内存中数据是整数。它
对加、减、乘除指令都有效。
例如:
FADD data ; 浮点数加法;
FIADD data ;整数加法,它表示内存单元
data是一个整数,把该整数加到;栈顶的浮点数上。
操作符的第 2个字母是 N,表示在指令执行之前是否插
入一个等待。如,FSAVE和 FNSAVE等,前者称为等待
形式 (Wait Version),后者称为非等待形式 (No-Wait
Version)。
退 出
3.9.3
二、语句的一般形式
80?87语句的一般形式和 80?86语句的一般形式相
同,其形式如下:
[标号,]操作符 [OPRD]
OPRD的形式比较简单,有三种:
1,省略
该地址隐含操作数在浮点栈 ST或 ST与 ST(1)中。
2,浮点栈变量
ST(I)或 ST,ST(I)或 ST(I),ST
3,存储器变量 M
80?87存储器变量的形式和相应 80?86存储器变量一致。
退 出
3.9.3
三,80?87指令系统
1.数据传送指令
数据传送指令主要是实现浮点栈与存储器之间的数据
传送,以及浮点栈之间的数据传送。
1)浮点数据传送
FLD—装入实数指令
形式,FLD OPRD
功能,ST?OPRD
该指令有如下两种形式:
FLD M ; ST?(M)
FLD ST(I) ; ST?ST(I)
退 出
3.9.3
FST—存储实数
形式,FST OPRD
功能,OPRD?ST
该指令有如下两种形式:
FST M ; M ? ST
FST ST(I) ; ST(I)? ST
FSTP—实数存储和弹出
形式,FSTP OPRD
功能,OPRD?ST,然后从栈顶弹出该数据
该指令有如下两种形式:
FSTP M ; M ? ST,然后从栈顶弹出该数据
FSTP ST(I) ; ST(I)? ST,然后从栈顶弹出该数据
退 出
3.9.3
可将 FST指令理解为复制指令,而将 FSTP理解为移
动指令。
FXCH—交换指令
形式,FXCH OPRD
功能,ST?OPRD
该指令有如下两种形式:
FXCH M ; M ?ST
FXCH ST(I) ; ST(I) ? ST
2)整数传送指令
装入整数指令 FILD、存储整数指令 FIST和存储并弹出
整数指令 FISTP。这 3条指令功能与 FLD,FST和 FSTP一
样,只不过传送的数据类型为整数而不是浮点数。
退 出
3.9.3
3) BCD数据传送指令
装入 BCD数据指令 FBLD和存储并弹出整数指令
FBSTP。这两条指令的功能也同 FLD和 FSTP一样,只不
过传送的数据类型为 BCD数据而不是浮点数。
例 3-20把 80?87所能处理的 7种数据送入 7个堆栈寄存器,
然后再传入内存。
分析:本程序的编程很简单,就是用相应的装载、存
储指令来就完成。主要目的是了解 80?87堆栈寄存器的使
用方法。
退 出
3.9.3
2,算术运算指令
1)整数算术运算指令
( 1)FIADD—整数加指令
形式,FIADD M
功能,ST?( ST) +( M)
( 2)FISUB—整 s数减指令
形式,FISUB M
功能,ST?( ST) -( M)
( 3)FISUBR—整数反减指令
形式,FISUBR M
功能,ST?( M) -( ST)
退 出
3.9.3
( 4) FIMUL—整数乘指令
形式,FIMUL M
功能,ST?( ST) ?( M)
( 5) FIDIV—整数除指令
形式,FIDIV M
功能,ST?( ST) ?( M)
( 6) FIDIV—整数反除指令
形式,FIDIV M
功能,ST?( M) ?( ST)
2)实数算术运算指令
( 1) FADD—实数加指令
形式 1,FADD
退 出
3.9.3
功能:从堆栈中弹出这两个操作数,然后将结果压入
堆栈 ST?( ST( 1)) +( ST)
形式 2,FADD M
功能,ST?( ST) +( M)
形式 3,FADD ST,ST(I)
功能,ST?(ST)+ST(I)
形式 4,FADD ST(I),ST
功能,ST(I)? ST(I) + (ST),并弹出栈顶数据
( 2)FSUB—实数减指令
( 3)FSUBR—实数反减指令
( 4)FMUL—实数乘指令
( 5)FDIV—实数除指令
退 出
3.9.3
( 6)FDIVR—实数反除指令
实数以上指令都同加法指令一样有四种形式。
3)实数算术运算及弹出指令
FADDP,FSUBP,FSUBRP,FMULP,FDIVP
及 FDIVRP指令功能同相应的实数算术运算指令,不同
之处在于,运算完成后,ST的内容被弹出。
4)其它算术运算指令
( 1) FABS—取绝对值指令,ST??(ST) ?
( 2) FRNDINT—取整指令,ST?[(ST)]
( 3) FSZRT—求平方根,ST?
退 出
)(ST
3.9.3
3,比较指令
比较指令有实数比较指令及实数测试指令、整数比较指令。
1)实数比较指令
形式 1,FCOM
功能,(ST)-(ST(1)),置条件码
形式 2,FCOM M
功能,(ST)-(M),置条件码
形式 3,FCOMP ST(I)
功能,(ST)-( ST(I)),置条件码,ST弹出
形式 4,FCOMPP
功能,(ST)-(ST(1)),置条件码,ST与 ST(1)全部弹出
2)实数测试指令
形式,FTST
功能,ST?(ST)-0.0,置条件码
退 出
3.9.3
3)整数比较指令
形式 1,FICOM M
功能,(ST)-(M),置条件码
形式 2,FICOMPM
功能,(ST)-(M),置条件码,ST弹出
4,初等函数指令
1) FPTAN—计算部分正切
形式,FPTAN
功能:求部分 Y/X=tanθ,其中 ST=X,ST(1)=Y,角度
θ存于栈顶。
2) FPATAN—计算部分反正切
形式,FPATAN
功能,θ=ARCTANX/Y,其中 X在栈顶,而 Y在 ST(1)
中,指令将数据弹出堆栈而将结果 θ值存于堆栈。
退 出
3.9.3
3) FYL2X—计算 Y?Log2X
形式,FYL2X
功能:计算 Ylog2X的值,其中 X=ST( X> 0),
Y=ST(1),结果存入有一个弹出操作后的栈顶。
4) FYL2XP1—计算 Y? (X+1)
形式,FYL2XP1
功能,(ST(1))=(ST(1)? Log2((ST)+1), ST弹出
5) F2XM1—计算 2X-1
形式,F2XM1
功能,ST?2(ST)-1,其中 (ST)=X
6) FCOS/FSIN——计算余弦或正弦
形式,FCOS/FSIN
功能:求栈顶 ST中角度的正弦或余弦值,ST中存
放的是弧度,运算结果也存于 ST。
退 出
3.9.3
7) FSINCOS—计算正弦和余弦
形式,FSINCOS
功能:求栈顶 ST中角度的正弦和余弦值,ST中存放的是弧
度。运算结果,ST?正弦值,ST(1) ?余弦值。
5,置实常数指令
80?87设置了 7个置实常数指令,所置的 7个常数是实
数运算中较常出现的,这些指令可节省内存空间,提高计
算的精度和速度,它们也方便了程序设计。
1) FLDZ—置实数 0指令
形式,FLDZ
功能,ST?+0.0
2) FLD1—置实数 1指令
形式,FLD1
功能,ST?+1.0
退 出
3.9.3
3) FLDPI—置 π指令
形式,FLDPI
功能,ST?π
4) FLDL2E—置 log2E指令
形式,FLDL2E
功能,ST=Log2E
5) FLDLN2—置 logE2指令
形式,FLDLN2
功能,ST? loge2
6) FLDLG2—置 log102指令
形式,FLDLG2
功能,ST? Log102
7) FLDL2T——置 log210指令
形式,FLDL2T
功能,ST? log210
退 出
3.9.4 算术协处理器的编程
例 3-21编写下列求 Y的程序,Y=(x2+xF(x))? F(x2)
其中,F(x)=Ax3+Bx2+Ex+D,X=2.5432,A=6.0,
B=4.0,E=2.0,D=5.0
分析, 通过编写子程序,完成 F(x)的计算,通过
x2F(x2)+ xF(x)? F(x2)计算 Y值。
例 3-22求 LC电路谐振频率,公式为,F=
分析:首先求出 LC,然后对其开平方根,再乘
以 2?,求其倒数。
退 出
LC?2
1
第十节 CPU扩展指令集( 2)
CPU的指令集分为基本指令集和扩展指令集。
从现阶段的主流体系结构讲,基本指令集可分为复
杂指令集和精简指令集两部分。扩展指令集可分为
多媒体指令集、单指令多数据流扩展指令集,SSE2
和 AMD的 3DNow!等,它们分别增强了 CPU的多媒
体、图形图像和 Internet等的处理能力。
退 出
3.10.1 复杂指令集与精简指令集
CISC即复杂指令系统计算机,从 PC诞生以来,
人们一直沿用 CISC指令集方式,它的指令不等长,
指令的条数比较多,编程和设计处理器时都较为麻
烦。
RISC体系结构的基本思路是:抓住 CISC指令系
统指令种类太多、指令格式不规范、寻址方式太多
的缺点,通过减少指令种类、规范指令格式和简化
寻址方式,方便处理器内部的并行处理,让计算机
的结构更为简单,提高 VLSI器件的使用效率,从而
大幅度地提高处理器的性能。
退 出
3.10.2 CPU的扩展指令集
对于 CPU来说,在基本功能方面,它们的差别
并不太大,基本的指令集也都差不多,但是许多厂
家为了提升某一方面性能,又开发了扩展指令集,
扩展指令集定义了新的数据和指令,能够大大提高
某方面数据处理能力,。
1,MMX 指令集
MMX是 Intel公司在 1996年为增强 Pentium CPU
在音像、图形和通信应用方面而采取的新技术,为
CPU增加了 57条 MMX指令。
退 出
3.10.2
浮点部件寄存器堆主要由 8个 80位的寄存器组成,每
个寄存器还附加了两个目标位。 MMX实际上只是使用了
它们的 64位尾数段,所以每个 MMX寄存器都是 64位宽,
并标记为 MM7?MM0。 MMX所能处理的数据类型是,8个
连续的 8字节,4个连续的 16位字,以及 2个连续的 32位双
字。
MMX技术的指令包括算术运算、比较、转换、逻辑
运算、移位以及数据传送等指令。它们与传统指令的最大
不同是:一条指令的操作数中实际上包含有多个经组合的
数据。例如 64位寄存器中存放的一般不是一个真正的 64位
二进制数据,可能是 8个字节数据,或者 4个字数据,或者
2个双字数据。这样,一条指令就可以实现处理多个数据
的目的。
退 出
3.10.2
例 3-23 将两幅视频图像相加而合成另一幅新的视频图像。
传统的 SISD设计的程序流程分为以下几个步骤:
步骤 1,从内存中读取第 1幅图像的第 X数据;
步骤 2,与内存中第二幅图像的第 X数据进行运算;
步骤 3,将运算结果保存到内存中,作为新图像的第 X
个数据;
步骤 4,将指针 X指向下一个数据。重复前 3步,直至
生成完整的新图像为止。
当现实的图像分辨率为 1024?768的 24位真彩色时,
每屏有 786432个像素点,需要 2359296( 786432?3)字
节的显存。也就是说上述过程要重复 2359296次。再者,
倘若还要求显示器以 85Hz的刷新率(场频)显示合成图
像,也就是每秒要重复上述过程 200,540,160
( 2359296?85)次。可以估算出,上述这种处理办法对
CPU该有多重的负担 ?
退 出
3.10.2
MMX的 SIMD处理不仅成倍地提高了处理的速率,而
且使处理过程更贴近目标对象的实际情况。采用单指令多
数据处理技术后,上述过程的操作可改进为:
步骤 1,从内存中读取第 1幅图像的 8个字节数据到一
个 MXX寄存器;
步骤 2,从内存中读取第 2幅图像的 8个字节数据到另
一个 MXX寄存器;
步骤 3,将这两个 MMX寄存器中的 8个字节对应相加,
结果存入其中的一个 MXX寄存器;
步骤 4,将 MMX寄存器的结果写入内存的 8个单元,
形成新图像的 8个数据。
步骤 5,将指针指向下一组的 8个单元。重复前 4步,
直至生成完整的新图像为止。
退 出
3.10.2
2,SSE指令集
SSE指令集是 Intel在 Pentium III处理器中率先推出的。
SSE指令集包括了 70条指令,其中包含提高 3D图形运算
效率的 50条 SIMD浮点运算指令,12条 MMX 整数运算增
强指令,8条优化内存中连续数据块传输指令。
在后来 Intel为了应对 AMD的 3Dnow!指令集,又在 SSE的
基础上开发了 SSE2,增加了一些指令,使得其 P4处理器
性能有大幅度提高。到 P4设计结束为止,Intel增加了一套
包括 144条新建指令的 SSE2指令集。
3,3D Now !指令集
由 AMD公司提出的 3DNow!指令集应该说出现在 SSE
指令集之前,并被 AMD广泛应用于其 K6-2, K6-3以及
Athlon( K7)处理器上。 3DNow!指令集技术其实就是 21
条机器码的扩展指令集。
3DNow!指令集主要针对三维建模、坐标变换 和效果渲染
等三维应用场合,在软件的配合下,可以大幅度提高 3D
处理性能。
退 出
第十一节 Win32汇编语言的编程
退 出
3.11.1 Win32 可执行文件的开发过程
以使用 MASM32软件包为例,通过如 图 3.27
所示的 Win32 汇编开发软件的流程,程序员要做
的工作分创建代码和创建资源两部分。
3.11.2 Win32汇编源程序的结构
任何种类的语言,总是有基本的源程序结构规
范,下面我们通过一个简单的程序来说明 Win32汇编
程序的结构。
例 3-24编程序实现弹出一个消息框,在上面显示了
一句,Hello,Win32汇编!”,并在文字的下面显
示了一个“确定”按钮,就停在那里了,当用户按
下“确定”按钮,程序就退出了,同时消息框消失。
退 出
3.11.2
一、模式定义
程序的第一部分是模式和源程序格式的定义语句:
.386
.model flat,stdcall
option casemap:none
这些指令定义了程序使用的指令集、工作模式和格式。
二、段的定义
.data
<一些字符串、变量定义 >
.code
<代码 >
<开始标号 >
<其它语句 >
end 开始标号
退 出
伪指令
分支结构的伪指令书写格式与高级语言的书写方式相
类似,汇编程序在汇编时会自动增加转移指令和相应的标
号。分支伪指令的具体形式如下:
形式 1:
.IF condition
指令序列 ;条件,condition” 成立时所执行的指令序列
.ENDIF
形式 2:
.IF condition;条件,condition” 成立时所执行的指令序

指令序列 1 ;条件,condition” 成立时所执行的指令序列
.ELSE
指令序列 2 ;条件,condition” 不成立时所执行的指令序列
.ENDIF
退 出
伪指令
形式 3:
.IF condition1
指令序列 1 ;条件,condition1” 成立时所执行的指令序列
.ELSEIF condition2
指令序列 2 ;条件,condition2” 成立时所执行的指令序列
.ENDIF
其中:条件表达式,condition” 的书写方式与 C语言
中条件表达式的书写方式相似,也可用括号来组成复杂的
条件表达式。
条件表达式中可用的操作符有,==(等于 ),!=(不等 )、
>(大于 ),>=(大于等于 ),<(小于 ),<=(小于等于 ),&(位
操作与 ),!(逻辑非 ),&&(逻辑与 ),||(逻辑或 )等。
若在条件表达式中检测标志位的信息,则可以使用的
符号名有,CARRY?(相当于 CF==1),OVERFLOW?(OF==1)、
PARITY?(PF==1),SIGN?(SF==1),ZERO?(ZF==1)等。
退 出
伪指令
例 3-12 利用分支伪指令改写例 3-10。
分析:我们只需用分支伪指令取代测试指令及
判断指令即可。
返 回
Masm6.11
在宏汇编 MASM 6.11系统中,还增加了表达循环结构
的伪指令,以便更清晰地表达 WHILE循环,REPEAT-
UNTIL循环。另外,还增加两个辅助循环的伪指令。这些
伪指令的书写格式和含义与高级语言中相应语句的书写格
式和含义相一致,所以,这些伪指令是很容易掌握的,也
是非常有用的
形式 1:
.WHILE condition
循环体的指令序列 ;条件,condition‖成立时所执

的指令序列
.ENDW
形式 2:
.REPEAT,REPEAT
循环体的指令序列 循环体的指令序列
.UNTIL condition,UNTILCXZ [condition]退 出
Masm6.11
REPEAT型循环在执行完循环体后,才判定逻辑表达式
condition的值。若该表达式的值为真,则终止该循环,
并将执行伪指令,UNTIL或,UNTIL[CXZ]后面的指令,否则,
将向上跳转到伪指令,REPEAT之后的指令,为继续执行其
循环体作准备。
如果,UNTILCXZ后面没有写逻辑表达式,那么,
由,REPEAT-,UNTILCXZ所构成的循环与用 LOOP指令所过程
的循环是一致的,它们都是以,CX=0” 为循环终止条件。
如果,UNTILCXZ后面书写了逻辑表达式,那么,该逻
辑表达式的形式只能是:,EXP1==EXP2” 或
,EXP1!=EXP2” 。所以,这时由,.REPEAT-,UNTILCXZ
condition” 所构成的循环就与用 LOOPNE/LOOPE指令所过
程的循环是一致的,它们都是以,condition || CX=0”
为循环终止条件。
和高级语言的 REPEAT型的循环一样,.REPEAT
-,UNTIL[CXZ]的循环体也会至少被执行一次。
退 出
Masm6.11
.WHILE-,ENDW和,REPEAT-,UNTIL[CXZ]的循环体内
还可再含有循环伪指令,这样就构成了循环结构的嵌套。
例 3-14利用循环伪指令改写例 3-12。
分析:我们只需用伪指令取代 loop指令即可,这样可
以取消显式的标号。
另外,像 C语言一样与还设置了两条辅助的循环伪指令:
终止循环伪指令,其形式如下:
.BREAK
.BREAK,IF condition
该伪指令用来终止包含它的最内层循环。前者是无条
件终止循环,后者是仅当逻辑表达式 condition为真时,才
终止循环。其使用场合如下:
退 出
Masm6.11
.WHILE 1,REPEAT
… …
.BREAK,IF condition,BREAK,IF condition
… …
.ENDW,UNTIL 0
对于以上二个循环,如果没有指令来终止循环的话,
它们都将进入死循环状态,但如果在该层循环体内,存在
伪指令,.BREAK,IF condition‖的话,那么,当逻辑表达
式 condition为真时,该循环就会被终止了。
循环继续伪指令,其形式如下:
.CONTINUE
.CONTINUE,IF condition
退 出
Masm6.11
该伪指令用于直接跳转到包含它的最内层循环的判断
循环条件表达式的代码处。前者是无条件转移到判断循环
条件表达式的代码处,后者是仅当条件表达式 condition为
真时,才进行这样的跳转。
辅助循环伪指令,BREAK和,CONTINUE只能在伪指
令,WHILE-,ENDW和,REPEAT-,UNTIL的循环体内使用。
例 3-15 显示 9个数字字母 '1'~'9',26个大写字母,和显示
任意输入的数字字符,并用按“回车”键来结束本程序的
运行
分析:利用第一个循环伪指令完成 '1'~'9'显示;利用
第二个循环完成大写字母的显示;利用第三个循环完成任
意数字的显示,并监视“回车”键结束循环。
返 回
图 3.1 编译语言指令翻译为机器指令的示意图
退 出
? ? ?
M O V A L,1 6
A D D A L,4
M O V A D D 6,A L
? ? ?
汇 编 程 序
? ?
B 0 1 0 H
0 4 0 4 H
A 2 0 6 0 0 H
? ?
汇 编 语 言 源 程 序 机 器 指 令 序 列
图 3, 1 汇 编 语 言 指 令 翻 译 为 机 器 指 令 的 示 意 图
图 3.2 图 3.3
需存放的数据
内存单元 ADRR 内存单元 ADRR+1 内存单元 ADRR+2 内存单元 ADRR+3
退 出
31 24 23 16 15 8 7 0
图 3.2 Big-Endian格式的存储格式
31 24 23 16 15 8 7 0
需存放的数据
内存单元 ADRR+3 内存单元 ADRR+2 内存单元 ADRR+1 内存单元 ADRR
图 3.3 Little-Endian格式的存储格式
表 3.2 二进制数码的不同含义 退 出
含义


进制
(二进
制)
无符号二
进制数
有符号二
进制数
分离式
BCD码
组合式
BCD码 ASCII码
53
( 01010011)
83 +83 3 53 S
07
( 00001001)
7 +7 7 07 BEL
C6
( 00110110)
198 -58 9 / /
AB
( 10101011)
171 -85 / / /
内存分配图
退 出
图 3.4
退 出
E n g l i s h
NO CNAME SCORE
图 3.4 结构类型 COURSE的字段分布示意图
图 3.5
退 出
bVar wVar dVar
图 3.5 共用体类型的字段分布图
图 3.6 图 3.7
退 出
2 3









A BA L
3 0 0 0 0
2 0 0 0
B P
S S
3 2 0 0 0
A B
3 2 0 0 0
2 3









2 3A L
2 0 0 0 0
1 0 0 0
S I
D S
2 1 0 0 0
2 1 0 0 0
图 3, 6 用 S I 寄 存 器 间 接 寻 址 图 3, 7 用 B P 寄 存 器 间 接 寻 址
图 3.8 图 3.9
退 出
2 3









2 0A L
3 0 0 0 0
2 0 0 0
B P
S S
3 3 0 0 0
3 3 0 0 1
5 F









5 FA L
2 0 0 0 0
1 0 0 0
S I
D S
2 1 1 0 0
2 1 1 0 0
图 3, 8 寄 存 器 相 对 寻 址 方 式 图 3, 9 基 址 加 变 址 寻 址 方 式
5 0
3 3 0 0 0
2 0
5 0
1 0 0 0
S I
c o u n t
0 1 0 0
图 3.10相对基址加变址寻址方式
退 出
8 9









5 3B X
2 0 0 0 0
2 0 0 0
B X
D S
2 3 2 5 0
2 3 2 5 1
图 3, 1 0 相 对 基 址 加 变 址 寻 址 方 式
8 9
2 3 2 5 0
2 0
5 0
1 0 0 0
S I
5 3
0 2 5 0
M A S K
图 3.11 图 3.12 图 3.13
退 出
x x 0 6
0 6
x x
x x 0 6
0 6
x x



S S, 0 1 F F H
S P = 0 2 0 0 H
S S, 0 0 0 0 H
S P = 0 1 F E H
S S, 0 1 F F H
S S, 0 0 0 0 H
S S, 0 1 F F H
S P = 0 2 0 0 H
S S, 0 0 0 0 H
图 3, 1 1 堆 栈 的 定 义 图 3, 1 2 P U S H A X 进 栈 操 作 图 3, 1 3 P O P A X 出 栈 操 作
S S, 0 2 0 0 H
S S, 0 1 F E H
A X
A X
图 3.14 图 3.15
退 出
逻辑移位
算术移位
小循环移位
大循环移位
左右移指令
循环移位指令
移位类指令
图 3.14 移位类指令分类
CF 高位 操作数 低位
图 3.15 左移指令示意图
图 3.16
退 出
CF高位 操作数 低位
图 3.16 右移指令示意图
图 3.17
退 出
CF高位 操作数 低位
图 3.17 算术右移示意图
图 3.18
退 出
高位 操作数 低位 CF
图 3.18 不带进位循环左移示意图
图 3.19
退 出
高位 操作数 低位 CF
图 3.19 不带进位循环右移示意图
图 3.20
退 出
高位 操作数 低位 CF
图 3.20 带进位循环左移示意图
图 3.21
退 出
高位 操作数 低位 CF
图 3.21 带进位循环右移示意图
表 3.3 条件汇编伪指令 退 出
伪指令 汇编条件
IF 1 在第一遍扫描时
IF 2 在第二遍扫描时
IF 表达式 表达式不等于 0
IFE 表达式 表达式等于 0
IFDEF 符号 符号已定义
IFNDEF 符号 符号未定义
IF 变量 变量是空格
IFNB 变量 变量不是空格
IFIDN 变量 1,变量 2 变量 1和变量 2相同
IFNIDN变量 1,变量 2 变量 1和变量 2不相同
图 3.24 80x87算数协处理器的内部结构
退 出
控 制 寄 存 器
状 态 寄 存 器
总 线 跟 踪
异 常 指 示
数 据
缓 冲

数 据
状 态
地 址
指 令 译 码 器
操 作 数 队 列
阶 码 模 块
临 时 寄 存 器
阶 码 模 块
移 位 器





( 1 )
( 2 )
( 3 )
( 4 )
( 5 )
( 6 )
( 7 )
( 8 )
图 3, 2 4 8 0 X 8 7 算 术 协 处 理 器 的 内 部 结 构
控 制 单 元 ( C U ) 数 值 执 行 部 件 ( N E U )
图 3.24 80x87协处理器的状态寄存器示意图
退 出
15 13 12 11 8 7 0
B C3 TOP C2 C1 C0 ES SF PE UE OE ZE DE IE
图 3.24 80x87协处理器的状态寄存器示意图
图 3.25
退 出
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IC RC PC P
M
U
M
OM ZM DM IM
图 3.25 80x87协处理器的状态寄存器示意图
图 3.26
退 出
15 13 11 9 7 5 3 1
TAG(7) TAG(6) TAG(5) TAG(4) TAG(3) TAG(2) TAG(1) TAG(0)
图 3.26 标记寄存器结构示意图
表 3.4 状态寄存器中条件编码位的组合含义 退 出
指 令 C3 C2 C1 C0 功 能
FTST,FCOM
0 0 ? 0 ST>操作数或 (0 FTST)
0 0 ? 1 ST<操作数或 (0 FTST)
1 0 ? 0 ST=操作数或 (0 FTST)
1 1 ? 1 ST不可比较
FPREM
Q1 0 Q0 Q2 Q2Q1Q0是商的右边 3位
1 未完成
FXAM
0 0 0 0 +unnormal
0 0 0 1 +NAN
0 0 1 0 -unnormal
0 0 1 1 -NAN
0 1 0 0 +normal
0 1 0 1 +∞
0 1 1 0 -unnormal
0 1 1 1 -∞
1 0 0 0 +0
1 0 0 1 空
1 0 1 0 -0
1 0 1 1 空
1 1 0 0 +denormal
1 1 0 1 空
1 1 1 0 -denormal
1 1 1 1 空
图 3.27 Win32可执行文件的开发过程
退 出
文 本 编 辑 器
输 入 源 程 序
预 定 义 头 文 件
W i n d o w s, i n c
汇 编 源 文 件
*, a s m
A P I 声 明 头 文 件
W i n d o w s, i n c
汇 编 编 译 器
M 1, e x e
目 标 文 件
*, o b j
资 源 编 译 器
R c, e x e
资 源 文 件
*, r e s
汇 编 编 译 器
M 1, e x e
导 入 库 文 件
*, l i b
代 码 创 建 资 源 创 建
预 定 义 头 文 件
W i n d o w s, i n c
汇 编 源 文 件
*, a s m
位 图 *, b m p
图 标 *, i c o
光 标 *, c u r
声 音 *, w a b
图 3, 2 7 W i n 3 2 可 执 行 文 件 的 开 发 过 程
知 识 概 述
? 基本概念:机器指令,数据在内存中的存储格
式,汇编程序,操作符,伪操作符,
名字,常数,表达式
? 重点:汇编语言及高级语言的特点,Intel芯片的
存储惯例,汇编语言的上机步骤,汇编语
言的符号
? 难点:属性常数,合法的表达式
退 出