登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』汇编语言程序设计教程(第4版)

書城自編碼: 2918666
分類: 簡體書→大陸圖書→教材研究生/本科/专科教材
作者: 卜艳萍、周伟
國際書號(ISBN): 9787302437420
出版社: 清华大学出版社
出版日期: 2016-11-01
版次: 4 印次: 1
頁數/字數: 323/508000
書度/開本: 16开 釘裝: 平装

售價:NT$ 296

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
智慧宫丛书026·增长:从细菌到帝国
《 智慧宫丛书026·增长:从细菌到帝国 》

售價:NT$ 840.0
从自察到自救:别让情绪偷走你的人生
《 从自察到自救:别让情绪偷走你的人生 》

售價:NT$ 420.0
晚明的崩溃:人心亡了,一切就都亡了!
《 晚明的崩溃:人心亡了,一切就都亡了! 》

售價:NT$ 335.0
俄国女皇:叶卡捷琳娜二世传(精装插图版)
《 俄国女皇:叶卡捷琳娜二世传(精装插图版) 》

售價:NT$ 381.0
真想让我爱的人读读这本书
《 真想让我爱的人读读这本书 》

售價:NT$ 269.0
解套基本逻辑与六大战法
《 解套基本逻辑与六大战法 》

售價:NT$ 274.0
超级制造
《 超级制造 》

售價:NT$ 671.0
明朝270年:明朝的外交博弈和权力游戏
《 明朝270年:明朝的外交博弈和权力游戏 》

售價:NT$ 325.0

建議一齊購買:

+

NT$ 293
《 管理信息系统 》
+

NT$ 280
《 汇编语言程序设计教程(第三版)(21世纪高等学校计算机基础实用规划教材) 》
+

NT$ 475
《 园林树木学(修订版)高等院校园林与风景园林专业规划教材 》
+

NT$ 419
《 医学遗传学(第六版/本科临床/十二五规划教材) 》
+

NT$ 646
《 影响力:教材版(原书第5版)(升级版,2倍案例,孙路弘全程导读) 》
編輯推薦:
充分考虑微型机技术的发展、教学方法的完善以及教学手段的改进等因素,系统地介绍微机原理的基础知识及汇编语言程序设计的方法和技术。
提供大量的例程分析,帮助学生掌握汇编语言程序设计的步骤和方法。
提供汇编语言程序设计上机实验指导、实例分析及学生上机练习作业的要求。
每章均有思考与练习题,可以作为巩固相关知识的课后作业。
內容簡介:
本书以IBM PC机型和80x86指令系统为对象,全面而系统地介绍微型计算机系统的结构及汇编语言程序设计的方法。全书由10章组成。第1章和第2章介绍汇编语言基础知识和微型计算机的体系结构; 第3章详细介绍IBM PC的寻址方式和指令系统; 第4章介绍伪指令、汇编语言程序格式等知识; 第5章讲述典型汇编语言程序结构的设计方法; 第6章详细介绍子程序设计及参数传递的方法; 第7章介绍输入输出程序设计技术和方法; 第8章介绍宏汇编、重复汇编和条件汇编等高级汇编技术; 第9章讲述DOS功能调用和BIOS功能调用知识; 第10章是汇编语言上机环境及程序设计实例分析。
本书可作为普通高等院校本科和应用型本科计算机及相关专业学生的教学用书,也可作为从事计算机应用的工程技术人员的参考用书。
目錄
目录
第1章汇编语言基础知识
1.1计算机基础知识
1.1.1计算机的发展史
1.1.2计算机的特性
1.1.3计算机的分类与应用
1.1.4计算机的主要技术指标
1.2计算机的基本结构与组成
1.2.1计算机的硬件
1.2.2计算机的软件
1.2.3计算机的程序设计语言
1.2.4计算机系统的层次结构
1.3计算机中的数制与码制
1.3.1数制及数制转换
1.3.2机器数的编码
1.3.3定点数与浮点数
1.3.4码制
思考与练习
第2章微型计算机体系结构
2.180x86微处理器
2.1.180868088的功能结构
2.1.280868088的寄存器组织
2.1.380868088的存储器组织
2.1.480x86微处理器的发展
2.2IA32 CPU
2.2.1IA32 CPU功能结构
2.2.2IA32 CPU寄存器组
2.2.3IA32 CPU存储器管理
2.3先进的微处理器
2.3.1高档Pentium微处理器
2.3.2迅驰技术
2.3.3多核技术
2.3.4专用微处理器
2.3.5微处理器领域的架构革命
思考与练习
第3章微型计算机的指令系统
3.1寻址方式
3.1.1操作数的种类
3.1.280868088的机器代码格式
3.1.3与数据有关的寻址方式
3.1.4与转移地址有关的寻址方式
3.280868088指令系统
3.2.1数据传送类指令
3.2.2算术运算类指令
3.2.3逻辑操作类指令
3.2.4程序控制类指令
3.2.5串操作类指令
3.2.6处理器控制类指令
3.2.7输入输出类指令
3.380x86指令系统介绍
3.3.180x86寻址方式
3.3.280286指令系统新增指令
3.3.380386指令系统新增指令
3.3.480486指令系统新增指令
3.3.5Pentium指令系统新增指令
思考与练习
第4章伪指令与汇编语言程序结构设计
4.1汇编语言语句类型和格式
4.2伪指令
4.2.1表达式赋值伪指令
4.2.2数据定义伪指令
4.2.3LABEL伪指令
4.2.4段定义伪指令
4.2.5简化段定义伪指令
4.2.6过程定义伪指令
4.2.7模块命名、通信等伪指令
4.3汇编语言源程序结构
4.3.1完整段定义结构
4.3.2简化段定义结构
4.3.3程序段前缀结构
4.3.4可执行程序结构
思考与练习
第5章汇编语言程序设计
5.1汇编语言程序设计概述
5.2顺序程序设计
5.3分支程序设计
5.3.1双分支结构程序设计
5.3.2多分支结构程序设计
5.4循环程序设计
5.4.1简单循环程序设计
5.4.2多重循环程序设计
思考与练习
第6章子程序设计
6.1子程序的定义与调用
6.1.1子程序的定义
6.1.2子程序的调用
6.2子程序的参数传递方法
6.2.1通过寄存器传递参数
6.2.2通过堆栈传递参数
6.2.3通过内存单元传递参数
6.3子程序的嵌套与递归
6.3.1子程序的嵌套调用
6.3.2子程序的递归调用
思考与练习
第7章输入输出程序设计
7.1微机接口技术概述
7.2输入输出的控制方式
7.2.1程序查询传送方式
7.2.2中断传送方式
7.2.3DMA传送方式
7.3输入输出综合应用程序举例
思考与练习
第8章高级汇编技术
8.1宏汇编
8.1.1宏定义与宏调用
8.1.2宏汇编实例分析
8.1.3宏嵌套
8.2重复汇编与条件汇编
8.2.1重复汇编
8.2.2条件汇编
8.3复杂数据结构
8.3.1结构
8.3.2记录
8.4模块化程序设计
8.4.1宏库的使用
8.4.2源程序的包含文件
8.4.3目标代码文件的连接
思考与练习
第9章DOSBIOS功能调用
9.1概述
9.2DOS功能调用
9.2.1DOS功能调用概述
9.2.2DOS功能调用程序实例
9.3BIOS功能调用
9.3.1BIOS功能调用概述
9.3.2BIOS功能调用程序实例
9.3.3显示器BIOS中断服务
9.4综合应用程序设计举例
思考与练习
第10章汇编语言上机环境及程序设计实例
10.1汇编语言程序设计上机实验相关知识
10.1.1汇编程序
10.1.2DEBUG命令的使用
10.1.3汇编错误信息
10.2微型计算机操作系统介绍
10.2.1微型机操作系统MSDOS
10.2.2微型机操作系统Windows
10.3程序设计实例分析及实验任务
10.3.1顺序程序设计
10.3.2分支程序设计
10.3.3循环程序设计
10.3.4子程序设计
10.3.5系统功能调用
10.4调试程序CodeView的使用
10.5汇编语言与CC的混合编程
10.6软件逆向工程与反汇编
思考与练习
附录ADOS功能调用(INT 21H)
附录BBIOS功能调用
附录C80x86指令系统一览表
参考文献
內容試閱
前言
计算机技术及电子技术的迅猛发展,使得人们的学习、工作、生活越来越离不开计算机,计算机知识及其应用技能已经成为人类知识结构的重要组成部分。微型计算机技术的发展,不断涌现新技术、新产品。本书以IBM PC作为背景,系统地介绍微机原理的基础知识及汇编语言程序设计的方法和技术。本次再版在前三版《汇编语言程序设计教程》的基础上,修改并增加了部分内容。在教材编写过程中,参照了国内多所高校本科汇编语言程序设计课程的教学大纲,兼顾相关专业的教学要求和特点,并充分考虑到了微型机技术的发展、教学方法的完善以及教学手段的改进等因素。全书共分10章。第1章和第2章介绍汇编语言基础知识和微型计算机的体系结构; 第3章详细介绍IBM PC的寻址方式和指令系统; 第4章介绍伪指令、汇编语言程序格式等知识; 第5章讲述典型汇编语言程序结构的设计方法; 第6章详细介绍子程序设计及参数传递的方法。第7章介绍输入输出程序设计技术和方法; 第8章介绍宏汇编、重复汇编和条件汇编等高级汇编技术; 第9章讲述DOS功能调用和BIOS功能调用知识,通过大量程序设计实例分析系统功能调用的实现; 第10章是汇编语言上机环境及程序设计实例分析,给出学生上机练习的要求。本书每章后均有思考与练习,可以作为巩固相关知识的课后作业。第5~10章有大量的例程分析,以帮助学生掌握汇编语言程序设计的步骤和方法。在附录部分提供了DOS功能调用、BIOS功能调用和80x86指令系统的汇总,供读者学习过程中查阅。本书由上海交通大学卜艳萍老师和华东理工大学周伟老师共同编著。周伟编写第5~8章、第10章和附录A。卜艳萍编写第1~4章、第9章、附录B和附录C,并负责全书的统稿工作。由于编者水平有限及时间仓促,书中不妥之处,敬请读者批评指正。作者联系邮箱: ypbu@sjtu.edu.cn。
作者2016年5月


第3章微型计算机的指令系统
计算机是通过执行指令序列来解决问题的,每种计算机都有一套指令集合供用户使用。在微型计算机中,微处理器能执行的各种指令的集合称为指令系统。微处理器的主要功能是由它的指令系统来体现的。在其他条件相同的情况下,指令系统越强,机器的功能也就越强。不同的微处理器有不同的指令系统,其中每一条指令对应着处理器的一种基本操作。计算机只能识别由二进制编码表示的指令,称为机器指令。一条机器指令应包含两部分内容,其一般格式为:
操作码操作数
操作码部分指出此指令要完成何种操作; 操作数部分则指出参与操作的对象是什么。在指令中可以直接给出操作数的值或者操作数存放在何处,操作的结果应送往何处等信息。处理器可根据指令字中给出的地址信息求出存放操作数的地址,称为有效地址Effective Address,EA,然后对存放在有效地址中的操作数进行存取操作。3.1寻 址 方 式根据操作数的种类,80868088指令系统的寻址方式分为两大类: 数据寻址方式和转移地址寻址方式。3.1.1操作数的种类在80868088指令系统中,操作数可分为数据操作数和转移地址操作数两大类。1. 数据操作数数据操作数是指指令中操作的对象是数据。数据操作数的类型有以下几种。(1) 立即数操作数: 指令中要操作的数据在指令中。(2) 寄存器操作数: 指令中要操作的数据存放在指定的寄存器中。(3) 存储器操作数: 指令中要操作的数据存放在指定的存储单元中。(4) IO操作数: 指令中要操作的数据来自或送到IO端口。对于数据操作数,有的指令只有一个操作数或没有操作数。而有的指令有两个操作数,一个称为源操作数,在操作过程中保持原值不变; 另一个称为目标操作数,操作后一般被操作结果所替代。另外,还有一种隐含操作数。这种操作数从指令格式上看,好像是没有操作数,或只有一个操作数,实际上隐含了一个或两个操作数。2. 地址操作数地址操作数是指指令中操作的对象是地址。其指令只有一个目标操作数,该操作数不是普通数据,而是要转移的目标地址。它也可以分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元之中。3.1.280868088的机器代码格式80868088 CPU的机器代码格式如图3.1所示。
12字节01字节012字节012字节
操作码mod reg rm位移量立即数
图3.180868088的机器代码格式
操作码占1或2字节,后面的各字节指明操作数。其中,mod reg rm字节表明寻找操作数的方式即采用的寻址方式,位移量字节给出某些寻址方式需要的相对基地址的偏移量,立即数字节给出立即寻址方式需要的数值本身。由于设计有多种寻址方式,操作数的各个字段有多种组合,表3.1给出了各种组合情况。
表3.180868088指令的寻址方式字节编码
rm
mod
000110
11
w=0w=1reg
000[BX SI][BX SI D8][BX SI D16]ALAX000001[BX DI][BX DI D8][BX DI D16]CLCX001010[BP SI][BP SI D8][BP SI D16]DLDX010011[BP DI][BP DI D8][BP DI D16]BLBX011100[SI][SI D8][SI D16]AHSP100101[DI][DI D8][DI D16]CHBP101110[D16][BP D8][BP D16]DHSI110111[BX][BX D8][BX D16]BHDI111
80868088指令最多可以有两个操作数。在mod reg rm字节中,reg字段表示一个采用寄存器寻址的操作数,reg占用3位,不同编码指示8个8位w=0或16位w=1通用寄存器之一; mod和rm字段表示另一个操作数的寻址方式,分别占用2位或3位。(1) mod =00时为无位移量的存储器寻址方式。但其中,当rm =110时为直接寻址方式,此时该字节后跟16位有效地址D16。(2) mod =01时为带有8位位移量的存储器寻址方式。此时该字节后跟一个字节,表示8位位移量D8,它是一个有符号数。(3) mod =10时为带有16位位移量的存储器寻址方式。此时该字节后跟两个字节,表示16位位移量D16,它也是一个有符号数。(4) mod =11时为寄存器寻址方式,由rm指定寄存器,此时的编码与reg相同。3.1.3与数据有关的寻址方式指令中关于如何求出存放操作数有效地址的方法称为操作数的寻址方式。计算机按照指令给出的寻址方式求出操作数有效地址和存取操作数的过程,称为寻址操作。在微机中,寻址方式可能有如下3种情况。(1) 操作数包含在指令中,称为立即寻址。(2) 操作数包含在CPU的内部寄存器中,称为寄存器寻址。(3) 操作数在内存的数据区中,这时指令中的操作数字段包含着此操作数的地址,称为存储器寻址。为了更清楚地掌握寻址方式,下面以最常用的MOV指令来举例说明各种寻址方式的功能。MOV指令是一个数据传送指令,相当于高级语言的赋值语句,其格式为:
MOVOPRD1,OPRD2
MOV指令的功能是将源操作数OPRD2传送至目的操作数OPRD1。在讲述中,假设目的操作数采用寄存器寻址方式,用源操作数来反映各种寻址方式的功能和彼此的区别。1. 立即数寻址方式立即数寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。立即数寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。【例3.1】将8位立即数18存入寄存器AL中。
MOVAL,18
指令执行后,AL= 12H
图3.2立即数寻址方式示意图
【例3.2】将16位立即数8090H存入寄存器AX中。
MOVAX,8090H
图3.2给出了立即数寻址方式示意图。指令执行后的结果为: AX= 8090H。2. 寄存器寻址方式在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等; 对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。这种寻址方式可以取得较高的运算速度。下列指令都属于寄存器寻址方式:
MOVDS,AX
MOVAL,CL
MOVSI,AX
MOVBL,AH
【例3.3】寄存器寻址方式的指令操作过程如下。
MOVAX,BX
如果指令执行前AX= 6688H,BX= 1020H; 则指令执行后,AX= 1020H,BX保持不变,图3.3给出了寄存器寻址方式示意图。3. 存储器寻址方式
图3.3寄存器寻址方式示意图
寄存器寻址虽然速度较快,但CPU中寄存器数目有限,不可能把所有参与运算的数据都存放在寄存器中。多数情况下,操作数还是要存储在主存中。如何寻址主存中存储的操作数称为存储器寻址方式,也称为主存寻址方式。在这种寻址方式下,指令中给出的是有关操作数的主存地址信息。由于80868088的存储器是分段管理的,因此这里给出的地址只是偏移地址即有效地址EA,而段地址在默认的或用段超越前缀指定的段寄存器中。为了方便各种数据结构的存取,80868088设计了多种主存寻址方式。1 直接寻址方式直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。把操作数的偏移地址称为有效地址EA,则物理地址=16DDS EA。如果数据存放在数据段以外的其他段中,则在计算物理地址时应使用指定的段寄存器。直接寻址方式适合于处理单个数据变量。【例3.4】直接寻址方式示例如下。
MOVAX,[400H]
如果DS= 1000H,则物理地址的计算式为:
图3.4直接寻址方式示意图
10000H段基地址400H偏移地址= 10400H物理地址图3.4给出了直接寻址方式示意图。指令执行后的结果为: AX= 1A2BH。也可以用符号地址代替数值地址,例如:
MOVAX,BUFFER
此时BUFFER为存放数据单元的符号地址。它等效于如下形式:
MOVAX,[BUFFER]
2 寄存器间接寻址方式在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。这又分成两种情况:如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址,即操作数的物理地址为:
物理地址 = 10H DS BX、SI或DI
如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段,所以操作数的物理地址为:
物理地址 = 10H SS BP
【例3.5】寄存器间接寻址方式示例如下。
MOVAX,[SI]
图3.5寄存器间接寻址方式示意图
如果DS=2000H,SI=1500H,则物理地址的计算式为:
20000H段基地址 1500H偏移地址
=21500H物理地址
图3.5给出了寄存器间接寻址方式示意图。指令执行后的结果为: AX= C5D6H。3 寄存器相对寻址方式该寻址方式是以指定的寄存器内容,加上指令中给出的位移量8位或16位,并以一个段寄存器为基准,作为操作数的地址。指定的寄存器一般是一个基址寄存器或变址寄存器。即:EA=
(BX)(BP)(SI)(DI)
8位
16位位移量与寄存器间接寻址方式类似,对于寄存器为BX、SI、DI的情况,段寄存器用DS,则物理地址为:
物理地址 = 10H DS BX、SI或DI8位或16位位移量
当寄存器为BP时,则使用SS段寄存器的内容作为段地址,此时物理地址为:
物理地址 = 10H SS BP8位或16位位移量
【例3.6】寄存器相对寻址方式示例如下。
MOVAX,DISP[DI]
也可表示为
MOVAX,[DISP DI]
其中DISP为16位位移量的符号地址。如果DS= 3000H,DI= 2000H,DISP = 600H,则物理地址的计算式为:
30000H段基地址2000H变址600H位移量 =32600H物理地址
图3.6给出了寄存器相对寻址方式示意图,指令执行后的结果是: AX= 005AH。
图3.6寄存器相对寻址方式示意图
4 基址加变址寻址方式在基址加变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器,可把两种方式组合起来形成一种新的寻址方式。基址加变址的寻址方式是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址。两个寄存器均由指令指定。当基址寄存器为BX时,段寄存器使用DS,则物理地址为:
物理地址 = 10H DS BX SI或DI
当基址寄存器为BP时,段寄存器用SS,此时物理地址为:
物理地址 = 10H SS BP SI或DI
【例3.7】基址加变址寻址方式示例如下。
MOVAX,[BX][DI]
或写为:
MOVAX,[BX DI]
如果DS= 1000H,BX= 2000H,DI= 3000H,则物理地址的计算式为:
10000H段基地址2000H基址3000H变址 = 15000H物理地址
图3.7给出了基址加变址寻址方式示意图。指令执行后的结果为: AX= 1288H。
图3.7基址加变址寻址方式示意图
5 相对基址变址寻址方式在相对基址变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器。它是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,再加上指令中给定的8位或16位位移量,并以一个段寄存器为地址基准,作为操作数的地址。同样,当基址寄存器为BX时,段寄存器使用DS,则物理地址为:
物理地址 = 10H DS BX SI或DI8位或16位位移量
当基址寄存器为BP时,段寄存器则用SS。此时物理地址为:
物理地址 = 10H SS BP SI或DI 8位或16位位移量
【例3.8】相对基址变址寻址方式示例如下。
MOVAX,DISP[BX][SI]
如果DS= 4000H,BX= 2000H,SI= 1000H,DISP = 800H,则物理地址的计算式为:EA =2000H基址 1000H变址 800H位移量=3800H
40000H段基地址3800HEA= 43800H物理地址
图3.8相对基址变址寻址方式示意图
图3.8给出了相对基址变址寻址方式示意图。指令执行后的结果为: AX= EEFFH。3.1.4与转移地址有关的寻址方式微机指令系统中有转移指令及子程序调用等非顺序执行指令。这类指令所指出的地址是程序转移到的指定的转移地址,然后再依次顺序执行程序。这种提供转移地址的方法称为程序转移地址的寻址方式。它分为段内直接寻址、段内间接寻址、段间直接寻址和段间间接寻址4种情况。在80868088指令系统中,条件转移指令只能使用段内直接寻址方式,且位移量为8位; 而非条件转移指令和子程序调用指令则可用4种寻址方式中的任何一种。1. 段内直接寻址这种寻址方式是将当前IP寄存器的内容和指令中指定的8位或16位位移量之和作为转向的有效地址。一般用相对于当前IP值的位移量来表示转向有效地址,所以它是一种相对寻址方式。当这一程序段在内存中的不同区域运行时,转移指令本身不会发生变化,这是符合程序的再定位要求的。这种寻址方式适用于条件转移及无条件转移指令,但是当它用于条件转移指令时,位移量只允许8位。指令格式:
JMPNEAR PTR ADDR1
JMPSHORT ADDR2
其中,ADDR1和ADDR2都是转向的符号地址,在机器指令中,用位移量来表示。2. 段内间接寻址段内间接寻址的转向有效地址是一个寄存器或一个存储单元的内容,并且可以用数据寻址方式中除立即数以外的任何一种寻址方式取得转向的有效地址。指令格式:
JMPBX
JMPWORD PTR [BP DISP]
其中,WORD PTR为操作符,用以指出其后的寻址方式所取得的转向地址是一个字的有效地址,也就是说它是一种段内转移。对于段内转移寻址方式,直接把求得的转移的有效地址送到IP寄存器就可以了。如果需要计算转移的物理地址,则应是:
物理地址 = 10H CSEA
其中,EA为转移的有效地址。下面的两个例子说明了在段内间接寻址方式的转移指令中有效地址的计算方法。假设:DS= 2000H,BX= 2000H,SI=3000H,25000H=3200H。【例3.9】指令如下。
JMPBX
则执行指令后
IP=2000H
【例3.10】指令如下。
JMP[BX][SI]
则执行指令后
IP=10HDS BX SI
=20000H 2000H 3000H
=25000H
= 3200H
3. 段间直接寻址这种寻址方式直接提供转向的段地址16位和偏移地址16位,所以需要32位的地址信息。只要用指令中指定的偏移地址取代IP寄存器的内容,用指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作。指令格式可表示为:
JMPFAR PTR ANOSEG
其中,ANOSEG为转向的符号地址,FAR PTR则是表示段间转移的操作符。4. 段间间接寻址为了达到段间转移,这种寻址方式是用存储器中的两个相继字的内容来取代IP和CS。内存单元的地址是由指令指定的除立即寻址和寄存器寻址方式以外的任何一种数据寻址方式取得。指令格式可表示为:
JMPDWORD PTR [DISP BX]
其中,[DISP BX]说明数据寻址方式为寄存器间接寻址方式,DWORD PTR为双字操作符,以满足段间转移地址的要求。3.280868088指令系统计算机的指令系统就是指该计算机能够执行的全部指令的集合。80868088指令系统的指令分为7类,即数据传送类、算术运算类、逻辑操作类、程序控制类、数据串操作类、处理器控制类以及输入输出类指令。在学习指令系统过程中,以下几个方面是需要注意的。(1) 掌握指令的功能: 该指令能够实现何种操作,通常指令助记符就是指令功能的英文单词或其缩写形式。(2) 分析指令支持的寻址方式: 该指令中的操作数可以采用何种寻址方式。(3) 清楚指令对标志位的影响: 该指令执行后是否对各个标志位有影响,以及如何影响。(4) 其他特征: 如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等。3.2.1数据传送类指令数据传送是计算机中最基本、最重要的一种操作。传送指令也是最常使用的一类指令,可以实现数据从一个位置到另一个位置的移动,如执行寄存器与寄存器之间、寄存器与主存单元之间的字或字节的多种传送操作。1. 数据传送指令指令格式:
MOVOPRD1,OPRD2
OPRD1为目的操作数,可以是寄存器、存储器、累加器。OPRD2为源操作数,可以是寄存器、存储器、累加器和立即数。本指令的功能是将一个8位或16位的源操作数字或字节送到目的操作数中,即OPRD1OPRD2,本指令不影响状态标志位。MOV指令可以分为以下4种情况。1 寄存器与寄存器之间的数据传送指令例如:
MOVAX,BX
MOVCL,AL
MOVDX,ES
MOVDS,AX
MOVBP,SI
代码段寄存器CS及指令指针IP不参加数的传送,其中CS可以作为源操作数参加传送,但不能作为目的操作数参加传送。2 立即数到通用寄存器的数据传送指令立即数只能作为源操作数使用,不能作目的操作数使用。例如:
MOVAL,25H
MOVBX,20A0H
MOVCH,5
MOVSP,2F00H
注意: 由于传送的数据可能是字节,也可能是字,源操作数与目的操作数的类型应一致,8位寄存器不能和16位寄存器之间传送数据。例如,25H送AL是允许的,2000H送AL是不允许的。在立即数参加传送的情况下,数据类型由寄存器确定。当立即数送至存储器时,不仅其类型应该一致,而且还应当用汇编语言的指示性语句或汇编运算符加以说明。3 寄存器与存储器之间的数据传送指令例如:
MOVAL,BUF
MOVAX,[SI]
MOVDISP[BX DI],DL
MOVSI,ES: [BP]
MOVDS,DATA[BX SI]
MOVDISP[BX DI],ES
第一条指令是将存储器变量BUF的值送至AL寄存器。BUF可以看成是存储数据的单元的符号名,实际上是符号地址,因为该地址单元中的数据是可变的,用BUF作为变量名是很合适的。如果是对字进行操作,应将指令改写成如下的形式:
MOVAX,BUF
这时汇编语言中在定义BUF变量时,要用DW伪指令将其定义为字类型变量,即在数据段中,用如下形式定义:
BUFDW1234H
这样,就可以使用MOVAX,BUF指令进行数据字的传送操作。该指令将从地址BUF开始的两个存储单元的数据送至AX中,即AX= 1234H。在数据段中,如果用伪指令DB将BUF变量定义为字节类型,但仍要对从BUF开始的单元进行数据字的传送,则应将指令写成如下形式:
MOVAX,WORD PTR BUF
其中PTR称为指针操作符。其作用是将BUF定义为新的变量类型。这个变量的起始地址没有改变,但已将BUF变量定义为字类型,因而指令能将一个数据字送至AX中。现在再来看第二条指令MOVAX,[SI],其中[SI]属于寄存器间接寻址,即由段寄存器DS与SI一起确定源操作数的物理地址。因为是数据字传送,所以该操作数与求出的物理地址指向的两个连续存储单元有关。
在指令MOVDISP[BX DI],DL中,目的操作数是存储器操作数,寻址方式是相对基址变址寻址,也可把它写作DISP[BX][DI]。汇编语言将对它们进行相同的处理,即有效地址EA = BX DI DISP。指令MOVSI,ES: [BP]有些特殊,源操作数是存储器操作数,其寻址方式是寄存器间接寻址。但没有按照事先的约定,BP与SS段寄存器结合,找到实际的物理地址。而用ES: [BP]告诉汇编程序: BP将与段寄存器ES结合,即EA =BP。与上述指令类似,指令MOVDS,DATA[BX SI]中的源操作数是存储器操作数,采用相对基址变址方式寻址,有效地址EA =BX SI DATA。MOVDISP[BX DI],ES中的目的操作数是存储器操作数,也是相对基址变址寻址,其有效地址为EA =BX DI DISP。由此可见,只有深刻理解指令中各操作数的寻址方式,才能正确理解指令的真正含义。同样要注意,寄存器IP不能参加数据传送,CS寄存器不能作为目的操作数参与数据传送。4 立即数到存储器的数据传送立即数只能作为源操作数,且一定要使立即数与存储器变量类型一致。存储器变量的类型可以在数据定义时指定,也可以在指令中另行指定,应保证其与立即数的类型一致。否则,汇编程序在汇编时,将指出类型不一致的错误。例如:
MOVBUF,25
MOVDS: DISP[BP],1234H
MOVBYTE PTR [SI],40
以上指令如能正确执行,则BUF变量应定义为字节类型,DISP[BP]所指的存储单元应定义为字类型。第三条指令中,用指针操作符PTR重新把[SI]所指的单元定义为字节类型。在编写汇编语言程序时,用BYTR PTR[SI]能告诉汇编程序,此处按字节类型处理,生成相应的指令代码。使用MOV指令传送数据,必须注意以下几点。(1) 立即数只能作为源操作数,不允许作目的操作数,立即数也不能送至段寄存器。(2) 通用寄存器可以与段寄存器、存储器互相传送数据,寄存器之间也可以互相传送数据。但是CS不能作为目的操作数。(3) 存储器与存储器之间不能进行数据直接传送。若要实现存储单元之间的数据传送,可以借助于通用寄存器作为中介来进行。【例3.11】要把DATA1单元的内容送至DATA2单元中,并假定这两个单元在同一个数据段中,可以通过以下两条指令实现:
MOVAL,DATA1
MOVDATA2,AL
2. 数据交换指令数据传送指令单方向地将源操作数送至目的操作数存储单元,而数据交换指令则将两个操作数相互交换位置,例如:
XCHGOPRD1,OPRD2
指令中的OPRD1为目的操作数,OPRD2为源操作数,该指令把源操作数OPRD2与目的操作数OPRD1交换。OPRD1及OPRD2可为通用寄存器或存储器。
图3.9XCHG指令操作示意图
XCHG指令不支持两个存储器单元之间的数据交换,但通过中间寄存器,可以很容易地实现两个存储器操作数的交换。交换操作的示意图如图3.9所示。本指令不影响状态标志位,段寄存器内容不能用XCHG指令来交换。以下指令是合法的。
XCHGAX,BX
XCHGSI,AX
XCHGDL,DH
XCHGDX,BUF
XCHGWBUF,CX
3. 换码指令指令格式:
XLATTABLE
XLAT
以上两种格式是完全等效的。本指令的功能是把待查表格的一个字节内容送到AL累加器中。其中TABLE为一待查表格的首地址,在执行该指令前,应将TABLE先送至BX寄存器中,然后将待查字节与在表格中距表首地址位移量送AL,即:
ALBX AL
换码指令常用于将一种代码转换为另一种代码,如扫描码转换为ASCII码,数字0~9转换为七段显示码等。使用前首先在主存中建立一个字节表格,表格的内容是要转换成的目标代码。由于AL的内容实际上是距离表格首地址的位移量,只有8位,所以表格的最大长度为256。超过256的表格需要采用修改BX和AL的方法才能转换。本指令不影响状态标志位。XLAT指令中没有显式指明操作数,而是默认使用BX和AL寄存器。这种采用默认操作数的方法称为隐含寻址方式,指令系统中有许多指令采用隐含寻址方式。【例3.12】将首地址为200H的表格缓冲区中的4号数据取出。
MOVBX,200H
MOVAL,4
XLAT
4. 堆栈操作指令堆栈被定义为一种先进后出的数据结构,即最后进栈的元素将被最先弹出来。堆栈从一个称为栈底的位置开始,数据进入堆栈的操作称为入栈或压栈,数据退出堆栈的操作称为出栈,每进行一次出栈操作,堆栈就减少一个元素,最后一次入栈的元素,称为栈顶元素,入栈操作和出栈操作都是对栈顶元素进行的基本操作。在计算机中,堆栈设置在一个存储区域中。80868088的堆栈段的开始位置由SS10H 0000H决定,堆栈段最大为64KB。SP称为堆栈指针,确切地讲是指向栈顶元素的地址指针,由SP的值就可以知道栈顶元素的位置。1 入栈操作指令实现入栈操作的指令是PUSH指令,其格式为:
PUSHOPRD
其中,OPRD为16位字操作数,可以是寄存器或存储器操作数。PUSH的操作过程是:
SPSP-2,SPOPRD
即先修改堆栈指针SP入栈时为自动减2,然后,将指定的操作数送入新的栈顶位置。此处的SPOPRD,也可以理解为:
[SS10H SP]OPRD

[SS: SP]OPRD
例如:
PUSHAX
PUSHBX
每条指令的操作过程分两步,首先将SP-1SP,把AH的内容送至由SP所指的单元。接下来再使SP-1SP,把AL的内容送到SP所指的单元。随着入栈内容的增加,堆栈就扩展,SP值减少,但每次操作完,SP总是指向堆栈的顶部。图3.10a给出了入栈操作的情况。以下入栈操作指令都是有效的。
PUSHDX
PUSHSI
PUSHBP
PUSHCS
PUSHBUFFER
PUSHDAT[BX][SI]
注意: 每进行一次入栈操作,都压入一个字16位,例中的BUFFER,DAT[BX][SI]所指的存储器操作数应该被指定为字类型。2 出栈操作指令实现出栈操作的指令是POP指令,其格式为:
POPOPRD
其中,OPRD为16位字操作数,可以是寄存器或存储器操作数。POP指令的操作过程是:
OPRDSP,SPSP2
它与入栈操作相反,是先弹出栈顶的数据,然后再修改指针SP的内容自动加2。例如:
POPBX
POPAX
图3.10b给出了出栈操作的情况。
图3.10入栈和出栈操作
以下出栈操作指令都是有效的。
POPAX
POPDS
POPBUFFER
POPDAT[BX][DI]
其中的BUFFER及DAT[BX][DI]所指的存储器操作数也应被指定为字类型。PUSH及POP指令对标志位没有影响。
【例3.13】用堆栈操作指令实现两个存储器操作数BUF1及BUF2的交换。
PUSHBUF1
PUSHBUF2
POPBUF1
POPBUF2
5. 标志传送指令1 取FLAGS标志寄存器低8位至AH指令指令格式:
LAHF
指令含义为:
AHFLAGS7~0
该指令不影响FLAGS的原来内容,AH只是复制了原FLAGS的低8位内容。2 将AH存至FLAGS低8位指令指令格式:
SAHF
指令含义为:
FLAGS7~0AH
本指令将用AH的内容改写FLAGS中的SF、ZF、AF、PF和CF标志,从而改变原来的标志位。3 将FLAGS内容入栈指令指令格式:
PUSHF
本指令可以把FLAGS的内容保存到堆栈中去。4 从堆栈中弹出一个数据字送至FLAGS中的指令指令格式:
POPF
本指令的功能与PUSHF相反,在子程序调用和中断服务程序中,往往用PUSHF指令保护FLAGS的内容,用POPF指令将保护的FLAGS内容恢复。6. 地址传送指令地址传送指令将存储器的逻辑地址送至指定的寄存器。1 有效地址传送指令指令格式:
LEAOPRD1,OPRD2
指令中的OPRD1为目的操作数,可为任意一个16位的通用寄存器。OPRD2为源操作数,可为变量名、标号或地址表达式。本指令的功能是将源操作数给出的有效地址传送到指定的寄存器中。本指令对标志位无影响。例如:
LEABX,DATA1
LEADX,BETA[BX SI]
LEABX,[BP][DI]
显然,LEA BX,DATA1的功能是将变量DATA1的地址送至BX,而不是将变量DATA1的值送BX。如果要将一个存储器变量的地址取至某一个寄存器中,也可以用OFFSET DATA1表达式实现。例如MOV SI,OFFSET DATA1指令,其功能是将存储器变量DATA1的段内偏移地址取至SI寄存器中,OFFSET DATA1表达式的值就是取DATA1的段内偏移地址值。因此,LEA BX,DATA1指令与MOV BX,OFFSET DATA1指令的功能是等价的。
图3.11LDS指令操作示意图
2 从存储器取出32位地址的指令指令格式:
LDSOPRD1,OPRD2
LESOPRD1,OPRD2
其中,OPRD1为任意一个16位的寄存器,OPRD2指定了主存的连续4字节作为逻辑地址,即32位的地址指针。例如:
LDSDI,[BX]
该指令的功能是把BX所指的32位地址指针的段地址送入DS,偏移地址送入DI。指令操作示意图如图3.11所示。LES DI,[BX]指令除将地址指针的段地址送入ES外,其他与LDS类似。因此图3.11不仅适用于LDS指令,也适用于LES指令。以下指令是合法的。
LDSSI,ABCD
LDSBX,FAST[SI]
LESSI,ABCD
LESBX,FAST[SI]
注意: 以上指令不影响标志位。3.2.2算术运算类指令算术运算类指令用来执行二进制及十进制的算术运算,主要包括加、减、乘、除指令。二进制数运算分为带符号数运算和不带符号数运算。带符号数的最高位是符号位,不带符号数所有位都是有效位。十进制数用BCD码表示,又分为非压缩的BCD码和压缩的BCD码两种形式。算术运算指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果。该类指令主要影响6个标志位,即CF、AF、SF、ZF、PF和OF。1. 加法指令加法指令能实现字或字节的加法运算。1 基本加法指令指令格式:
ADDOPRD1,OPRD2
指令含义为:
OPRD1 OPRD1 OPRD2
OPRD1为目的操作数,可以是任意一个通用寄存器,也可以是任意一个存储器操作数。在ADD指令执行前,OPRD1的内容为一个加数,待ADD指令执行后,OPRD1中为加法运算的结果,即和。这给程序的编写带来了很大的方便。OPRD2为源操作数,它可以是立即数,也可以是任意一个通用寄存器或存储器操作数。立即数只能用于源操作数。OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数。加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响。以上标志也称为结果标志。加法指令适用于无符号数或有符号数的加法运算。操作数可以是8位,也可以是16位。例如:
ADDAL,38H
ADDBX,0A0AH
ADDDX,DATA[BX]
ADDDI,CX
ADDBETA[BX],AX
ADDBYTE PTR[BX],55
上述第一条指令及第六条指令为字节相加指令,其他四条均为字双字节相加指令。第三条指令中,存储器操作数是源操作数,采用寄存器相对寻址方式; 第五条指令中,存储器操作数是目的操作数,采用寄存器相对寻址方式; 第六条指令中,存储器操作数也是目的操作数,采用寄存器间接寻址方式,当立即数与存储器操作数做加法时,类型必须一致,故此处用BYTE PTR[BX],将存储器操作数的类型重新指定为字节类型,以保证两个操作数类型一致。2 带进位加法指令指令格式:
ADCOPRD1,OPRD2
指令含义为:
OPRD1 OPRD1 OPRD2 CF
其中,OPRD1、OPRD2与指令ADD中的含义一样。该指令对标志位的影响同ADD指令。例如:
ADCAL,CL
ADCAX,SI
ADCDX,MEMA
ADCCL,15
ADCWORD PTR[BX][SI],25
本指令适用无符号数及带符号数的8位或16位运算。【例3.14】如果两个32位的数据已分别放在ADNUM1和ADNUM2开始的存储区中,存放时低字在前,高字在后,将两个数相加,且将和存放在ADNUM3开始的存储区中。实现两个32位数相加的程序为:
MOVAX,ADNUM1
ADDAX,ADNUM2
MOVADNUM3,AX
MOVAX,ADNUM1 2
ADCAX,ADNUM2 2
MOVADNUM3 2,AX
由于两个存储器操作数不能直接相加,因而不能通过ADDADNUM1,ADNUM2指令进行。3 加1指令指令格式:
INCOPRD
指令含义为:
OPRD OPRD 1
OPRD为寄存器或存储器操作数。这条指令的功能是对给定的除段寄存器以外的任何寄存器或存储单元内容加1后,再送回该操作数,可以实现字节加1或字加1。本指令执行结果影响AF、OF、PF、SF、ZF标志位,但不影响CF标志位。例如:
INCSI
INCWORD PTR[BX]
INCBYTE PTR[BX DI]
INCCL
上述第二条、第三条这两条指令,是对存储字及存储字节的内容加1以替代原来的内容。在循环程序中,常用该指令对地址指针和循环计数值进行修改。2. 减法指令1 基本减法指令指令格式:
SUBOPRD1,OPRD2
本指令的功能是进行两个操作数的相减,即:
OPRD1 OPRD1 - OPRD2
本指令的类型及对标志位的影响与ADD指令相同,注意立即数不能用于目的操作数,两个存储器操作数之间不能直接相减。操作数可为8位或16位的无符号数或带符号数。例如:
SUBDX,CX
SUB[BX 25],AL
SUBDI,ALFA[SI]
SUBCL,20
2 带借位减法指令指令格式:
SBBOPRD1,OPRD2
其中,OPRD1、OPRD2的含义及指令对标志位的影响等均与SUB指令相同。完成的操作为: OPRD1OPRD1-OPRD2-CF。例如:
SBBDX,CX
SBBBX,2000H
SBBAX,DATA1
SBBALFA[BX SI],SI
3 减1指令指令格式:
DECOPRD
其中,OPRD的含义与INC指令相同,本指令的功能是OPRD OPRD -1。对标志位影响同INC指令。例如:
DECAX
DECCL
DECWORD PTR[DI]
DECALFA[DI BX]
4 取补指令指令格式:
NEGOPRD
OPRD为任意通用寄存器或存储器操作数。NEG指令也是一个单操作数指令,它对操作数执行求补运算,即用0减去操作数,然后将结果返回操作数。求补运算也可以表达成: 将操作数按位取反后加1。NEG指令对标志位的影响与用0做减法的SUB指令一样。例如: AL=44H,取补后,AL=0BCH-44H。5 比较指令指令格式:
CMPOPRD1,OPRD2
其中,OPRD1和OPRD2可为任意通用寄存器或存储器操作数,但两者不同时为存储器操作数,立即数可用做源操作数OPRD2。本指令对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较。因而不改变OPRD1和OPRD2的内容,该指令用于改变标志位。例如:
CMPAL,56H
CMPDX,CX
CMPAX,DATA1[BX]
CMPBATE[DI],BX
以CMPDX,CX为例,对标志位的影响如下:(1) DX=CX时,则ZF=1。(2) 两个无符号数比较: 若DXCX,则CF=0,即无借位; 若DXCX;若SF=1,则DXCX;若SF=0,则DX9或标志位AF=1,则
ALAL 6
AF1
2 若AL9FH或标志CF=1,则
CFAF
ALAL0FH
ALAL 60H
CF1
DAA指令影响标志位AF、CF、PF、SF、ZF,而对OF未定义。2 DAS指令指令格式:
DAS
DAS指令为无操作数指令。用以完成对压缩的BCD码相减的结果进行校正,得到正确的压缩的十进制差。一般在SUB指令之后,紧接着用一条DAS指令加以校正,在AL中可以得到正确的结果。DAS指令校正的操作如下。1 若AL0FH9或标志位AF=1,则
ALAL-6
AF1
2 若AL9FH或标志CF=1,则
ALAL-60H
CF1
DAS指令执行时,影响标志位AF、CF、PF、SF、ZF,而对OF未定义。3 AAA指令指令格式:
AAA
AAA指令为无操作数指令。AAA指令对在AL中的两个非压缩的十进制数相加后的结果进行校正。两个非压缩的十进制数可以直接用ADD指令相加,但要得到正确的非压缩的十进制结果,必须在ADD指令之后,用一条AAA指令加以校正,在AX中可以得到正确的结果。AAA指令进行校正的操作如下。若AL0FH9或标志位AF=1,则
ALAL 6
AHAH 1
AF1
CFAF
ALAL0FH
AAA指令对标志位AF和CF有影响,而对OF、PF、SF、ZF未定义。4 AAS指令指令格式:
AAS
AAS指令为无操作数指令。AAS指令把AL中两个非压缩的十进制数相减后的结果进行校正,产生一个正确的非压缩的十进制数差。AAS指令进行校正的操作如下。若AL0FH9或标志位AF=1,则
ALAL-6
AHAH-1
AF1
CFAF
ALAL0FH
AAS指令影响标志位AF和CF,而对OF、PF、SF、ZF位未定义。5 AAM指令指令格式:
AAM
AAM指令执行的操作为: 把AL中的积调整到非压缩的BCD格式后送给AX寄存器。这条指令之前必须执行MUL指令把两个非压缩的BCD码相乘此时要求其高4位为0,结果放在AL寄存器中。本指令的调整方法是: 把AL寄存器的内容除以0AH,商放在AH寄存器中,余数保存在AL寄存器中。本指令根据AL寄存器的内容设置标志位SF、ZF和PF,但对OF、CF和AF标志位无影响。6 AAD指令指令格式:
AAD
前面所述的对非压缩BCD码的调整指令都是在完成相应的加法、减法及乘法运算后,再使用AAA、AAS及AAM指令来对运算结果进行十进制调整的。除法的情况却不同,它针对的情况如下所述。如果被除数是存放在AX寄存器中的两位非压缩BCD数,AH中存放十位数,AL中存放个位数,而且要求AH和AL中的高4位均为0。除数是一位非压缩的BCD数,同样要求高4位为0。在把这两个数用DIV指令相除以前,必须先用AAD指令把AX中的被除数调整成二进制数,并存放在AL寄存器中。因此,AAD指令执行的操作是:
10AH ALAL
0AH
这条指令根据AL寄存器的内容设置标志位SF、ZF和PF,但对OF、CF和AF标志位无影响。3.2.3逻辑操作类指令逻辑操作类指令是按位操作指令,可以对8位或16位的寄存器或存储单元的内容按位操作。该类指令包括逻辑运算指令、移位指令和循环移位指令。1. 逻辑运算指令逻辑运算指令用来对字或字节按位进行逻辑运算,包括逻辑与AND、逻辑或OR、逻辑非NOT、逻辑异或XOR和测试TEST五条指令。1 逻辑与运算指令指令格式:
ANDOPRD1,OPRD2
其中,目的操作数OPRD1为任一通用寄存器或存储器操作数,源操作数OPRD2为立即数、任一通用寄存器或存储器操作数。也就是在这两个操作数中,源操作数可以是任意的寻址方式,而目的操作数只能是立即数之外的其他寻址方式,并且两个操作数不能同时为存储器寻址方式。AND指令实现对两个操作数按位进行逻辑与的运算,结果送至目的操作数。本指令可以进行字节或字的与运算。AND指令影响标志位PF、SF、ZF,使CF=0,OF=0。例如,在同一个通用寄存器自身相与时,操作数虽不变,但使CF置0。本指令主要用于修改操作数或置某些位为0。例如:
ANDAL,0FH
ANDAX,BX
ANDDX,BUF1[DI BX]
ANDBYTE[BX],00FFH
上例中的第一条指令,将使AL寄存器的高4位置成零保持AL低4位值不变。2 逻辑或运算指令指令格式:
OROPRD1,OPRD2
其中,OPRD1、OPRD2的含义与AND指令相同,对标志位的影响也与AND指令相同。唯一不同的地方是,OR指令完成对两个操作数按位或的运算,结果送至目的操作数中。本指令可以进行字节或字的或运算。OR指令可用于置位某些位,而不影响其他位。这时只需将要置1的位同1相或,维持不变的位同0相或即可。3 逻辑非运算指令指令格式:
NOTOPRD
其中,OPRD可为任一通用寄存器或存储器操作数。本指令的功能是完成对操作数的按位求反运算,结果送回给原操作数,本指令可以进行字节或字的非运算,不影响标志位。4 逻辑异或运算指令指令格式:
XOROPRD1,OPRD2
其中,OPRD1、OPRD2的含义与AND指令相同,对标志位的影响也与AND指令相同。本指令的功能是实现两个操作数按位异或的运算,即相异或的两位不相同时,结果是1; 否则,异或的结果为0,结果送至目的操作数中。XOR指令可以实现字节或字的异或运算。XOR可以用于求反某些位,而不影响其他位。要求求反的位同1异或,维持不变的位同0异或。例如,XORBL,00010001B指令的功能是将BL中D0和D4求反,其余位不变; XORAX,AX可以实现对AX寄存器内容清0。5 测试指令指令格式:
TESTOPRD1,OPRD2
其中,OPRD1、OPRD2的含义同AND指令,对标志位的影响也与AND指令相同。该指令与AND指令一样,也是对两个操作数进行按位的与运算,唯一不同之处是不将相与的结果送目的操作数,即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。【例3.21】写出判断寄存器AX中D3和D9位是否为0的指令。
TESTAX,0008H
TESTAX,0200H
2. 逻辑移位指令80868088指令系统的移位指令包括逻辑左移SHL、算术左移SAL、逻辑右移SHR、算术右移SAR等指令,其中SHL和SAL指令的操作完全相同。移位指令的操作对象可以是一个8位或16位的寄存器或存储单元。移位操作可以是向左或向右移一位,也可以移多位。当要求移多位时,指令规定移位位数次数必须放在CL寄存器中,即指令中规定的移位次数不允许是1以外的常数或CL以外的寄存器。移位指令都影响状态标志位,但影响的方式各条指令不尽相同。1 逻辑左移指令指令格式:
SHLOPRD1,COUNT
其中,OPRD1为目的操作数,可以是通用寄存器或存储器操作数。COUNT代表移位的次数或位数。移位一次,COUNT=1,移位多于一次时,COUNT=CL,CL中为移位的次数。本指令的功能是对给定的目的操作数8位或16位左移COUNT次,每次移位时最高位移入标志位CF中,最低位补0。本指令对标志位OF、PF、SF、ZF、CF有影响。2 逻辑右移指令指令格式:
SHROPRD1,COUNT
其中,OPRD1、COUNT与指令SHL中意义相同。与SHL一样,SHR指令也影响标志位OF、PF、SF、ZF和CF。所不同的是,本指令实现由COUNT决定次数的逻辑右移操作,每次移位时,最高位补零,最低位移至标志位CF中。例如:
SHLBL,1
SHLCX,1
SHLALFA[DI],1
或者:
MOVCL,3
SHRDX,CL
SHRDAT[DI],CL
上例中前三条指令完成目的操作数逻辑左移1位的运算; 而后两条移位指令,则实现由CL内容指定的次数的右移运算,由于CL=3,故分别对目的操作数逻辑右移3位。3 算术左移指令指令格式:
SALOPRD1,COUNT
其中,OPRD1、COUNT与指令SHL中意义相同。本指令与SHL的功能也完全相同,这是因为逻辑左移指令与算术左移指令所要完成的操作是一样的。如果SAL将OPRD1的最高位移至CF,改变了原来的CF值,则溢出标志位OF=1,表示移位前后的操作数不再具有倍增的关系。因而SAL可用于带符号数的倍增运算,SHL只能用于无符号数的倍增运算。4 算术右移指令指令格式:
SAROPRD1,COUNT
其中,OPRD1、COUNT与指令SHL中意义相同。本指令通常用于对带符号数减半的运算中,因而在每次右移时,保持最高位符号位不变,最低位右移至CF中。图3.12给出了上述四条移位指令的操作示意图。
图3.12移位指令操作示意图
3. 循环移位指令能实现操作数首尾相连的移位操作是循环移位指令。循环移位指令类似于移位指令,但要从一端移出的位返回到另一端形成循环。按进位标志CF是否参加循环移位,又可分为不带CF的循环移位指令和带CF的循环移位指令两类,每一类都可进行左移或右移,循环移位的次数由COUNT操作数给出。1 不带进位循环左移指令指令格式:
ROLOPRD1,COUNT
2 不带进位循环右移指令指令格式:
ROROPRD1,COUNT
3 带进位循环左移指令指令格式:
RCLOPRD1,COUNT
4 带进位循环右移指令指令格式:
RCROPRD1,COUNT
循环移位指令的操作数形式与移位指令相同,如果仅移动一次,可以用1表示; 如果需要移动多次,则需用CL寄存器表示移位次数。这组指令只对标志位CF和OF有影响。CF由移入CF的内容决定,OF取决于移位一次后符号位是否改变,如改变,则OF=1。由于是循环移位,因此对字节移位8次,对字移位16次,就可恢复为原操作数。由于带CF的循环移位,可以将CF的内容移入,因此可以利用它实现多字节的循环。循环移位指令的操作示意图如图3.13所示。
图3.13循环移位指令操作示意图
【例3.22】有两位BCD数存放在BUFFER单元,要求将其转换为ASCII码,存于RESULT开始的两个地址单元,并测试是否有字节为''0''的ASCII码,如有,则CF=1,结束操作。程序如下:
MOVAL,BUFFER
ANDAL,0F0H
MOVCL,4
SHRAL,CL
ORAL,30H
CMPAL,30H
JZZERO
MOVRESULT,AL
MOVAL,BUFFER
ANDAL,0FH
ORAL,30H
CMPAL,30H
JZZERO
MOVRESULT 1,AL
JMPEXX
ZERO: STC
EXX: HLT
本程序对BUF单元中的两位BCD数分离后,用ORAL,30H将AL中的BCD数转换为ASCII码,这是因为''0''到''9''的ASCII码为30H至39H。同理,用比较指令CMPAL,30H 可判断AL中内容是否为30H,若是,则ZF=1; 否则,ZF=0。程序针对这两种情况,作两种不同的处理。3.2.4程序控制类指令在80868088指令系统中,程序的执行序列是由代码段寄存器CS和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。程序的执行一般依指令序列顺序执行,但有时需用改变程序的流程。控制转移类指令通过修改CS和IP寄存器的值来改变程序的执行顺序,包括五组指令: 无条件转移指令、有条件转移指令、循环指令、过程调用和返回指令以及中断指令。利用程序控制类指令,可以实现分支、循环、子程序等程序结构。1. 无条件转移指令指令格式:
JMPOPRD
其中,OPRD为转移的目的地址。程序转移到目的地址所指向的指令后继续向下执行。无条件转移,就是无任何先决条件就能使程序改变执行顺序。处理器只要执行无条件转移指令JMP,就能使程序转移到指定的目标地址处。目标地址操作数的寻址方法可以是相对寻址、直接寻址或间接寻址。相对寻址方式以当前IP为基础,加上位移量构成目标地址。目标地址像立即数一样,直接在指令的机器代码中就是直接寻址方式。目标地址如果在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式。相对寻址方式根据位移量进行转移,方便了程序段在内存中的动态加载,是最常用的目标地址寻址方式。例如,同样的一段程序,如果改变了内存地址,转移的目的地址也就改变了,但是转移指令与目的指令之间的位移并没有因此改变。JMP指令可以将程序转移到1MB存储空间的任何位置。根据跳转的距离,JMP指令分成了段内转移和段间转移。段内转移是指在当前代码段64KB范围内转移,因此不需要更改CS段地址,只要改变IP偏移地址。如果转移范围用1字节-128~127表达,则可以形成所谓的短转移short jump; 如果地址位移用一个16位数表达,则形成近转移near jump,它是在32KB范围内。段间转移是指从当前代码段跳转到另一个代码段,此时需要更改CS段地址和IP偏移地址,这种转移也称为远转移far jump。转移的目标地址必须用一个32位数表达,叫作32位远指针,它就是逻辑地址。由此可见,JMP指令根据目标地址不同的提供方法和内容,可以分为以下4种格式。(1) 段内转移,相对寻址。(2) 段内转移,间接寻址。(3) 段间转移,直接寻址。(4) 段间转移,间接寻址。以下指令为合法的无条件转移指令:
JMPSHORT TARGET
JMPTARGET
JMPAX
JMPTABLE[BX]
JMPWORD PTR [BP][DI]
JMPFAR PTR LABLE
JMPVAR_DOUBLEWORD
JMPDWORD PTR [BP][DI]
2. 条件转移指令指令格式:
JCCOPRD
条件转移指令只有一个操作数OPRD,用以指明转移的目的地址。指令助记符中的CC表示条件。这种指令的执行包括两个过程: 第一步,测试规定的条件; 第二步,如果条件满足,则转移到目标地址; 否则,继续顺序执行。条件转移指令的操作数必须是一个短标号,也就是说,所有的条件转移指令都是两字节指令,转移指令的下一条指令到目标地址之间的距离必须为-128~127。如果指令规定的条件满足,则将这个位移量加到IP寄存器上,以实现程序的转移。绝大多数条件转移指令除JCXZ指令外将状态标志位的状态作为测试的条件。因此,首先应该执行影响有关的状态标志位的指令,然后才能用条件转移指令测试这些标志,以确定程序是否转移。CMP和TEST指令常常与条件转移指令配合使用,因为这两条指令不改变目的操作数的内容,但可以影响状态标志位。80868088的条件转移指令非常丰富,不仅可以测试一个状态标志位的状态,而且可以综合测试几个状态标志位; 不仅可以测试无符号数的高低,而且可以测试带符号数的大小等,编程时使用十分灵活、方便。所有的条件转移指令的名称、助记符及转移条件等列在表3.2中。其中同一行内用斜杠隔开的几个助记符,实质上代表同一条指令的几种不同的表示方法。
表3.2条件转移指令
指 令 名 称助记符转 移 条 件说明
等于零转移JEJZZF=1不等于非零转移JNEJNZZF=0负转移JSSF=1正转移JNSSF=01的个数为偶转移JPJPEPF=11的个数为奇转移JNPJPOPF=0溢出转移JOOF=1不溢出转移JNOOF=0进位转移JCCF=1不进位转移JNCCF=0判断单个标志位状态续表
指 令 名 称助记符转 移 条 件说明
低于不高于或等于转移JBJANECF=1高于或等于不低于转移JAEJNBCF=0高于不低于或等于转移JAJNBECF=1且ZF=0低于或等于不高于转移JBEJNACF=0或ZF=1用于无符号数的比较
大于不小于或等于转移JGJNLESF=OF且ZF=0大于或等于不小于转移JGEJNLSF=OF小于不大于或等于转移JLJNGESFOF且ZF=0小于或等于不大于转移JLEJNGSFOF或ZF=1用于带符号数的比较
CX等于零转移JCXZ(CX)=0不用判断标志位状态
比较两个无符号数大小的指令,通常是根据一个标志位或两个标志位以确定两个数的大小。为了与带符号数的大小相区别,无符号数比较常用高于、低于来表示。带符号数比较常用大于、小于来表示。以上两种表示方法一定要能正确地区分开,否则就不能正确理解和使用这些指令。【例3.23】设计一段程序实现以下功能: 如果AL最高位为0,则设置AH=0; 如果AL最高位为1,则设置AH=FFH。程序段如下:
TESTAL,80H
JZNEXT0
MOVAH,0FFH
JMPDONE
NEXT0: MOVAH,0
DONE:
【例3.24】设X和Y为存放于X单元和Y单元的16位操作数,计算|X-Y|,并将结果存入RESULT单元中。程序段如下:
MOVAX,X
SUBAX,Y
JNSNONNEG
NEGAX
NONNEG: MOVRESULT,AX
【例3.25】完成下式的判定运算。Y=1X0
0X

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.