1、第四章 8086寻址方式与指令系统,4.1 汇编语言和汇编程序的基本概念 4.2 8086寻址方式 4.3 8086的指令格式 4.4 8086指令系统,4.1.1汇编语言与机器语言我们已经学过高级语言,例如BASIC语言、FORTRAN语言或C语言,无论哪种语言,它都规定了一系列用于编写程序的语句和应该遵循的语法规则。人们根据一种语言给定的语句及其语法规则就可以写出程序,计算机则通过执行已编好的程序来完成人们要求它完成的各种复杂功能。汇编语言也一样,根据汇编语言的语句及其语法规则可以写出汇编语言程序。但汇编语言与高级语言有较大的区别,汇编语言中的语句与机器的种类和型号密切相关。,4.1 汇编
2、语言及汇编程序的基本概念,在高级语言中,完成某个加法功能,我们可采用语句X=A+B,只要给变量A和B赋一确定值,此加法就可以实现了。在汇编语言中则不同,程序必须指出A,B存放在何处,相加后的结果又存放在何处,然后才能实现这一加法运算。显然,汇编语言在通过程序告诉计算机做什么和如何做时,显得更加具体。正是这种具体,使得该语言与计算机(处理器)紧密相关,从而也要求学习和使用汇编语言的人对处理器的结构有更加深入的了解。那么,什么是机器语言,汇编语言与机器语言之间又有什么关系呢? 我们说,机器语言是这样一种语言,它的每条语句就是计算机可以直接执行的一条指令,这些指令以二进制码的形式表示。例如我们要将累
3、加器AX中加上一个常数 02, 其二进制码表示的指令为:,000001010000001000000000。也就是说,当处理器中取得了这样一组指令代码时,它将自动地完成(AX)+2(AX)中的操作。处理器所以能这样是因为处理器在设计时,就考虑了这样一组代码应完成的功能。自然,不同的处理器,指令的机器码将各不相同,完成的具体功能也将各不相同。采用机器语言编写程序的一个最大好处是,程序送入计算机后,可以直接执行。但是,我们很快会感觉到, 采用机器语言编写程序是多么困难,既不易书写,也不易检查。汇编语言正是为了克服这一缺点而形成的一种与机器语言直接相关的语言。汇编语言的基本思想是采用一组字母、数字或
4、符号来代替一条二进制码表示的指令,例如上面所述的指令可采用字符ADD AX, 02 来代替,它表示将累加器AX中的内容加上一个常数 02。 显然,这要比一串二进制码清晰多了,既容易书写,也容易记忆。,表示一条指令的这些字符常称为助记符。我们必须指出,采用助记符写出的程序,机器是不能直接执行的,因为上面我们已经指出,处理器在设计时是按二进制指令码考虑的。所以,采用汇编语言编写的程序在执行前还必须将其“翻译”成机器语言。通常将采用助记符指令写成的程序,称为源程序,将它翻译成的机器语言程序称为目标程序。将汇编语言的源程序翻译成目标程序的过程称为汇编过程或简称汇编。 汇编过程通常是由计算机完成的。它是
5、通过执行一个专门完成汇编的软件 称为汇编程序来实现的。既然写出的源程序要由汇编程序将其翻译后才能执行,所以,我们编写的源程序必须符合汇编程序的一系列要求或者规则,只有这样,你的程序才能被正确地“翻译”。,所以,汇编语言的一系列规则是与“翻译”软件汇编程序相关的。汇编语言的语句有两种基本类型,即指令与伪指令。指令可由汇编程序翻译成机器语言指令,例如上例中的ADD AX, 02,汇编后将形成一条机器语言指令05 02 00(十六进制码), 所以,汇编语言中的指令与机器语言指令基本上是一一对应的。伪指令则不汇编成机器语言指令,仅仅在汇编过程中告诉汇编程序应如何汇编。例如告诉汇编程序已写出的汇编语言源
6、程序有几个段,段的名称是什么,是否采用过程,汇编到某处是否需要留出存储空间,应留多大,是否要用到外部变量等。,所以,伪指令是为汇编程序在汇编时用的。但指令与伪指令都是组成汇编语言源程序的基本语句。除了这两类基本语句外,在汇编语言中,还存在另一类指令称为宏指令,它是使用者利用上述基本语句自己定义的新的指令。,4.1.2 各种计算机语言的比较,机器语言 用机器码表示,例如B8H、C3H。汇编语言用指令助记符表示机器码,例如对应于机器码B8H、C3H的助记符为MOV AX,BX 。 CPU不同,机器码不同,助记符也不同。高级语言语言规范,可移植。,4.1.3 汇编语言与汇编程序,汇编语言汇编语言源程
7、序用助记符表示机器码用符号地址表示存储器地址 用伪指令管理源程序 汇编程序 将汇编语言源程序(简称源程序)编译为机器所能识别的目标代码的系统程序。如 MASM.EXE 。,汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O 端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快 。,1、 汇编语言,2、 汇编程序用
8、汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。有基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。,汇编语言指令的特点,语法结构符合人类语言的共同特点 动作对象 指令操作码动作:做什么? 指令操作数对象:针对什么做动作?,机器指令:指令的二进制代码形式。如:89D8H 汇编指令
9、:助记符形式的指令。如:MOV AX,BX,汇编语言指令,操作码助记符: 与动作一一对应,例: MOV AX,BX,目/源操作数: 可能有多种组合,汇编语言指令,操作码:由CPU设计人员定义。每一种操作唯一对应一个操作码。 例:加法操作助记符ADD; 数据传送操作助记符MOV; 比较操作助记符CMP 操作数:可由编程人员采用不同方式给出。 寻址方式:寻找操作数(操作数地址)的方式; 指令格式:指令中对操作码、操作数的编码方式。,操作数,1. 8086指令中操作数的个数可以有以下几种情况 无操作数指令,例:等待指令 WAIT 单操作数指令,例:加1指令 INC AL 双操作数指令,例:减法指令
10、SUB AL,BL 源操作数:后者(BL) 目的操作数:前者(AL),2、操作数存放地点,可以有以下几种:,立即数:操作数直接包含在指令中。例:MOV AL,50H,寄存器操作数:操作数存放在寄存器中。例:INC AL,内存操作数:操作数存放在内存单元中。例:MOV AL,2000H,I/O 操作数:操作数来自I/O端口。例:IN AL,28H,操作数,4.2 8086寻址方式,给出操作数的可能的方式:由操作码隐含地指定 由指令直接给出操作数 存放于CPU内部的寄存器中 存放于存储器单元内 来自I/O端口,8086寻址方式(续),非存储器寻址方式,存储器寻址方式,其它寻址方式, 固定寻址、相对
11、寻址、I/O端口寻址,寄存器相对寻址方式,(基址加变址相对寻址),8086寻址方式,一、非存储器寻址方式(以8086为例,下同) 1、立即数寻址方式源操作数以8位或16位常数的形式直接出现在指令中。一般用于赋值。 例:MOV AL,5FH 2、寄存器(直接)寻址方式8位或16位寄存器的值就是操作数本身。与其它寻址方式相比,该方式执行速度最快。 例: MOV SI,DX,立即数可以用二进制数、八进制数、十进制数以及十六进制数来表示。在非十进制的立即数末尾需要使用字母加以标识。必要情况下,十进制数用字母D加以标识, 通常情况下不需要标识。 如: MOV AL, 10 ; 十进制数()MOV AL,
12、 00100101B ; 二进制数()MOV AL, 0AH ; 十六进制(),8086寻址方式(续),二、存储器寻址方式 1、直接寻址方式操作数存放在存储器单元中,由指令直接给出该单元的有效地址EA(即16位段内偏移量)。 例:MOV AX,0016H 寻址过程示意 2、寄存器间接寻址方式操作数存放在存储器单元中,指令给出的16位寄存器值就是该单元的EA。 例: MOV BX,CL,寻址过程示意,直接寻址过程示意图,Bit 19 4 3 0,20 位 物 理 地 址,Memory,MOV AX,0016H,寄存器间接寻址过程示意图,MOV BX,CL ( 设BX原值为2010H),Bit 1
13、9 4 3 0,20 位 物 理 地 址,Memory,8086寻址方式基址寻址,3、基址寻址方式(寄存器相对寻址方式)使用基址寄存器(BX或BP)、并带位移量的间接寻址。操作数EABX或BP值位移量。 例:MOV DL,BP+2 其它等效写法:MOV DL,BP2MOV DL,2BP 寻址过程示意,基址寻址过程示意图,MOV DL,BP+2 ( 设BP原值为4000H),Bit 19 4 3 0,20 位 物 理 地 址,Memory,8086寻址方式变址寻址,4、变址寻址方式(寄存器相对寻址方式)使用变址寄存器(SI或DI)、并带位移量的间接寻址。操作数EASI或DI值位移量。 例:MOV
14、 SI+10,AH 其它等效写法: MOV SI10,AH MOV 10SI,AH 寻址过程示意,变址寻址过程示意图,MOV SI10 ,AH ( 设SI原值为008CH),Bit 19 4 3 0,20 位 物 理 地 址,Memory,8086寻址方式基址加变址寻址,5、基址加变址(相对)寻址方式使用一个基址寄存器、一个变址寄存器的间接寻址。操作数EABX或BP值 SI或DI值(位移量)。位移量为零,是基址加变址寻址方式;位移量不为零,是基址加变址相对寻址方式。 例:MOV BX+DI+4,CX 其它等效写法: MOV BX+DI4,CX MOV 4BX+DI,CX MOV BXDI4,C
15、X MOV 4BXDI,CX 寻址过程示意,基址加变址寻址过程示意图,MOV BX+DI+4 ,CX ( 设BX原值为1000H,DI原值为0300H),Bit 19 4 3 0,20 位 物 理 地 址,Memory,段寄存器使用规则,段超越前缀 段超越前缀形式为:段寄存器名: 例如:当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 MOV AX,ES:BP ;段地址在ES MOV AX,CS:BX SI ;段地址在CS,8086寻址方式其它方式(1),三、其它寻址方式1、固定寻址(隐含
16、寻址)操作数并不直接出现在指令中,而是由操作码隐含地指定为某一固定内容。 例: PUSH DS 目操作数隐含为栈顶字单元POP BX 源操作数隐含为栈顶字单元LAHF 源操作数隐含为标志寄存器低字节,目操作数隐含为寄存器AH,8086寻址方式其它方式(2),2、相对寻址仅用于进行段内直接转移的控制转移指令。指令中的操作数是一个8位或16位带符号的相对偏移量,代表目标地址与正常执行顺序的原地址之差。目标地址顺序执行的原地址相对偏移量编程时一般使用目标地址的标号作为操作数,不需要计算相对偏移量。例: JNZ NEXT,8086寻址方式其它方式(3),3、I/O端口寻址仅用于I/O指令IN、OUT。
17、长格式I/O寻址端口地址在8位以内时,用端口地址直接做操作数。可寻址的I/O空间为256字节(I/O直接寻址)。例: IN AX,43HOUT 0FH,AL 短格式I/O寻址端口地址超过8位时,固定使用DX做操作数,DX的值就是该16位端口的地址。可寻址的I/O空间为65536字节(I/O间接寻址)。例: IN AL,DXOUT DX,AX,4.3 8086的指令格式,指令的书写格式(以8086为例)操作码助记符 目操作数助记符, 源操作数助记符 (操作码:必备;操作数:可以是1个、2个或没有;可以是8位或16位)指令的编码格式(以8086为例)采用变长编码格式。,4.3.1指令格式每台计算机
18、都有一套反映该计算机全部功能的指令,它构成了该计算机的指令系统。通常指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令。CPU可以直接识别机器指令。对于使用者来说,机器指令记忆、阅读比较困难,为此将每一条指令都用统一规定的符号和格式来表示。用符号表示的指令称为符号指令。符号指令具有直观、易理解、可帮助记忆的特点。汇编语言程序中的指令就是符号指令。在计算机中,符号指令与机器指令具有一一对应的关系。,每条符号指令都由操作码和操作数两部分组成,操作码表示计算机执行某种指令功能,操作数表示操作中所需要的数据或者所需数据与输出数据的存放位置(又称地址码)。,单字节指令(隐含的操
19、作数)单字节指令(寄存器模式)寄存器到寄存器不带位移量的寄存器和内存之间的传送带位移量的寄存器和内存之间的传送(设位移量为 16 位)立即数送寄存器(设立即数为 16 位)立即数送内存(设带 16 位位移量),操作码,操作码 REG,操作码,操作码,操作码,操作码,操作码,11 REG R/M,MOD REG R/M,MOD REG R/M,11 REG R/M,MOD 操作码 R/M,位移量低位,位移量高位,位移量高位,位移量低位,数据低位,数据高位,数据高位,数据低位,REG寄存器 MOD模式 R/M寄存器或内存,1、操作码域: 一般用指令的第一个字节或者头两个字节表示指令的操作码和寻址方
20、式操作码域。,表4-1 8086寄存器编码表,表4-2 MOD和R/M的编码,操作码:指出执行这条指令时,CPU 要做什么操作。(OP)一般用指令的一个字节表示,有时由于用 8 位还不够,常在指令的第二个字节中还可占有 3 位操作码。 指令的第一字节:wd立即方式寻址时,操作码中用 S 位表示符号扩展s=1,将 8 位立即数扩展成 16 位数时,OP d/s w,w=1,对字进行操作 w=0,对字节进行操作,d=1,目的操作数 d=0,源操作数,各字段的含义如下: (1) 操作码字段OPCODE。 操作码字段规定指令的操作类型,说明指令所要完成的操作。同时还指出操作数类型、操作数传送方向、寄存
21、器编码或符号扩展等。 (2) 寻址方式字段。寻址方式字段规定寄存器/存储器操作数的寻址方式。MOD R/M为主寻址字节,它规定操作数存放的位置(R/M)以及存储器操作数有效地址EA的计算方法。,(3) 操作数字段:包括位移量字段DISP和立即数字段DATA。位移量字段DISP: 位移量是存储器操作数段内偏移地址的一部分。DISP字段指出位移量的大小,其长度为1或2个字节。 立即数字段DATA: 立即数字段指明立即操作数的大小,其长度也是1或2个字节。8位立即数与16操作数一起使用时,CPU自动将它扩展为符号相同的16位数。(4) 前缀字段PREFIX。 前缀字段用于修改指令操作的某些性质。常用
22、前缀有五种:, 段超越前缀:将前缀中指明的段寄存器取代指令中默认的段寄存器。 操作数宽度前缀:改变当前操作数宽度的默认值。 地址宽度前缀:改变当前地址宽度的默认值。 重复前缀:重复串的基本操作,以提高CPU处理串数据的速度。 总线锁存前缀:产生锁存信号,以防止其他总线主控设备中断CPU在总线上的传输操作。 每个前缀的编码为一个字节。在一条指令前可同时使用多个指令前缀,不同前缀的前后顺序无关紧要。 上述指令格式中,操作码字段是必要的,其他字段均可有可无, 这取决于特定的操作功能。 ,2、操作数域:操作码域后面所跟的字节一般统 称为操作数域。 2 字节的有效地址(直接寻址); 1 字节或者 2 字
23、节的位移量; 1 字节或者 2 字节的立即数; 1 字节或者 2 字节的位移量,后面再跟 1 字节 或者 2 字节的立即数; 2 字节的位移量和 2 字节的段地址(只对段间接转移而言)。 指令:,单操作数指令 双操作数指令,8086/8088指令系统是80X86/Pentium的基本指令集。指令的操作数是8位或16位操作数,偏移地址是16位地址。按功能可将指令分成六类,即数据传送类、算术运算类、逻辑运算与移位类、 串操作类、控制转移类和处理器控制类。 为便于理解指令的形式和功能, 对指令中操作数符号的约定如下: OPRD: 操作数(Operand); OPRD1,OPRD2:多操作数指令中,O
24、PRD1为目标操作数,OPRD2为源操作数;REG:8位或16位的通用寄存器(Register); SREG:段寄存器(Segment register);,4.4 8086指令系统,REG8:8位通用寄存器;REG16:16位通用寄存器;MEM:8位或16位存储器( Memory);MEM8:8位存储器;MEM16:16位存储器;IMM: 8位或16位立即数(Immediate operand );IMM8:8位立即数;IMM16:16位立即数。,4.4 8086指令系统,4.4 8086指令系统,数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令 输入/输出指令 处理
25、器控制指令 中断指令,4.4.1 数据传送指令,通用数据传送指令MOV 堆栈操作指令PUSH、POP 数据交换指令XCHG 查表指令XLAT 地址传送指令LEA、LDS、LES 标志传送指令LAHF、SAHF、PUSHF、POPF 小结,通用数据传送指令MOV(Movement),功能:将源操作数内容复制到目操作数中。 可使用的操作数类型组合举例:MOV DX,BP ;通用寄存器 通用寄存器 MOV AX,ES ;通用寄存器 段寄存器 MOV SP,1800H ;通用寄存器立即数 MOV BL ,2480H ;通用寄存器 存储器 MOV DS,BXDI ;段寄存器 存储器 MOV BYTE P
26、TR SI,0FH ;存储器立即数,源操作数可以是通用寄存器、段寄存器、存储器以及立即操作数,目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。各种数据传送关系如下图所示。使用MOV指令进行数据传送时应注意:段寄存器CS及立即数不能作为目标操作数;两个存储单元之间不允许直接传送数据;立即数不能直接传送到段寄存器;两个段寄存器之间不能直接传送数据。 ,说明: (1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。 MOV SREG , SREG ;错误MOV MEM ,MEM ;错误,(2)立即数不能传送到段寄存器中。MOV SREG ,IMM ; 错误(3)目的操作数不允许使
27、用CS段寄存器。(4)DEST与SRC必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定内存操作数的类型,需要用BYTE PTR和WORD PTR明确指出是字节或字类型。关于PTR的详细介绍见第5章。只要其中一个操作数的类型确定即可。,例:错误的MOV 指令如下所示: MOV AX,BL ;类型不匹配 MOV DS,1000H ;不允许立即数送段寄存器 MOV BX ,SI ;不允许内存操作数之间传送 MOV ES,CS ;不允许段寄存器之间传
28、送 MOV CS,AX ;CS不能作为目的操作数例:设B是已定义的字节变量,以下是一些错误和正确的指令。 MOV AX,B ;错误,类型不匹配 MOV AL,0 ;正确,MASM可以判断出要,送字节0,堆栈操作指令PUSH/POP (Push word onto stack / Pop word off stack)堆栈是按照后进先出原则组织的一段内存数据区域。 8086规定堆栈设置在堆栈段SS内。堆栈的栈底是固定不变的,这块存储器只有一个出入口,称之为栈顶栈指针SP始终指向堆栈的栈顶。随着PUSH和POP指令的执行,栈顶的位置将发生变化,进栈栈顶向低地址方向扩展,退栈栈顶向高地址(栈底)方向
29、扩展,即SP的内容被修改,并始终指向的是栈顶。在子程序调用或中断时,堆栈用于保护当前的断点地址和现场数据,以便子程序执行完毕后正确返回到主程序。断点地址的保存由子程序调用指令或中断响应来完成,现场数据保存可通过堆栈操作指令来实现。,堆 栈 的 概 念,堆栈以“先进后出”原则组织起来的连续的内存空间。堆栈操作以字为单位。固定以SS:SP为指针指示栈顶,出、入堆栈的操作均针对栈顶单元进行。8086的堆栈生长方向为“向下增长” 。,堆 栈 操 作,入栈:先修改栈顶指针(SP减1),将入栈数据的高字节存入栈顶;再次修改指针(SP减1),将低字节存入栈顶。,出栈:先将栈顶单元的内容存入目标字的低字节中,
30、修改栈顶指针(SP加1);再将当前栈顶单元的内容存入目标字的高字节中,并修改指针(SP加1)。,指令格式: PUSH OPRDPOP OPRD指令功能:进栈指令PUSH使(SP)-2(SP),然后将16位的源操作数压入堆栈,先高位后低位。源操作数可以是通用寄存器、段寄存器和存储器。POP退栈指令的执行过程与PUSH相反。它从当前栈顶弹出16位操作数到目标操作数,同时(SP)+2(SP),使SP指向新的栈顶。目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。 进栈和退栈的操作数要求以字为单位。PUSH和POP指令不影响标志位。 ,堆栈操作指令,1、入栈指令PUSH可使用的操作数类型: P
31、USH CX ;通用寄存器 PUSH DS ;段寄存器 PUSH WORD PTR 0040H;存储器 目操作数隐含为栈顶单元 指令执行后SP减2 入栈过程示意,2、出栈指令POP可使用的操作数类型: POP SI ;通用寄存器 POP ES ;段寄存器 POP WORD PTR BX;存储器 源操作数隐含为栈顶单元 指令执行后SP加2 出栈过程示意,入栈操作示例,设有(SS)=3200H,(SP)=0800H,(AX)=105CH。,(SP)= 0800H 32800H,PUSH AX,(SP)=(SP)1 327FFH,(SP)=(SP)1 327FEH,(SP)07FEH,出栈操作示例,
32、设有(SS)=3200H,(SP)=07FEH,(SP)=(SP)+1 32800H,POP AX,(SP)=(SP)+1 327FFH,(SP)= 07FEH 327FEH,(SP)0800H,(AX)105CH,数据交换指令XCHG(Exchange),功能:将源、目操作数的内容互相交换,指令执行后源、目操作数同时被改变。可使用的操作数类型组合:XCHG CL,DH ;通用寄存器 通用寄存器XCHG AX,BP ;通用寄存器 存储器,立即数为什么不能做操作数?,例:XCHG BX ,BP+SI 如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F0
33、0H, (2F246H)=4254H, OPR2的物理地址=2F000H+0200H+0046H=2F246H 则指令执行后:(BX)=4254H,(2F246H)=6F30H。,XCHG可实现寄存器之间或寄存器与存储器之间 的信息交换。但是,不能在两个存储单元之间直接交 换数据,段寄存器和立即数不能作为操作数。,指令格式: XLATXLAT OPRD; ALBX+AL指令功能: 完成一个字节的查表转换。它将数据段中偏移地址为BX与AL寄存器之和的存储单元的内容送入AL寄存器。 在使用该指令时,应首先在数据段中建立一个长度小于256 B的表格,表的首地址置于BX中,AL中存放查找对象在表中的下
34、标。指令执行后,所查找的对象存于AL中, BX内容保持不变。 ,查表指令XLAT (Translate),查表指令XLAT(Translate),指令形式 XLAT 数据表首地址标号 应用举例 TAB DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 ;数据段中以TAB为首地址定义的字节表,数目255MOV BX,OFFSET TABMOV AL,4XLAT TAB 指令执行后,(AL) 16。,实现什么功能?,1、有效地址传送指令LEA(Load effective address)。指令格式: LEA OPRD1, OPRD2指令功能: 将源操作数的有效地址送到目
35、的操作数。 具体指令形式: LEA REG16, MEM; REG16ADDR(MEM) 2、 地址指针传送指令LDS(Load date segment register)/LES(Load extra-segment register)。指令格式: LDS OPRD1, OPRD2指针送寄存器和DS:LDS REG16 ,MEM32 ;把源操作数指定的4个相继字节到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。,地址传送指令,指令格式: LES OPRD1, OPRD2 指针送寄存器和ES:LES REG16 ,MEM32 ;把源操作数指定的4个相继字节送到由指令指定 的寄存器
36、及ES寄存器中。该指令常指定DI寄存器 。指令功能:这两条指令的功能类似,都是将源操 作数偏移地址决定的双字单元中的第一个字的内容传 送到指令指定的16位通用寄存器,第二个字的内容传 送给段寄存器DS或ES。 ,地址传送指令,地址传送指令,有效地址传送指令LEA: 源操作数的有效地址EA(不是内容!)目标寄存器 LEA 16位通用寄存器,存储器 全地址指针传送指令LDS:将源操作数单元的内容当作32位全地址指针,偏移量(低16位)目标寄存器,段基址(高16位)DS。 LDS 16位通用寄存器,存储器 全地址指针传送指令LES:将源操作数单元的内容当作32位全地址指针,偏移量(低16位)目标寄存
37、器,段基址(高16位)ES。 LES 16位通用寄存器,存储器,地址传送指令的比较,已知:(DS)09A0H,(BX)0048H,LEA DI,BX,LDS SI,BX,LES DI,BX,等价于 MOV DI,OFFSET BX, 执行后:(DI)0048H, 执行后:(SI)003EH(DS)0816H, 执行后:(DI)003EH( ES)0816H,标志传送指令,标志装入指令LAHF(Load AH from flags) (Flags)LAH 标志存储指令SAHF(Store AH onto flags) AH (Flags)L 标志入栈指令PUSHF(Push flags onto
38、 stack)将标志寄存器压入堆栈。 标志出栈指令POPF将栈顶字单元的内容弹到标志寄存器中。,全部隐含源、目操作数,POPF(Pop flags off stack),;置位TF标志 PUSHF POP AX OR AX, 0100H PUSH AX POPF,;复位TF标志 PUSHF POP AX AND AX, 0FEFFH PUSH AX POPF,说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。指令SAHF/POPF将影响标志位。,数据传送指令小结,源、目操作数长度必须
39、一致。 源、目操作数不能同时是存储器操作数。 源、目操作数不能同时是段寄存器。 立即数和代码段寄存器CS不能作目的操作数。 当目操作数是段寄存器时,源操作数不能是立即数。 可以使用段寄存器的指令:MOV、PUSH、POP。 除XCHG指令外,其它数传指令仅改变目的操作数,源操作数保持不变。 除SAHF、POPF指令外,其它数传指令的执行不影响标志位。,4.4.2 算术运算指令,加法指令ADD、ADC、INC、AAA、DAA 减法指令SUB、SBB、DEC、AAS、DAS、CMP、NEG 乘法指令MUL、IMUL、AAM 除法指令DIV、IDIV、AAD、CBW、CWD 小结,算术运算指令可完成
40、加、减、乘、除运算以及在算术运算过程中进行进制及编码调整操作。在进行这些操作时,可针对字节或字运算, 也可对带符号数和无符号数进行运算。,加法运算指令,1、加指令ADD (Addition) 形式:ADD 目的操作数,源操作数 功能:目操作数内容源操作数内容目的操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF 。 允许的操作数类型:目的操作数通用寄存器、存储器;源操作数通用寄存器、存储器、立即数。 2、带进位的加指令ADC (Add with carry) 功能:目操作数内容源操作数内容CF目操作数 其余与ADD指令相同! 3、自加1指令INC (Increment dest
41、ination by 1) 形式:INC 操作数 (通用寄存器或存储器) 功能:操作数内容1 操作数;执行之后影响标志位SF、ZF、AF、PF、OF ,但不影响CF !,最常用的加法,用于高字(字节)相加,常用于修改地址指针,要求源操作数和目的操作数同时为带符号 的数或无符号数,且长度相等。,减法运算指令,1、减指令SUB (Subtract) 形式:SUB 目操作数,源操作数 功能:目操作数内容源操作数内容目操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF 。 允许的操作数类型:目操作数通用寄存器、存储器;源操作数通用寄存器、存储器、立即数。 2、带借位的减指令SBB (S
42、ubtract with borrow) 功能:目操作数内容源操作数内容CF目操作数 其余与SUB指令相同! 3、自减1指令DEC (Decrement destination by 1) 形式:DEC 操作数 (通用寄存器或存储器) 功能:操作数内容1 操作数;执行之后影响标志位SF、ZF、AF、PF、OF ,但不影响CF !,最常用的减法,用于高字(字节)相减,常用于修改地址指针,比较指令通常用于比较两个操作数的大小。由受影响的标志位状态来判断两个操作数比较的结果。不论是无符号数比较还是有符号数比较,若在比较指令后,(ZF)=1,则两者相等,否则不相等。若两者不相等,则可在比较两个数之后,
43、利用其他标志位的状态来确定两者中哪个大。,比较指令CMP (Compare two operands),如果是两个无符号数比较, 则可根据进位标志CF的状态来判断: 若(CF)=1,则OPRD1OPRD2。 如果是两个有符号数比较,则要根据SF和OF两个标志的关系来判断: 若SFOF=0,则OPRD1OPRD2;若SFOF=1,则OPRD1OPRD2。 在程序中,比较指令常用于条件转移之前,条件转移指令根据CMP操作之后的状态标志决定程序转移或不转移。,比较指令CMP,比较指令CMP,使用方法与SUB、SBB相同。 功能:目操作数源操作数,同时影响状态标志SF、ZF、AF、PF、CF、OF 。
44、 CMP通常用于比较两个数,其后一般紧跟着条件转移指令以实现不同情况下的分支处理。 例:CMP AL,BL ;ALBL,保持寄存器的值不变JNZ EQUAL ;若(ZF)0(不等),转EQUAL处 ;( ZF)1(相等)情况下的处理,结果不予保存。只是根据结果的状态设置条件标志位,取相反数指令NEG (Negate or form 2,s complement),形式:NEG 操作数 功能:0操作数内容操作数;影响所有状态标志SF、ZF、AF、PF、CF、OF 允许的操作数类型:通用寄存器、存储器 对指定操作数求补运算,实质上,NEG指令相当于将目操作数固定为0值的SUB指令;执行结果即取原数
45、的相反数。,指令格式: MUL OPRD指令功能:完成两个无符号数的乘法运算。要求被乘数放在AL或AX累加器中,用于字节运算和字运算,另一乘数可通过指令中的OPRD(除立即数方式以外的寻址方式)获得。 ,乘法运算指令,乘法指令包括无符号数乘法、 带符号数乘法两种。,1、无符号数乘法指令MUL(Multiply accumulator by register -or-memory;unsigned)。,指令功能:完成两个带符号数的乘法运算。进行 字节运算时,目的操作数必须是累加器AL,乘积在 寄存器AX中;进行字运算时,目的操作数必须是累 加器AX,乘积在寄存器DX,AX中。源操作数不允 许使用
46、立即数。乘法指令运算结果只影响状态标志CF、OF。,乘法运算指令,2、带符号数乘法 IMUL(Integer multiply accumulator by register-or-memory;signed),指令格式: IMUL OPRD ;,例:MUL BX ;无符号数乘法,BX乘上AX,乘法运算指令,无符号数乘法指令:MUL 通用寄存器或存储器 带符号数乘法指令:IMUL 通用寄存器或存储器,影响标志CF、OF :相乘后若高位(AH或DX)0,则将CF、OF置1,否则清0。,字节相乘:AL值操作数内容(8位) ,字相乘:AX值操作数内容(16位) ,当进行字运算时,其结果超过字长度成为
47、双字((DX)0),CF 和OF置“1”。这样就可以用OF及CF来检查和判断字节或字操作的结果。对MUL指令,当进行字节操作时,乘积结果的高一半为0((AH)=0),或当进行字操作时,乘积结果高一半为0((DX)=0),CF和OF均为0。对于IMUL指令,如果乘积结果的高一半为低一半的符号位的扩展,那么CF和OF均置“0”, 否则置“1”。乘法指令为乘积保留了两倍于原来操作数的存储空间, 因而不会出现溢出现象。 ,乘法运算指令,除法指令包括无符号数除法指令DIV,带符号数除法指令IDIV,以及在除法运算中辅助DIV、IDIV指令的字节转换为字指令CBW和字转换为双字指令CWB。 1、 无符号数除法指令DIV(Division;unsigned)。指令格式: DIV OPRD指令功能:完成两个无符号数的除法运算,除法操作可作字节或字操作。在进行字节操作时,要求被除数为16位、并存放在AX累加器,除数8位由指令中的源操作数指定,结果的8位商存放于AL中,8位余数存放于AH中。在进行字操作时,要求被除数为32位,存放在DX,AX寄存器中,16位除数由指令中源操作数指定,结果的16位商存放于AX中,16位余数存放于DX中。,