配色: 字号:
第4章指令与汇编语言
2022-09-10 | 阅:  转:  |  分享 
  
第4章指令系统与汇编语言程序设计本章首先介绍指令、程序及汇编语言的基本概念;然后介绍存储器与外部设备地址分配、指令中的寻址方式、指令格
式与指令码优化设计;最后以80x86为例,介绍指令系统与汇编语言程序设计,以便使学生在学习本章后,了解或掌握一种汇编语言指令及其程
序设计。重点是指令的类型、存储器与外部设备地址分配、寻址方式、指令码优化设计、简单汇编语言程序设计。第4章指令系统与汇编语言
程序设计4.1指令系统概述4.2地址分配与指令优化设计4.3指令系统举例与汇编语言程序设计4.1指令系统概述4.
1.1指令与程序操作码操作数计算机的所有工作就是执行程序,而程序是为求解某一问题或进行某项工作的若干条指令的有序集合。所谓指
令,是指示计算机进行某一工作的命令,在计算机中用二进制代码表示。它要告诉计算机做什么,怎么做,其格式如图4.1所示,一般至少包括两
个部分,即操作码域和操作数域。操作码域用来说明指令的类型与功能,比如加法指令、减法指令、存储器读/写指令或数据输入/输出指令等。
操作数域也称为地址域,用来说明参加操作的数据在什么地方及操作结果存放到什么地方。通常,表示一条指令的二进制数称为指令字,按其长
度分为:单字节、双字节、三字节以至四字节指令等。按其操作数的个数又分为:无操作数、单操作数、双操作数以至三操作数指令,也称
为无地址、一地址、二地址以至三地址指令。其中存放结果的称为目的操作数或目的操作数地址,简称为目的地址。其它称为源操作数或源操作数
地址。一台计算机全部指令的集合称为该计算机的指令系统。不同的计算机有不同的指令系统。其中用二进制代码表示指令系统的语言称为机
器语言,用机器语言编写的程序称为机器语言程序。比如下面是某计算机中的两条指令。1011000100100000000000
1011000001其中第一条指令是把存储器20H单元中的数读出,送入寄存器CL中;第二条是加法指令,把累加器AL中的数与寄
存器CL中的数相加,结果在AL中。这种用机器语言编写的程序,CPU可以直接识别并执行。4.1.2汇编语言程序从以上举例可
以看出,机器语言程序不易编写、阅读和理解。为此人们用英文单词或其缩写字母表示指令,比如用:ADD、SUB、MUL、DIV、MO
V分别表示加、减、乘、除和传送等操作。这些英文单词或缩写字母,称为助记符。这种用助记符表示指令系统的语言称为汇编语言,其指令称
为汇编语言指令。用汇编语言编写的程序,称为汇编语言程序。一条汇编语言指令对应一条机器语言指令,因此汇编语言指令实际上是机器指令的符
号化表示。例如上一节的机器语言程序可用如下汇编语言指令来表示。MOVCL,20HADDAL,CL又如在某计算机上计算1
到10的累加和的程序如下:A2060HMVRDR1,0000;置累加和的初值为0MVRDR2,000A;最大的加数
SUBR3,R3;预置参加累加的数为0(2065H)INCR3;得到下一个参加累加的数ADDR1,
R3;累加计算CMPR3,R2;判断是否累加完JRNZ2065;未完,开始下一轮累加RET上述R1、R
2、R3表示寄存器,A是Debug命令,使程序存储在以2060H为起始地址的存储器区域中。与机器语言相比,这种程序易于编写、识别和
理解。但是必须转换成机器语言,CPU才能被识别和执行。这一转换过程称为汇编,由专门的程序来进行,这种程序称为汇编程序。通常,人们
把用汇编语言编写的程序称为源程序,经汇编而生成的机器语言程序称为目标程序或目标代码。汇编过程如图4.2所示。在汇编语言中,除了基
本指令系统外,还有一些用来说明汇编过程,或对汇编过程进行辅助说明的指令,称为伪指令。由于汇编语言与机器语言的指令一一对应,因此执行
速度快,常用来设计一些对实时性要求较高的程序。4.1.3指令系统的设计要求与分类1.指令系统的设计要求从使用和管理的角
度来看,任何一种计算机的指令系统,一般都分成两种部分。一部分是提供给一般用户的指令,例如算术逻辑运算指令、传送类指令、控制转移类
指令,以及常用系统管理指令等。另一部分是系统管理员使用的指令,一般不提供给普通用户使用,因此也称为特权指令。例如专用I/O指令、
停机等待指令、存储器保护指令、系统状态控制以及诊断指令等。一般指令与计算机硬件同时设计,除了与硬件系统配合外,还要考虑对编译程
序的支持,以有利于编译程序的设计,使高级语言源程序易于翻译成机器语言程序。为此,应注意以下4个方面的问题。(1)正交性。又称为分
离原则或互不干涉性,即指令代码中不同字段相互独立,互不相关。例如操作码、操作数、表示寻址方式的地址码,应当并行排列,互不重叠或交叉
。(2)规整性。是对类似的操作数有相同的规定。例如对于字操作数和字节操作数设置相同的运算规则和条件码;对于所有通用寄存器设置相同
的使用原则,尽量不设置约束条件。(3)对称性。使操作数或存放操作数的寄存器尽量具有对称性。例如能进行R1←R1?R2运算,最好也
能进行R2←R2?R1运算;若设有X←A+B×C功能,最好也设有X←A×C+B功能。(4)可扩充性。对于操作码的译码状态不要用完
,适当留出一部分,以便以后扩充。例如有16条指令,操作码不应当仅用4位,而应当多用1~2位。2.指令系统结构分类指令系统体现的
是计算机系统结构的基本属性,不同的系统结构配置有不同的指令系统。随着计算机系统结构的发展,各种类型的指令系统层出不穷,很难用统一的
标准进行分类。但是人们确定了几个原则,例如在CPU中存放操作数的部件,每条指令中操作数的个数,以及ALU指令的操作数能否存放在主存
储器中等。(1)按照CPU中存放操作数的部件,指令系统可分为累加器型、通用寄存器型和堆栈型。这种分类方式与ALU的结构密切相关。
累加器型,是在早期的计算机中常设有专用累加器。因此在二操作数指令中,有一个操作数可以隐含在累加器中。例如加法指令,被加数和结果在
累加器中;减法指令,被减数和差在累加器中;I/O指令,通过累加器进行数据输入输出。堆栈型,是把累加器隐含在堆栈的栈顶。运算时,源
操作数必须压栈,运算结果也在栈顶。例如Intel80x87采用的就是这种方式。通用寄存器型,是针对专用累加器的不足发展而来的。
在专用累加器型计算机中,所有运算和I/O操作都要通过累加器进行,因此累加器就成了提高计算机性能的瓶颈。为此,在后来人们设置了大量的
寄存器,而且所有的寄存器都具备累加器的功能,因此称为通用寄存器型。在这类指令系统中,所有的通用寄存器都可以存放源操作数和目的操作数
,都可以执行I/O操作。三种类型指令系统的计算机如表4.1所示。以Z=X+Y的运算为例,各类计算机所使用的主要指令如表4.2所示
。表4.1三种不同类型指令系统计算机存放操作数的主要部件机器型号存放结果目的地址访问显式操作数的过程累加器PDP-8,MC6
809累加器存/取累加器堆栈B5500/6500,HP3000,Intel80x87堆栈压栈/弹栈通用寄存器IBM370,VA
X-11,RISC机寄存器或存储器存/取寄存器或存储器表4.2三种类型计算机执行Z=X+Y所用的指令堆栈结构累加器结构通用寄存
器结构PUSHXPUSHYADDPOPZLOADXADDYSTOREZLOADR
1,XLOADR2,YADDR1,R2STOREZ,R1(2)根据指令中操作数(或地址)的个数,指令可分为无
操作数、单操作数、二操作数、三操作数、四操作数,以及多操作数等类型。也称为无地址、单地址、二地址、三地址、四地址及多地址指令。在表
示操作数时有两种格式,一种是固定长度编码格式,另一种是用地址描述符表示的变字长编码格式。其示意图如图4.3所示。图4.3按操作
数个数分类指令格式(3)根据ALU指令的操作数能否存放在主存储器中,指令又分为两种类型:一种是ALU指令只能对通用寄存器中的数据
进行操作,而不对存储器中的数据直接操作。另一种是允许ALU指令对存储器中的数据直接操作;其中又有两种,一种是存储器中只存放源操作数
,另一种是存储器中可以存放源操作数,也可以存放目的操作数。概括起来,该类指令系统又可分为三种:寄存器—寄存器型寄存器—存储器型
存储器—存储器型3.CISC计算机与RISC计算机在早期的计算机中,硬件结构简单,指令系统简单,所有指令直接译码和执行。后
来,随着高级语言的出现与发展,人们希望简化由高级语言源程序到目标代码的编译过程,于是增强机器语言指令的功能,缩小机器语言指令与高级
语言语句的差异,减少程序中的指令数目。又由于在系列机中,考虑到兼容性,因此新推出的指令系统往往是原有指令系统的超集。这诸多原因,就
使得指令系统越来越复杂。同时,微电子技术的发展为计算机系统结构的发展提供了有力的支持。于是,复杂指令集计算机CISC(Compl
exinstructionsetcomputer)逐步成为计算机设计的主流技术。主要特点是指令格式多、功能强,采用微程序控
制器,各种指令都能访问存储器,通用性好。但是专用寄存器多,通用寄存器少,指令系统复杂,执行周期长,绝大多数指令需要多个机器周期才能
执行完,难以使用优化编译技术生成高效的目标代码。往后,复杂指令系统结构进一步发展,微程序控制器越来越复杂,在VLSI中占据的面积
越来越大,甚至达到60%以上。而在程序执行中,80%~90%的时间仅在执行10%~20%的简单指令。因此把大量不经常使用的复杂指令
设计在微程序控制器中,不仅增加了设计难度,而且没有多大的意义。于是人们又回到简化指令集,精选用少数频繁使用的指令,由CPU直接译
码执行。于是又产生了简化指令集计算机RISC(Reducedinstructionsetcomputer)技术。其特点是简
化了指令系统及其结构,减少了指令数目,不设(或者尽量少用)微程序控制器,所有指令由CPU直接译码执行,采用寄存器-寄存器工作方式,
除少数访存(LOAD/STORE)指令外,一般指令不直接对存储器操作,且在一个机器周期内执行完毕。其中设置了大量通用寄存器,称为寄
存器组或寄存器文件(Registerfile),采用寄存器窗口重叠技术,以减少数据传送,不用或者少用专用寄存器,易于实现优化编译
和流水线技术。4.2地址分配与指令优化设计4.2.1地址分配在计算机中,存放操作数的部件一般有三种,即寄存器、存储器和
I/O端口。访问方式有两种方式,一种是按地址访问,另一种是按内容访问。本节主要介绍按地址访问,这首先涉及编址方式,常见的有隐含编址
、独立编址和统一编址。1.编址方式1)隐含编址在现代计算机中,一般都有大量的寄存器,例如80x86微处理器中的AX、BX、C
X、DX,Intel系列微处理器中的R0、R1以及常见的状态标志寄存器PSW等。这些寄存器有内部地址,但是在汇编语言指令中用助记符
表示,用户编程时使用助记符而不必说明其内部地址,因此是一种隐含地址。例如加法指令ADDAX,BX和压栈指令PUSHPSW等。
2)独立编址独立编址与统一编址是针对I/O端口和主存地址而言的,有两种方式,一种是独立编址,另一种是统一编址。3)统一编址
统一编址也称为混合编址,是把I/O端口地址与存储器地址合为一体。即每一个I/O端口和主存中的一个字节单元一样,通过相同的指令访问
,进行数据输入/输出。独立编址也称为分离编址或集中编址,是把I/O端口地址独立设置,不影响主存空间。但是需要对I/O端口设置专门
的指令,实现数据输入/输出。例如指令INAX,PORT,实现外部数据的输入;指令OUTPORT,AX,实现内部数据的输出。独立
编址特点如下:(1)I/O地址不占据主存空间,整体地址空间大。(2)采用专门的I/O指令进行输入/输出操作,程序清晰明了。(
3)在一般情况下,外围设备速度慢,采用独立编址,不会因为I/O指令周期长而影响访问主存速度。(4)需要对I/O地址空间设置独立的
译码器,增加了硬件设置。统一编址也称为混合编址,每一个I/O端口和主存中的一个字节单元一样,通过相同的指令访问,进行数据输入/输
出。例如,可使用指令MOVAX,[BX]访问存储器,使用指令MOVAX,[DX]访问I/O设备。这两条指令有相同的助记符,区
别仅在于寄存器BX中存放的是存储器地址,而DX中存放的是外围设备的端口地址。统一编址特点如下:(1)不设置专门的I/O指令,减少
了指令的类型,使程序中的传送指令统一。(2)通过传送指令即可实现数据的输入/输出,甚至通过ALU指令可直接对I/O端口进行操作,
有利于简化程序设计。(3)使用统一地址译码器寻址,有利于简化硬件电路。(4)I/O设备占据主存空间,使主存有效空间减小。(5
)一般情况下,外围设备速度较慢,采用统一的指令既访问存储器,又访问外设,不利于缩短指令周期,影响访问主存的速度。2.物理地址与虚
拟地址在早期的计算机中,指令中的编程地址与实际存储器(包括I/O设备)地址一致,即CPU有多少位地址,就有多大的编程空间和实际物
理空间。后来,随着计算机系统结构的发展,编程地址不再与实际主存地址保持一致。最初,实际地址空间大于编程空间,例如,Intel80
86有20位地址,实际主存地址空间为1MB,而编程地址空间仅为64KB;后来发展为编程地址空间远大于实际主存地址空间,例如,Int
el80486有32位地址,实际主存空间仅为4GB,而编程地址为64TB。由于64TB主存空间是虚构出来的(由软件实现,存储在外
存中),因此称为虚拟存储器,其地址称为虚拟地址。而实际主存是指物理存储器,其地址称为物理地址。3.地址分配不同的计算机有不同
的字长,例如8位,16位,32位,甚至64位等。在许多微型计算机或高级语言教科书中,常把字长定义为16位,8位为半字长,32位为双
倍字长。这里把字长定义为32位,16位为半字长,64位为双倍字长。图4.4数据存放格式图4.4数据存放格式为了使数据存放
规整,常以字节为单位编址。存放单字节数据时:起始地址可以是任意单元地址;对于双字节数据,从偶地址单元开始存放;四字节数据起始
地址的末2位为00;八字节数据起始地址的末3位为000;十六字节数据起始地址的末4位为0000。通常,把一个多字节数据的存储
区域称为一个小段,多字节数据应当按段存放。对于多字节数据,各种计算机的存放格式有所不同,可以低字节在前,高字节在后;也可以高字节
在前,低字节在后。例如,存放数据2A6890B3H,其示意如图4.4所示。图4.4数据存放格式4.2.2寻址方式在不
同的计算机中,有不同的寻址方式。但是大体上可以划分为两种类型:一种是面向对象的寻址方式;另一种是面向地址的寻址方式。所谓面向
对象的寻址方式,主要是指面向寄存器、特殊存储器区域和堆栈等,由不同的指令来实现,其地址可以隐含说明,也可以显式说明。所谓面向地址的
寻址方式,是按地址访问存储器或者I/O端口,其地址一般显式说明。这里主要介绍面向地址的寻址方式,有立即数、直接地址、寄存器寻址、
寄存器间接寻址、存储器间接寻址、寄存器自增/自减寻址、基址加变址寻址、相对(或带偏移)寻址等。而按地址,寻址方式可分为两种类型:
操作数寻址和转移地址寻址。1.操作数寻址方式在操作数寻址方式中,常见的有以下7种,主要指源操作数的寻址方式。1)立即数
立即数是指指令操作数域直接给出的是参加运算或进行某种操作的数据,又称即时数。它跟在操作码之后作为指令的一部分直接存放在代码段中,因
此称为立即数,有8位、16位等形式。对于16位数据,低字节在先,高字节在后。例如指令:MOVAL,5;把立即数5传送到寄存器
AL中又如指令:MOVAX,2790H;把立即数2790H传送到寄存器AX中其中立即数只能是源操作数。这种寻址方式的优点是执
行速度快,缺点是灵活性差,主要用来对寄存器或存储器赋值。2)寄存器寻址寄存器寻址是指指令操作数域给出的是存放操作数的寄存器。
现代计算机都有大量的寄存器,操作数在寄存器中。与存储器寻址相比,执行速度快。例如指令:MOVBX,AX;把寄存器AX中的数传
送到寄存器BX中3)直接寻址直接寻址是指指令操作数域给出的是存放操作数在存储器中地址。例如指令:MOVBX,[2000H
];用方括号表示,其中2000H是操作数地址4)寄存器间接寻址寄存器间接寻址是指指令操作数域给出的是存放操作数地址的寄存器。
例如指令:MOVAX,[BX];用方括号表示,其中寄存器BX中数是操作数在存储器中的地址5)寄存器相对寻址寄存器相对寻
址是指指令操作数域给出的是一个基址寄存器和一个偏移量,基地址寄存器中的基地址与偏移量相加,作为操作数地址。例如指令:MOVA
X,DATA[DI];其中方括号中的DI是基址寄存器,DATA表示偏移量,DI中的数与偏移量DATA相加,作为操作数地址6)基址
加变址寻址基址加变址寻址是指指令操作数域给出一个存放基地址的基址寄存器和一个存放变址基值的变址寄存器,两寄存器中的数相加,其结果
作为操作数的偏移地址。例如指令:MOVAX,[BX][DI]或MOVAX,[BX+DI];方括号中的BX作为基址
寄存器,DI作为变址寄存器,两寄存器中的数相加,作为操作数地址若设(BX)=2000H,(DI)=3000H,则5000H为操作
数地址。7)相对基址加变址寻址相对基址加变址寻址是指指令操作数域给出一个存放基地址的基址寄存器、一个存放变址基值的变址寄存器和
一个偏移量,两寄存器中的数及偏移量相加,作为操作数的地址。例如指令:MOVAX,MASK[BX][DI]MOVAX,M
ASK[BX+DI]MOVAX,[MASK+BX+DI]若设(BX)=2000H,(DI)=1000H,MASK=025
0H,则3250H为操作数地址。这种寻址方式为数组和表格的访问提供了方便。除此之外,在有的计算机中还设有存储器间接寻址、寄存器自
增/自减寻址等。所谓存储器间接寻址,是指令操作数域给出的是操作数在存储器中的地址的地址。所谓寄存器自增/自减寻址是指寄存器间接
寻址或基址加变址寻址后,寄存器或基址寄存器中的数自增/自减。这种寻址方式有利于访问数组和字符串类数据。2.转移地址寻址方式
这种寻址方式主要用来确定转移指令和子程序调用指令CALL的目标地址。在上述7种常见寻址方式中,除了立即数寻址和寄存器寻址之外,其余
寻址方式都可用于转移指令寻址。其中相对寻址常用指令计数器PC作为基址寄存器,即相对于程序计数器PC的寻址。例如指令:JMP
NEXT;直接寻址,NEXT表示符号地址,程序运行时必须赋值JMPBX;寄存器BX中的数作为转移地址,送入程序计数器PC中
JMP1000H[BX+SI];BX和SI中的数与1000H相加,作为转移地址,送入程序计数器PC中又如指令:JRDAT
A;相对于程序计数器PC转移,偏移量是一个用补码表示的带符号数,其值与程序计数器PC中的当前值相加,结果作为转移地址;若偏移量是一
个8位数,则转移范围为-128~+1274.2.3指令格式与优化设计1.指令格式指令的格式已在4.1.3节中讨论过,主
要由两部分组成。一部分用来确定指令的性质或功能,即操作码;另一部分用来说明参加运算的操作数或操作数的地址,即地址码。根据
地址码的个数,指令分为:无地址;单地址;二地址;三地址;四地址及多地址等格式。对于操作数地址的表示,有两种编码方式:
(1)变字长编码方式,即根据操作数改变指令字长,具有降低指令集平均指令长度的优点,但是可使指令长度和执行时间不一致。在过去大多数
CISC计算机中,由于操作数多,寻址方式复杂,多采用这种编码方式。(2)固定长度编码方式,即操作码与操作数合为一体,指令字长固定
。采用这种方式有利于降低硬件电路的复杂度,提高译码效率,一般RISC计算机多采用这种编码方式。(3)把二者结合起来,即混合编码方
式,部分指令采用固定字长,部分指令采用变字长编码方式。也就是提供一定类型的指令字长,以兼顾降低平均指令字长和降低译码电路的复杂度的
目的。比如早期的IBM370采用的就是这种方式。在IBM370计算机中,大部分指令采用的是8位操作码,仅有少数(如启动、测试
和暂停I/O设备等)指令的操作码可以扩展为16位。其中8位操作码指令有5种基本指令格式,如图4.5所示。图4.5IBM370
计算机指令格式其中,R1、R2、R3分别表示源操作数寄存器和目标操作数寄存器,B1、B2表示基址寄存器,D1、D2表示偏移量。操
作码的高两位标识指令的长度与格式,其余6位标识不同的指令,最多可有64条。高两位的作用如下。00:RR格式,指令字长16位;0
1:RX格式,指令字长32位;10:RS或SI格式,指令字长32位;11:SS格式,指令字长48位。其中,R表示寄存器,S表
示存储器,X表示变址寻址,I表示立即数。指令长度有16位、32位和48位三种,包含单地址、二地址和三地址指令。2.操作码优化编码
早期的优化编码是根据字符在报文传送中出现的频率,选用不同的编码长度,即出现频率高的字符编码长度短,出现频率低的字符编码长度长。这
样,可缩短报文传送中字符的平均编码长度。由于这一思想是由霍夫曼首先提出来的,因此称为霍夫曼编码。在计算机中,可用这种方法对指令的操
作码进行编码,即常用指令的操作码短一些,不常用的指令的操作码可以长一些。1)霍夫曼编码法采用霍夫曼编码法是将要编码的字符按出现
的频率排序,如图4.6所示。这种方式也称为霍夫曼树,每一个字符(频率)视为一个叶节点。然后,再按以下步骤进行,频率相等的字符可以任
意排列。图4.6用霍夫曼树进行编码(1)每次选择频率最小的两个频率相加,构成一个新的节点,用线段与另外两个节点连接。(2)
新的节点再与其它叶节点按频率顺序排列,重复(1)的过程,直至全部频率都处理完毕,最后形成一个频率为1的根节点。(3)从根节点开始
向下,对两个分支分别用1和0(或者0和1)来表示,直至遍历全部叶节点为止。(4)从根节点开始,沿边线记录编码值,生成每一个字符的
编码。【例4.1】设有7条指令,其操作码分别表示为I0、I1、I2、I3、I4、I5、I6,使用的频率依次为0.40、0.30、
0.15、0.05、0.04、0.03、0.03,用霍夫曼树对其编码。解:首先将I0、I1、I2、I3、I4、I5、I6按使用的
频率排列,然后挑选使用频率最少的两个相加,成为一个叶节点,并用线段与其他两个节点连接,继续执行上述①~④步骤,其过程如图4.6所示
。最后得出每一条指令的操作码,如表4.3所示。由图4.6可以看出,在沿分支指定1和0时,顺序可以改变,因此图中所示的编码值不是惟一
的。2)霍夫曼扩展编码在实际使用中,如果完全按照霍夫曼编码设置操作码,则过于凌乱,会给硬件设计带来困难。因此,一般多采用霍夫曼
扩展编码法,如表4.3所示。这样,既保留了霍夫曼编码的优点,又不至于使编码的类型(长度)过多。=0.40×1+0.30×2+0.1
5×3+0.05×5+0.04×5+0.03×5+0.03×5=2.20=0.40×2+0.30×2+0.15×2+0.05×4+
0.04×4+0.03×4+0.03×4=2.30表4.3霍夫曼编码及其扩展编码指令频率P霍夫曼编码编码长度L1霍夫曼扩展
编码扩展编码长度L2I00.4001002I10.30102012I20.151103102I30.0511100511004I4
0.0411101511014I50.0311110511104I60.0311111511114两种编码法的平均长度计算如下:
显然,使用霍夫曼扩展编码可以使编码类型(长度)减少,有利于硬件电路的设计;同时,平均编码长度没有增加多少。3)扩展编码法指令的
格式有固定字长和变字长两种,这就需要对操作码进行扩展,即扩展编码法。根据操作码位数的不同,扩展方法有多种。这里仅以4位操作码为例,
介绍两种扩展方法。一种称为15/15/15编码法,另一种称为8/64/256编码法。在15/15/15编码法中,用4位二进制数
对应的16个编码中的15个表示最常用的15种指令,1个表示操作码扩展4位;再用扩展的4位二进制数对应的16个编码中的15个表示另外
15种指令,1个表示操作码再扩展4位;以此类推,如图4.7(a)所示。其中1111,表示操作码扩展。在8/64/256编码法中,
用前4位(也是高4位)二进制数中的0×××表示最常用的8种指令;操作码扩展成两个4位二进制数时,用1×××0×××表示64种指令,
其中最左边的1表示操作码扩展;操作码扩展成3个4位二进制数时,用1×××1×××0×××表示256种指令;其示意如图4.7(b)所
示。在实际编码中,操作码字段的位数可根据需要设置,不一定是4位。这样,实际编码方案和指令的种类就很多了。3.地址码优化设计在
一条指令中,除了操作码之外还有地址码,因此对于地址码也存在优化设计的问题。在当前定长指令格式中,字长一般都取一个字节的整数倍,即8
位、16位、32位、64位。由于操作码的位数有限,剩下的部分可用来表示地址码。但是,如果仅用剩下的部分直接作为操作数的地址,则表
示的范围就太小了。例如,设指令字长为32位,操作码占8位,剩下24位。若用12位表示源操作数,另外12位表示目的操作数,那么寻址空
间仅有212=4KB。为了表示存储器的硕大空间,在设计指令格式时常采用多种寻址方式,表示源/目的操作数的地址。图4.8PDP-
11机指令格式另外,在操作码的优化设计中产生了不同的操作码长度,这样就使不同指令的地址码长度不一致。因此需要合理安排,以充分利用
指令字的每一位。例如在PDP-11和VAX-11系列机中,都使用了操作码扩展编码方式,采用单字长和双字长两种指令字长度。操作码长度
有4位、7位、8位、10位、12位和13位,都配以不同的操作数个数和寻址方式,充分利用指令字中的非操作码位。图4.8所示,是PDP
-11的指令格式。图4.9存储器物理地址4.3指令系统举例与汇编语言程序设计每一台计算机都有自己的指令系统,这里仅以80x
86为例说明其指令系统及汇编语言程序设计。4.3.180x86指令系统在80x86指令系统中,按功能指令可分为6种类型,即数
据传送指令、算术运算指令、逻辑运算指令、串操作指令、程序控制指令和处理器控制指令。由于在80x86微处理器中对于主存储器分段管理
,因此设有段寄存器。主存物理地址是段寄存器中的数左移4位与寻址方式中给出的16位地址相加而得到的20位地址,如图4.9所示。对于
涉及存储器的指令在访问存储器时,都涉及到段寄存器。因此在访问存储器时,段寄存器中的值必须设定。对于16位微处理器,段寄存器有CS、
DS、ES和SS,各16位。其中CS是代码段寄存器,DS是数据段寄存器,ES是附加段寄存器,SS是堆栈段寄存器,用来存放各段的段
起始地址。这里,如果没有特别说明,字长为16位;32位为双倍字长。对于32位微处理器,设置了6个段寄存器,CS、DS、ES、S
S、FS和GS,用来存放选择符,借以在段描述符表中选择段描述符,以确定段起始地址。字长为32位。1.数据传送指令数据传送类
指令用于寄存器、存储器或输入输出端口之间传送数据或地址,共有14条,分为4种类型:通用数据传送指令、地址传送指令、标志寄存器传送指
令和输入输出指令。1)通用数据传送指令(1)传送指令MOV格式:MOVDST,SRC功能:DST←(SRC)说明:
DST表示目的操作数地址,SRC表示源操作数地址,其中目的操作数不能是立即数、CS和IP寄存器;两存储器单元之间和两个段寄存器之间
不能直接传送;立即数不能直接传送到段寄存器;允许段跨越,不影响标志位。例如指令:例如指令:MOVAX,DX;把寄存器DX
中的16位数传送到寄存器AX中MOVAL,ES:[BX];把段寄存器ES和寄存器BX所指定单元中的8位数传送到寄存器AL中
MOVAL,ADD1;ADD1表示地址,把该地址单元中的8位数传送到寄存器AL中MOVADD2,AL;把寄存器AL中的8
位数传送到地址ADD2所指定的存储器单元中MOVAX,DAT1;DAT1表示立即数,把立即数传送到寄存器AX中MOV
DS,AX;把寄存器AX中的数传送到段寄存器DS中MOVBX,[0320H];这里默认段寄存器DS,把DS和直接地址0320
H所指定单元中的16位数传送到寄存器BX中(2)堆栈操作指令压栈指令PUSH格式:PUSHSRC功能:SP←(SP)-
2,(SP)+1,(SP)←(SRC)弹栈指令POP格式:POPDST功能:DST←((SP)+1,(SP)),SP←(
SP)+2堆栈操作指令以字为单位,可以使用除立即数以外的其它寻址方式,允许段跨越;PUSHCS合法,但POPCS非法;不影
响状态标志位。例如指令:PUSHCS;把段寄存器CS中的16位数压入堆栈POPDS;弹栈,把弹出的16位数送入段寄存器
DS中(3)交换指令XCHG格式:XCHGOPR1,OPR2功能:(OPR1)?(OPR2)说明:XCHG指令不适用
段寄存器和立即数,不允许两存储器单元直接交换,两操作数可以是8位或16位。允许段跨越,不影响状态标志位。例如指令:XCHGA
L,BL;两8位寄存器中的数交换XCHGAX,SS:[SI];寄存器AX与存储器单元中的16位数交换(4)换码指令XLAT
格式:XLATOPR或XLAT功能:AL←((BX)+(AL))也称为查表指令,OPR表示表格中的地址,BX存放
表格首地址,AL存放待查值(偏移量),查得结果送AL中,不影响状态标志位。【例3.6】在以DATA为首地址的主存区域中连续存放
着0~9的平方表,试编写查表程序。解:首地址存入寄存器BX中,待查数据X送入AL中。MOVBX,OFFSETDATAM
OVAL,XXLAT2)地址传送指令(1)有效地址送寄存器指令LEA格式:LEAREG,SRC功能:REG←S
RC将源操作数的有效地址传送到指定寄存器REG中;目的寄存器为16位通用寄存器,源操作数可以是除立即数和寄存器寻址以外的其它寻址
方式;允许段跨越;不影响状态标志位。例如指令:LEABX,DATA;DATA表示存储器单元,把该单元的偏移地址送入寄存器BX
中(2)指定寄存器与段寄存器DS置数指令LDS格式:LDSREG,SRC功能:REG←(SRC),DS←(SRC+2)
把存储器中连续两个字单元中的数据传送到指定寄存器和段寄存器DS中,不影响状态标志。例如指令:LDSSI,[1508H];
把DS和[1508H]所指定单元的字操作数送入寄存器SI,下一单元的字操作数送入段寄存器DS中。(3)指定寄存器与段寄存器ES置
数指令LES格式:LESREG,SRC功能:REG←(SRC),ES←(SRC+2)与指令LDS功能相同,段寄存器选择E
S。例如指令:LESDI,[DI]3)状态标志寄存器传送指令(1)状态标志寄存器低8位送AH指令LAHF格式:LAHF
功能:AH←(PSW的低字节),不影响状态标志位。(2)寄存器AH送状态标志寄存器低8位指令SAHF格式:SAHF功能:PS
W的低字节←(AH),影响状态标志寄存器的低8位,由装入的数值确定。(3)状态标志寄存器压栈指令PUSHF格式:PUSHF功
能:SP←(SP)-2,(SP)+1,(SP)←(PSW),不影响状态标志位。(4)状态标志寄存器弹栈指令POPF格式:POP
F功能:PSW←((SP)+1,(SP)),SP←(SP)+2,由装入的数确定状态标志寄存器的值。4)输入输出指令主要有两
条,即输入指令IN和输出指令OUT,用以实现累加器AL或AX与外设端口之间的数据传送。(1)输入指令IN格式:INAL,P
ORTINAX,PORTINAL,DXINAX,DX功能:AL←(PORT)AX←(PORT+1,P
ORT)AL←((DX))AX←((DX)+1,(DX))其中PORT是I/O端口地址,在00H~0FFH之间,当端口地址为
0100H~0FFFFH时,必须使用寄存器DX寻址,不影响状态标志位。(2)输出指令OUT格式:OUTPORT,ALOU
TPORT,AXOUTDX,ALOUTDX,AX功能:PORT←(AL)PORT+1,PORT←(AX)(D
X)←(AL)(DX)+1,(DX)←(AX)端口地址表示同上,例如指令:INAL,35HINAX,60HOUT
40H,ALOUT88H,AX又如指令:MOVDX,03BCHOUTDX,AX2.算术运算指令算术
运算指令分为5种类型,可对4种类型的数据进行运算,即无符号二进制数、带符号二进制数、无符号压缩型BCD码和无符号非压缩型BCD码。
二进制数可以是8位或16位,十进制数以字节为单位参加运算。对于单操作数指令不允许使用立即数;对于双操作数指令至少有一个操作数在寄存
器中,另一个操作数可使用任意寻址方式,立即数不能作为目的操作数。运算结果影响状态标志位。1)加法指令(1)加法指令ADD格式
:ADDDST,SRC功能:DST←(DST)+(SRC)源操作数可以是寄存器、存储器和立即数,目的操作数可以是除立即数之
外的其它任何寻址方式,但是两存储器单元之间不能直接相加;允许段跨越;源/目操作数位数必须相同,可以是8位、16位或者32位;ADD
指令不区分两个加数是无符号数还是带符号数,运算结果的二进制形式相同,影响状态标志位。例如指令:ADDAL,25H;寄存器
AL中的8位数与立即数25H相加,结果在AL中ADDAL,[BX];DS和BX所指定单元中的数与寄存器AL中的8位数相加,结
果在AL中又如指令:ADDAX,BX;两个寄存器中的数相加,结果在AX中(2)带进位加法指令ADC格式:ADCDST
,SRC功能:DST←(DST)+(SRC)+CF,CF表示进位标志位,其值加到两数和的最低位。(3)加1指令INC格式:I
NCDST功能:DST←(DST)+1操作数可以是除立即数之外的其它寻址方式,可以字节运算,也可以字运算,不区分无符号数还
是带符号数;允许段跨越;影响除CF之外的其它状态标志位。2)减法指令(1)减法指令SUB格式:SUBDST,SRC功
能:DST←(DST)-(SRC)源操作数可以是寄存器、存储器和立即数,目的操作数可以是除立即数之外的其它任何寻址方式,但是两存
储器单元之间不能直接相减;允许段跨越;源/目操作数位数必须相同,可以是8位,也可以是16位;SUB指令本身不区分操作数是无符号数还
是符号数,运算结果的二进制形式相同,影响状态标志位。例如指令:SUBAX,[BX];寄存器AX中的数减去由DS和寄存器BX所
指定单元中的数,结果在AX中(2)带借位减法指令SBB格式:SBBDST,SRC功能:DST←(DST)-(SRC)-C
F;被减数减去减数,同时再减进位位CF的值。(3)减1指令DEC格式:DECDST功能:DST←(DST)–1操作数同
INC指令。例如指令:DECCX(4)求补指令NEG格式:NEGDST功能:DST←0–(DST)操作数同INC
指令,影响所有状态标志位,操作数为零时CF=1,其它情况下CF=0。例如指令:NEGAX(5)比较指令CMP格式:CMP
DST,SRC功能:(DST)–(SRC);置状态标志位,不送结果操作数同SUB指令,影响状态标志位。3)乘法指
令(1)无符号数乘法指令MUL格式:MULSRC功能:AX←(AL)×(SRC)字节操作DX,AX←
(AX)×(SRC)字操作源/目操作数均为无符号数,目的操作数必须是累加器AX或AL,源操作数是除立即数之外的其它寻址方
式,源操作数允许段跨越,除OF和CF之外的状态标志无定义,指令执行后若乘积的高字/高字节为0,OF=CF=0;否则,OF=CF=1
。例如指令:MULAL;执行(AL)×(AL),结果在AX中MULBX;执行(AX)×(BX),结果在DX、AX中
(2)带符号数乘法指令IMUL格式:IMULSRC源/目操作数为带符号数。其它与指令MUL相同,指令执行后除OF和CF之
外的标志无定义,若乘积的高字/高字节是符号扩展位时,则OF=CF=0;否则,OF=CF=1。4)除法指令(1)无符号数除法指令
DIV格式:DIVSRC功能:AL←(AX)/(SRC)的商AH←余数AX←(DX,AX)/(SRC)的商DX←
余数字节运算时16位的被除数存放在AX中,字运算时32位的被除数在DX,AX中,若被除数的长度不是除数的2倍,被除数高位补0,除
数可以是除立即数之外的其它寻址方式,允许段跨越,所有状态标志位无定义。(2)带符号数除法指令IDIV格式:IDIVSRC
操作数是带符号数。被除数的长度不是除数的2倍时,被除数高位符号扩展,其它与DIV指令相同。例如指令:IDIVBL(AX)
和(BL)为带符号的补码数,指令执行后AL←商,AH←余数(3)CBW符号位扩展指令格式:CBW字节转换为字CWD
字转换为双字功能:字节扩展AH←(AL)的符号位字扩展DX←(AX)的符号位源/目操作数地址隐含为AH与AL、DX与A
X,不影响状态标志位。5)十进制调整指令BCD码数据按一般算术运算操作后,必须使用调整指令对其修正,该类指令有6条。(1)非
压缩BCD码加法调整指令AAA格式:AAA功能:AL←把AL中的和调整成非压缩BCD码格式AH←(AH)+调整产生的进位值
两非压缩BCD码执行指令ADD、ADC、INC后,结果在寄存器AL中,用指令AAA调整;影响状态标志CF和AF,其余标志位无定义。
例如指令:ADDAL,BLAAA(2)压缩BCD码加法调整指令DAA格式:DAA功能:AL←把AL中的和调整成压缩B
CD码格式两压缩BCD码执行指令ADD、ADC、INC后,结果在寄存器AL中,用指令DAA调整;状态标志OF无定义,影响其余状态
标志位。例如指令:ADDAL,BLDAA(3)非压缩BCD码减法调整指令AAS格式:AAS功能:AL←把AL中的差
调整成非压缩BCD码格式AH←(AH)-调整产生的借位两非压缩BCD码执行指令SUB、SBB、DEC后,结果在寄存器AL中,用
指令AAS调整;影响状态标志CF和AF,其余标志位无定义。(4)压缩BCD码减法调整指令DAS格式:DAS功能:(AL)←把
AL中的差调整成压缩BCD码格式两压缩BCD码执行指令SUB、SBB、DEC后,结果在寄存器AL中,用指令DAS调整;状态标志O
F无定义,影响其余标志位。(5)非压缩BCD码乘法调整指令AAM格式:AAM功能:AX←把AL中的乘积调整成非压缩的BCD码
格式两非压缩BCD码执行指令MUL后,结果在寄存器AL中,用指令AAM调整;调整后十位数在AH中,个位数在AL中;影响状态标志S
F、ZF和PF,其余标志位无定义。例如指令:MULAL,BL AAM(6)非压缩BCD码除法调整指令AAD格式:AA
D功能:AL←10×(AH)+(AL)AH←0在指令DIV之前使用,被除数是两位非压缩BCD码,存放在AX中,AH中存放十位
数字,AL中存放个位数字,除数是一位非压缩的BCD码,高4位均为0;用指令AAD调整,调整结果在AL中,AH中清0;执行其后的DI
V指令后,AL中为一位非压缩BCD码的商,AH中为一位BCD码的余数;影响状态标志SF、ZF和PF,其余OF、CF和AF标志位无定
义。3.逻辑运算与移位指令逻辑运算与移位指令有13条,分为3种类型,即逻辑运算指令、移位指令和循环移位指令,可对8位16位
寄存器或存储器中的数据进行操作。1)逻辑运算指令逻辑运算指令有5条,其中源/目操作数地址同算术运算指令。(1)逻辑“与”指令
AND格式:ANDDST,SRC功能:DST←(DST)∧(SRC)使状态标志CF和OF清0,AF无定义,SF、ZF和P
F由运算结果设置,若源操作数中某些位为0时,可使目的操作数的相应位清0。例如指令:ANDAX,111011110111
1111B;使AX中第7、12位清0,其余位不变(2)逻辑“或”指令OR格式:ORDST,SRC功能:DST←(DST)
∨(SRC)对状态标志位的影响同AND指令;若源操作数中某些位为1,可使目的操作数的相应位置1。例如指令:ORBX,0
001000010000000B;使BX中第7位、12位置1,其余位不变。(3)逻辑“异或”指令XOR格式:XORD
ST,SRC功能:DST←(DST)⊕(SRC)对状态标志位的影响同AND指令;若目的操作数与自身“异或”,结果清0;某位与1
“异或”,该位“取反”。例如指令:XORAL,10100000B;使AL的第5、7位取反,其余位不变。(4)逻辑“非
”指令NOT格式:NOTDSTDST功能:DST←()不影响标志位。(5)TEST测试指令格式:TEST
DST,SRC功能:(DST)∧(SRC)置状态标志,不送结果用来测试目的操作数中某位是否为“1”;执行过程与AND指
令相同,设置状态标志,但是不送结果。例如指令:TESTAX,0040H;测试AX中第6位是否为12)移位指令移位指令有4
条,包括算术/逻辑左移与右移,其作用如图4.10所示。图4.10移位指令(1)算术左移指令SAL格式:SALDST,C
NT功能:左移,如图4.10(a)所示,相当于操作数乘以2。其中DST可以是除立即数之外的任一种寻址方式,移位次数由CNT决定
,CNT可以是1或寄存器CL;若移位次数大于1,应事先把移位次数置于寄存器CL中;DST可以是字节,也可以是字;影响状态标志CF、
SF、PF和ZF,AF无定义,OF在CNT=1时有效。SALBL,1;BL左移1位,相当于(BL)×2MOVCL,
3;移位次数送CL;SALBL,CL;BL左移动3位,空位补0(2)算术右移指令SAR格式:SARDST,CNT
功能:右移,如图4.10(b)所示,相当于操作数除以2。操作数和对状态标志位的影响同指令SAL。(3)逻辑左移指令SHL格式
:SHLDST,CNT功能:左移,如图4.10(c)所示,相当于无符号数乘2。操作数和对状态标志位的影响同指令SAL。(
4)逻辑右移指令SHR格式:SHRDST,CNT功能:右移,如图4.10(d)所示,相当于无符号数除2。操作数和对状态标
志位的影响同指令SAL。例如指令:SHRAL,1;AL右移1位,相当于(AL)/23)循环移位指令循环移位指令有4条,
包括带进位/不带进位的循环左移与右移,其作用如图4.11所示。(1)循环左移指令ROL格式:ROLDST,CNT功能:循
环左移,如图4.11(a)所示。影响状态标志位CF,OF只在CNT=1时有效,不影响SF、PF、ZF和AF。(2)循环右移指令
ROR格式:RORDST,CNT功能:循环右移,如图4.11(b)所示。对状态标志的影响,同指令ROL。(3)带进位循
环左移指令RCL格式:RCLDST,CNT功能:带进位循环左移,如图4.11(c)所示。对状态标志的影响,同指令ROL。(4)
带进位循环右移指令RCR格式:RCRDST,CNT功能:带进位循环右移,如图4.11(d)所示。对状态标志的影响,同指令ROL
。4.串操作指令串操作指令是针对字符串处理的指令,可以是字节串,也可以是字串,处理字符的长度可达64KB。串操作指令隐含寄存
器和标志位的作用如表4.4所示。串操作指令有5条,重复前缀有3条。表4.4串指令的寄存器和标志位作用寄存器作用SI源
串变址寄存器,段地址在DS中(允许段超越前缀修改)DI目的串变址寄存器,段地址在ES中(不允许修改)CX重复执行次数计数器AL/A
XLODS指令目的操作数,STOS指令的源操作数FLAGDFDF=0时SI、DI自动增值(字节增1,字增2)DF=1时SI、
DI自动减值(字节减1,字减2)ZF控制比较/扫描操作结果1)串传送指令MOVS格式:MOVSDST,SRCMOVSB
(字节)MOVSW(字)功能:(DI)←((SI))字节操作:SI←(SI)±1,DI←(DI)±1字操作:SI←
(SI)±2,DI←(DI)±2指令MOVS在操作数地址的前面用关键字BYTE/WORDPTR说明是字节传送还是字传送;当标志
位DF=0时,地址递增;DF=1时,地址递减;不影响状态标志位。2)串比较指令CMPS格式:CMPSSRC,DSTCMPS
B(字节)CMPSW(字)功能:((SI))-((DI))置状态状态标志,不送结果字节操作:SI←(SI)±1,D
I←(DI)±1字操作:SI←(SI)±2,DI←(DI)±2对状态标志的影响,同指令MOVS。3)串扫描指令SCAS格式
:SCASDSTSCASB(字节)SCASW(字)功能:用AL/AX中的数据减去DI指示的数据,置状态标志,但
不送结果。字节操作:(AL)-((DI)),DI←(DI)±1字操作时:(AX)-((DI)),DI←(DI)±2对状态标
志的影响,同指令MOVS。4)串装入指令LODS格式:LODSSRCLODSB(字节)LODSW(字)功能
:从相应段寄存器和SI指示的存储器单元读取数据,送入AL/AX中。字节操作:(AL)←((SI)),SI←(SI)±1字操
作:(AX)←((SI)),SI←(SI)±2对状态标志的影响,同指令MOVS。5)串存储指令STOS格式:STOSD
STSTOSB(字节)STOSW(字)功能:把AL/AX中的数据传送到相应段寄存器和DI指示的存储器单元中。字节
操作:(DI)←(AL),DI←(DI)±1字操作时:(DI)←(AX),DI←(DI)±2对状态标志的影响,同指令MOVS。
6)串重复前缀指令串重复前缀指令有三条,用来修饰串操作指令,使之重复执行。(1)重复前缀指令格式:REPString
primitive;用于指令MOVS、LODS或STOS,CX←(CX)-1,若(CX)=0时退出,否则重复执行。(2)相等时重
复前缀指令格式:REPE/REPZStringprimitive;用于指令CMPS或SCAS,CX←(CX)-1,若(C
X)=0或ZF=0(两数不相等)时退出,否则重复执行。(3)不相等时重复前缀指令格式:REPNE/REPNZString
primitive;用于指令CMPS或SCAS,(CX)←(CX)-1,若(CX)=0或ZF=1(两数相等)时退出,否则重复执行
。5.控制转移指令控制转移指令有28条,分5种类型,主要用于控制程序的执行流程。1)转移地址寻址方式这种寻址方式主要用
来确定转移指令和子程序调用指令CALL的目标地址,其目标地址可能在当前代码段内,也可能在当前代码段外,故有4种方式。(1)段内
相对寻址段内相对寻址是指程序中转移地址由指令指针IP的当前值与指令中给出的8位或16位偏移量相加而生成。偏移量是一个带符号的数,
用补码表示。其中8位偏移量称为段内短转移SHORT,转移范围为-128~+127;16位偏移量称为段内近转移NEAR,转移范围为-
32768~+32767。段内相对寻址的特点是代码段寄存器CS的值保持不变。指令格式如下:JMPSHORTOPR;IP←
(IP)+8位偏移量JMPNEARPTROPR;IP←(IP)+16位偏移量(2)段内间接寻址段内间接寻址是指转
移指令的偏移地址在一个16位的寄存器或存储器单元中。该寄存器或存储器单元可由数据寻址方式中除立即数之外的任何一种方式得到。例如指令
:JMPBX;把寄存器BX中的数送入指令指针IP中又如指令:JMPWORDPTR[BX][SI];按基址加变址获
取操作数,送IP(3)段间直接寻址段间直接寻址是在指令中直接给出转移的16位段地址和16位偏移地址,分别送入代码段寄存器CS和
指令指针寄存器IP中。例如指令:JMPFARPTRNEXTSUB段间寻址由FAR说明,其中NEXTSUB是符号地
址,在指令中直接给出,包括转移目标的偏移地址和段地址。(4)段间间接寻址在段间间接寻址方式中,转移地址存放在存储器中的两个连
续字单元中,其中第一个字是偏移地址,第二个字是段地址。存储器单元地址可用数据寻址方式中除立即数和寄存器直接寻址以外的任何一种寻址方
式来确定。例如指令:JMPDWORDPTR[BX]2)无条件转移指令仅有1条,无条件地转移到目标地址,可以段内转
移,也可以段间转移,对状态标志位无影响。格式:JMPOPR其中OPR为标号功能:段内转移IP←OPR偏移地址,CS不
变段间转移CS←OPR段地址,IP←OPR偏移地址3)条件转移指令共有18条,如表4.5所示,分为单标志转移指令、无符号
数比较转移指令和带符号数比较转移指令。是以上一条指令执行后状态标志寄存器(PSW)中的标志位Z、C、O、S及PF的值决定是否转移,
且属段内短转移,目标地址的相对偏移量为-128~+127字节,对状态标志位无影响。表4.5条件转移指令 助记符
转移条件功能 单标志转移指令 JZ/JEOP
R ZF=1结果为0,转移到OPR JNZ/JNEOPR ZF=0结果不为0,转移到OPR JCOPR
CF=1有进位,转移到OPR JNCCF=0无进位,转移
到OPR JOOPR OF=1有溢出,转移到OPR JNOOPR OF=0无溢出,转移
到OPR JSOPR SF=1结果为负,转移到OPR JNSOPR
SF=0结果为正,转移到OPR JPE/JPOPR PF=1奇偶标志为1,转移到OPR JPO/JNPO
PR PF=0奇偶标志为0,转移到OPR 表4.5条件转移指令 助记符转移条件
功能 无符号数比较转移指令 JA/JNBEOPR CF=0或
ZF=0 被减数高于减数,转移到OPR JNA/JBEOPR CF=1或ZF=1 被减数低于或等于减数,转移到OPR JNAE
/JBOPR CF=1被减数低于减数,转移到OPR JAE/JNBOPR CF=0被减数不低于减数,转移到OPR 带符号
数比较转移指令 JL/JNGEOPR SF⊕OF=1 被减数小于减数,转移到OPR JNL/JGEOPR SF⊕OF=0
被减数大于或等于减数,转移到OPR JLE/JNGOPR ZF=1或SF⊕OF=1 被减数小于或等于减数,转移到OPR JNL
E/JGOPR ZF=0且SF⊕OF=0 被减数大于减数,转移到OPR4)循环控制指令用于控制程序重复执行,以寄存器CX中
的值或CX与ZF标志位的值结合,作为转移条件,属段内短转移,目标地址的相对偏移量为-128~+127字节。(1)循环指令格式
:LOOPOPR功能:CX←(CX)―1,测试(CX)≠0,转移到标号处继续循环,否则退出循环。(2)相等或为0时转移格
式:LOOPZ/LOOPEOPR功能:CX←(CX)―1,测试(CX)≠0且ZF=1,转移到标号处继续循环,否则退出循环。
(3)不相等或不为0时转移格式:LOOPNZ/LOOPNEOPR功能:CX←(CX)―1,测试(CX)≠0且ZF=0,转
移到标号处继续循环,否则退出循环。(4)测试转移指令格式:JCXZOPR功能:测试(CX)=0,转移到标号处继续循环,否
则顺序执行。5)子程序调用与返回指令子程序通过指令CALL调用,执行完后,通过指令RET返回,不影响状态标志位,有4种寻址方式
,可以段内调用,也可以段间调用。(1)子程序调用指令格式:CALLDST;DST为子程序名(也称为过程名)功能:①段内
调用SP←(SP)―2(SP)+1,(SP)←(IP);返回地址压栈IP←DST偏移地址②段间调用SP←(SP)―2
(SP)+1,(SP)←(CS);返回段地址压栈SP←(SP)―2(SP)+1,(SP)←(IP);返回偏移地址压栈IP←
DST偏移地址CS←DST段地址(2)子程序返回指令RET作为子程序执行的最后一条指令,是从堆栈中弹出断点地址,装入IP或I
P与CS中。该指令可以不带参数,也可以带参数。对于带参数的指令RETN,除了完成RET功能外,还使堆栈指针SP移动N个偶数字
节单元。格式:RET或RETN;其中N是一个整型表达式功能:①段内返回IP←((SP)+1,(SP))SP←(S
P)+2带参数返回时还要再执行下面的一步操作SP←(SP)+N②段间返回IP←((SP)+1,(SP))
SP←(SP)+2CS←((SP)+1,(SP))SP←(SP)+2带参数返回时还要再执行下面的一步操作S
P←(SP)+N6)中断指令(1)中断指令INT格式:INTOPR功能:PSW、CS、IP压栈,IP←(OPR×4),
CS←(OPR×4+2)其中OPR为中断类型码,其值在0~255范围内。(2)溢出中断指令INTO格式:INTO功能:PS
W、CS、IP压栈,IP←(10H),CS←(12H)(3)中断返回指令IRET格式:IRET功能:弹栈,弹出内容送IP、C
S、PSW,即返回到原来被中断的位置,继续执行原来的程序。中断指令INT和溢出中断指令INTO只影响控制标志IF和TF,使IF=
TF=0,不影响其它标志位;中断返回指令IRET影响所有标志位。7)处理器控制指令处理器控制指令只完成控制功能,不设地址码,共
有12条,分为两类,其中标志类指令影响相应状态标志位外,其余指令不影响状态标志位,如表4.6所示。表4.6处理器控制指令指令类型
助记符格式功能说明标志操作指令STD方向标志置1(地址减量)DF=1CLD方向标志清0(地址增量)DF=0ST
C进位标志置1CF=1CLC进位标志清0CF=0CMC进位标志取反CF=CFSTI中断允许标志置1(开中断)IF=1CL
I中断允许标志清0(关中断)IF=0系统控制指令ESC换码,向外处理器提供数据或指令HLT处理器暂停,直到出现中断复位信号N
OP空操作,占有一个字节,不执行任何操作LOCK总线锁定WAIT等待状态,定期检查TEST信号4.3.2汇编语言程序设计1.
汇编语言程序格式一个完整的汇编语言程序往往需要分成若干段来书写,每一段由一系列语句组成。在一般情况下,格式如下:NAME1
SEGMENT语句1…NAME1ENDSNAME2SEGMENT语句…NAME2ENDSEND[
标号]其中,NAME1,NAME2分别为段名,由段定义伪指令SEGMENT/ENDS来说明,最后的END是程序结束伪指令。任
何一个汇编语言源程序必须有一个逻辑代码段和一条指示源程序结束的伪指令END。堆栈段、数据段和附加段可根据程序的需要选用。2.汇
编语言语句格式在汇编语言程序中,指令又称为语句,格式如下:[标号:]操作码[操作数1],[操作数2][;注释]其中各字
段之间用空格隔开,两个操作数之间用逗号隔开,方括号表示可选项。(1)标号:又称为名字,由字母开头的字符串组成,冒号“:”结束,表
示一条指令的符号地址。标号最长31个字符,由字母A~Z、数字0~9和一些特殊字符?、.、@、_、$组成。但是数字不能作为标号的第一
个字符,圆点仅能用作标号第一个字符。(2)操作码:用指令助记符表示,说明指令的作用,比如MOV、ADC等。如果带有前缀,需用空格
分开。(3)操作数:可有一个、两个或者没有。当操作数有两个时,用逗号“,”分开。操作数可以是常数、寄存器名、标号、变量或表达式等
(4)注释:以分号“;”开头,位于操作数之后或下一行的开头,是对语句或程序的说明,仅在源程序清单中列出,供编程人员阅读,不作其它
处理。3.常用伪指令伪指令用来对程序和汇编过程进行说明,不生成目标代码,常用的有以下几条。(1)符号定义伪指令EQU格式
:符号名EQU表达式(或符号名)功能:将符号名定义为一个常量、数值表达式或一条可执行的指令;以后使用该符号名
时,即引用它所表示的常量、表达式或可执行的指令。例如语句:DAEQU1234H;数1234H赋给符号DA在EQU语
句的表达式中,若有符号名,则该符号名必须事先定义。(2)赋值伪指令=格式:符号名=表达式(或符号名)功能:与EQU语句类似
,二者的主要区别在于EQU中的符号不允许重复定义,而“=”允许符号名重复定义。例如语句:EXP=5;EXP的值为5EXP=EX
P+5;EXP的值为10(3)段定义伪指令SEGMENT/ENDS格式:段名SEGMENT[定位类型][组合类型][‘
类别’]……语句序列(程序或数据)段名ENDS功能:标志汇编语言源程序段的开始和结束,段名由用户自己定义,但是开始和
结尾的段名必须一致;在段的说明部分应说明定位类型,组合类型和类别名,也可以缺省。(4)指定段寄存器伪指令ASSUME格式:A
SSUME段寄存器名:段名,…[,段寄存器名:段名]功能:指定段与段寄存器之间的关系,但不能把段地址装入段寄存器中。例如语句:
ASSSUMECS:CODE,DS:DATA1,ES:DATA2;指定CS为CODE段,DS为DATA1段,ES为DATA2
段。(5)过程定义伪指令PROC/ENDP格式:过程名PROC[NEAR/FAR]……RET过程名ENDP功能:定
义一个过程,并说明它是NEAR或FAR类型。(6)程序结束伪指令END格式:END[标号]功能:标志源程序结束,即汇编结
束,可选项标号指明程序开始执行的起始地址。(7)定义段起始偏移地址伪指令ORG格式:ORG常数表达式功能:指定段起始偏
移地址。例如语句:ORG30H;定义下面DATA1的起始偏移地址为30HDATA1DB34H,56H,’ABCD’
DATA2DW1234H,’EF’……又如语句:ORG$+10;由当前地址向前跳过10个字节单元。此外,常
用的还有DB、DW、DD、DQ和DT。其中:DB用来定义字节数据存储区;DW用来定义字数据存储区;DD用来定义双字数据存储区;
DQ用来定义4字数据存储区;DT用来定义10字节数据存储区。4.程序设计举例【例4.1】若在主存TABLE起始的区域中存放有
1K字节的数据,试编程将该数据块传送到NEXT起始的区域中。解:设置源/目操作数起始地址,然后使用重复传送指令,编程如下:MOVAX,SEGTABLE;SEG是取值运算符,将TABLE标号所在段的段地址送入累加器AX中MOVDS,AXMOVAX,SEGNEXTMOVES,AXMOVSI,OFFSETTABLE;OFFSET是取值运算符,将TABLE所在段内偏移地址送入寄存器SI中MOVDI,OFFSETNEXTMOVCX,1024CLD;使DF=0,地址自增REPMOVSB【例4.2】试编写程序,计算双字4A750000H+78912365H之和。解:按照双字操作,由寄存器DX和AX组成32位累加器,先用ADD指令进行低字运算,再用ADC指令进行高字运算,程序如下:MOVAX,0000HMOVDX,4A75HADDAX,2365HADCDX,7891H【例4.3】将DAT1和DAT2两个字节单元的无符号数相乘,乘积存入DAT3字单元中。解:DAT1、DAT2和DAT3是符号地址,直接使用符号地址编程,程序如下:MOVAL,DAT1MULDAT2MOVDAT3,AX【例4.4】编写程序,求1+2+3+…+100的累加和,结果保存在AX寄存器中。解:采用循环累加的方法编程,程序如下:MOVAX,0MOVCX,100LP:ADDAX,CXLOOPLP【例4.5】在内存中自NUM开始的10个单元中连续存放着0~9的平方值(平方表),任给一个数x(0≤x≤9),在X单元中,查表求x的立方值,结果存放到单元Y中。解:程序如下:DATASEGMENTNUMDB0,1,4,9,16,25,36,49,64,81XDB?YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA;分配段寄存器STARTMOVAX,DATAMOVDS,AXLEABX,NUMMOVAH,0;取操作数MOVAL,XADDAX,BXMOVAL,[BX];查表MOVY,AL;存结果MOVAH,4CHINT21HCODEENDSENDSTART其中DATA—DATA是数据段,CODE—CODE是程序代码段,ASSUME是一条伪指令,用来分配段寄存器;INT21H是一条中断指令,MOVAH,4CH用来设置功能号,程序执行完后返回DOS系统。【例4.6】设某数据块存放在BUFFER开始的100个字节单元中,试编程统计数据块中负数的个数,并将统计的结果存放到NUMBER单元中。解:程序如下:START:MOVAX,DATAMOVDS,AXLEASI,BUFFER;设置数据块指针MOVCX,100;设置循环次数MOVBL,0LOOP1:MOVAL,[SI];取数据ORAL,AL;设置状态标志位JNSLOOP2;非负转移INCBL;计数器加1LOOP2:INCSI;修改指针LOOPLOOP1;CX←(CX)-1,若CX≠0,继续循环MOVNUMBER,BLENDSTART【例4.7】DOS功能调用,首先由键盘输入20个字符,然后按键盘输入的顺序输出显示出来。解:首先在执行DOS功能调用指令INT之前设置功能号01H,输入字符;再设置功能号02H输出显示,程序如下:DATASEGMENTBUFDB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS,DATASTART:MOVAX,DATAMOVDS,AXMOVCX,20MOVSI,OFFSETBUFL1:MOVAH,01HINT21H;键盘输入并回显MOV[SI],ALINCSILOOPL1MOVCX,20MOVSI,OFFSETBUFL2:MOVDL,[SI]MOVAH,02HINT21H;输出显示INCSILOOPL2MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
献花(0)
+1
(本文系太好学原创)