
指令系统与汇编基础.ppt
201页第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 6.1 6.1 概述概述 6.2 8 6.2 8086086的寻址方式的寻址方式 6.3 8 6.3 8086086的指令系统的指令系统 6.4 6.4 汇编语言程序设计基础汇编语言程序设计基础 6.5 6.5 汇编语言程序设计汇编语言程序设计2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.1 6.1 概述概述 6.1.1 6.1.1 指令及指令系统概念指令及指令系统概念 指令指令((InstructionInstruction):):是要求计算机执行特定是要求计算机执行特定操操 作的命令,通常一条指令对应一种特定操作作的命令,通常一条指令对应一种特定操作指指 令的执行是在计算机的令的执行是在计算机的CPUCPU中完成的中完成的 指令系统指令系统((Instruction setInstruction set):):计算机所能执计算机所能执 行的全部指令的集合组成该计算机的指令系统。
行的全部指令的集合组成该计算机的指令系统 不同类型的计算机具有不同的指令系统不同类型的计算机具有不同的指令系统2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.1.2 机器指令和汇编指令格式机器指令和汇编指令格式 高级语言高级语言脱离了具体的计算机,具有脱离了具体的计算机,具有通用性通用性1 1.机器指令.机器指令 计算机编程语言有计算机编程语言有机器语言、汇编语言及高级机器语言、汇编语言及高级语言语言等机器语言机器语言与计算机的核心与计算机的核心CPUCPU相对应相对应,不同类,不同类 型的计算机有其独特的机器语言指令系统;型的计算机有其独特的机器语言指令系统;汇编语言汇编语言仅是机器语言的仅是机器语言的英文助记符英文助记符表示形式,也表示形式,也与相应的计算机系统相对应;与相应的计算机系统相对应;2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 计算机只能识别计算机只能识别二进制代码二进制代码,因此计算机能执行,因此计算机能执行的指令必须以二进制代码的形式表示,这种的指令必须以二进制代码的形式表示,这种以二进制以二进制代码形式表示的指令称为指令的机器码代码形式表示的指令称为指令的机器码((Machine Machine CodeCode)。
2 2.汇编指令格式.汇编指令格式一条指令一般包含一条指令一般包含操作码操作码和和操作数操作数两部分 操作码操作码用来表示该指令所要用来表示该指令所要完成的操作完成的操作,不同,不同的指的指 令用不同的操作码表示;令用不同的操作码表示; 操作数操作数用来描述指令的用来描述指令的操作对象操作对象,操作数可以,操作数可以是立即数、寄存器和存储器,不同的指令可以有一是立即数、寄存器和存储器,不同的指令可以有一个、个、 二个、三个或无操作数,根据操作数个数的二个、三个或无操作数,根据操作数个数的不同指令格式分为以下几种:不同指令格式分为以下几种:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)零操作数指令)零操作数指令 格式:格式: 操作码操作码((2 2)一操作数指令)一操作数指令 格式:格式:A操作码操作码 即指令中只有操作码,没有操作数,也称为无即指令中只有操作码,没有操作数,也称为无操作数指令操作数指令有两种情况使用这种指令:有两种情况使用这种指令: 一是指令中不需要任何操作数,如空操作指一是指令中不需要任何操作数,如空操作指令、停机指令等;令、停机指令等; 二是指令的操作数是默认,如加法的二是指令的操作数是默认,如加法的ASCIIASCII码码 调整、十进制调整指令等。
调整、十进制调整指令等2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础操作码操作码 A1 A2 其中其中A A为存储器地址或寄存器名为存储器地址或寄存器名指令中只给出一个地址,该地址既是操作数的地址,指令中只给出一个地址,该地址既是操作数的地址,又是操作结果的存储地址如增量、减量指令等又是操作结果的存储地址如增量、减量指令等3 3)二操作数指令)二操作数指令格式:格式: 这是最常见的指令格式这是最常见的指令格式A1、、A2指出两个源操指出两个源操作数的地址,其中一个还指出存放结果的目的地址作数的地址,其中一个还指出存放结果的目的地址对两个操作数完成所规定的操作后,将结果存入目对两个操作数完成所规定的操作后,将结果存入目的地址2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础A3A2A1A1操作码操作码((4 4)三操作数指令)三操作数指令 格式:格式: ((5 5)多操作数指令)多操作数指令 A1 A1、、A2A2指出两个源操作数的地址,指出两个源操作数的地址,A3A3指出存放指出存放结果的目的地址。
结果的目的地址 在某些性能较好的大、中型甚至高档微小型计在某些性能较好的大、中型甚至高档微小型计算机中算机中, ,往往设置一些功能很强的、用于处理成批数往往设置一些功能很强的、用于处理成批数据的指令为了描述一批数据,指令中需要多个操据的指令为了描述一批数据,指令中需要多个操作数来指出数据存放的首地址、长度和下标等信息作数来指出数据存放的首地址、长度和下标等信息2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2 80866.2 8086的寻址方式的寻址方式 指令的寻址方式(指令的寻址方式(Addressing modeAddressing mode))::就是就是指令中操作数的表示方式指令中操作数的表示方式 80868086的寻址方式有:的寻址方式有:与与数据数据有关的寻址和与有关的寻址和与程程序转移有关的寻址序转移有关的寻址 与数据有关的寻址:与数据有关的寻址:立即寻址、寄存器寻址、直立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址变址寻址、相对基址变址寻址 与程序转移有关的寻址:与程序转移有关的寻址:段内直接寻址、段内间段内直接寻址、段内间接寻址、段间接寻址及段间间接寻址接寻址、段间接寻址及段间间接寻址2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.1 6.2.1 立即寻址立即寻址( (Immediate Addressing)Immediate Addressing) 【例【例6.16.1】】 MOVMOVALAL,,12H12H 则指令执行后,则指令执行后,( (AL)=12HAL)=12H 立即寻址方式所提供的操作数直接存在指令中,立即寻址方式所提供的操作数直接存在指令中,紧跟在操作码之后,操作数作为指令的一部分存放紧跟在操作码之后,操作数作为指令的一部分存放在代码段里,这种操作数称为在代码段里,这种操作数称为立即数。
立即数 立即数可以是立即数可以是8 8位位的或的或1616位位的,若是的,若是1616位数,则位数,则高位字节存放在高地址中,低位字节在低地址中高位字节存放在高地址中,低位字节在低地址中例例6.26.2】】 MOVMOVDSDS,,3456H3456H 则指令执行后,则指令执行后,DS)=3456HDS)=3456H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础回顾回顾8086的寄存器的寄存器 寄存器是在 CPU 中一个暂时储存数据的地方它有点儿像存储器(DRAM),但是不像存储器这么大,寄存器只有一个、两个或四个字节的大小而已 CPU 可以对寄存器作加、减、乘、除、且、或等等运算8086/8088 共有 14 个 16 位的寄存器,其名称都以两个英文字表示,大致可分为以下四类 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础1.通用寄存器通用寄存器 共有四个,其名称分别是 AX、BX、CX、DX,在汇编语言程序中大致没有太大的差别,但是其中只有 AX(accumulator,也称为累加器) 可作为除法或乘法中的被除数与被乘数,当 16 位不够大时,常常用 DX:AX 来表示 32 位。
此外这四个寄存器,只有 BX(base register,也称为基底寄存器) 可以被作为地址存取之用CX 也称为计数寄存器(count register),用于计算循环之次数或字串处理之计数DX也称为数据寄存器(data register),可用来存取数据 这四个寄存器也可以分成两个 8 位的寄存器来使用,例如 AX 可被分成较低的 8 位称为 AL,以及较高的 8 位 AH 来使用其余 BX、CX、DX 也都类似 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础2.指针与索引寄存器指针与索引寄存器 有五个,其名称分别是 SP、BP、IP、SI、DI前面两个 SP (stack pointer,称为堆栈指针)与(base pointer,也称为基底指针)是与堆栈(stack)有关的寄存器堆栈是一块区域,用来暂时存放数据用,在 8086中,堆栈是由最高地址中开始存放,每次都必须存入一个字节的长度,并用一组指针,来表示堆栈已经使用到那儿了,这组指针就是 SS:SP也就是说,当要将数据存入堆栈时,该数据应该存放在 SS:SP 所指的地址再低 2 个字节,然后 CPU 再使 SP 之内容减 2,使 SP 再指到下一个未使用的空间 调用子程序时,会预先把返回地址存入堆栈;调用中断时也是如此。
BP 通常用于调用子程序时,传递参数用2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 IP (instruction pointer,称为指令指针) 配合 CS 变成 CS:IP,指向将要执行的 8086/8088 地址当 CPU 要执行程序时,必须到存储器去提取要执行的指令,而要到那一个存储器地址去提取指令呢?这时 CPU 就会到 CS:IP 指到的地址去提取在程序中,一般是没有办法改变 CS:IP 的值,除非是跳转 (jmp、jz等) 指令或是调用 (call、ret等) 指令 SI (source index,称为来源索引寄存器) 和 DI (destination index,称为目的索引寄存器) 通常是用来当作地址指针,也可用作加减法这五个寄存器,每一个都不能分开来当作两个 8 位的寄存器使用 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础3.段地址寄存器段地址寄存器 有CS、DS、ES、SS 四个,分别表示程序码(code segment register)、数据(data segment register)、附 加 (extra segment register)、 堆 栈 (stack segment register)段地址用。
在 DOS 系统中,每一个段地址容量只有 64KBytes 当数据段地址不够用时,就可以用附加数据段地址来补足,例如想要将一个段地址的某些内容复制到另一段地址中,就可以同时指定 DS、ES 分别表示这两个段地址 4.程序状态字程序状态字PSWPSW 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.2 6.2.2 直接寻址直接寻址( (Direct Addressing)Direct Addressing) 【例【例6.36.3】】 MOV AXMOV AX,,[2000H][2000H]如如( (DS)=3000HDS)=3000H,,则指令执行情况则指令执行情况如图如图6-2-16-2-1所示执行结果为执行结果为( (AX)=8060HAX)=8060H 直接寻址方式指令,操作数在存储器中,指令中直接寻址方式指令,操作数在存储器中,指令中直接提供操作数的直接提供操作数的1616位位偏移地址偏移地址EAEA((Effective Effective addressaddress),),EAEA紧跟在指令操作码之后。
由于操作数紧跟在指令操作码之后由于操作数一般存放在数据段中,所以必须先计算出操作数的一般存放在数据段中,所以必须先计算出操作数的物理地址,再访问存储器才能取得数据物理地址,再访问存储器才能取得数据2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础注意:注意:DS 30 003000 0+ 200 03200 032000AH AL代代码码段段数数据据段段图图 6-2-1 例例6-3的执行过程的执行过程 操作码操作码00206080n在汇编语言中,可用在汇编语言中,可用符号地址代替数值地址符号地址代替数值地址,可,可 以写为:以写为:MOV AXMOV AX,,BLOCK BLOCK 或或 MOV AXMOV AX,,[BLOCK][BLOCK]n如果数据在数据段以外的其它段中,应在指令中如果数据在数据段以外的其它段中,应在指令中指定指定段跨越前缀段跨越前缀如:如:MOV AXMOV AX,,ESES::[2000H][2000H]300002024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.3 6.2.3 寄存器寻址寄存器寻址( (Register Addressing)Register Addressing) 【例【例6.46.4】】 MOV AXMOV AX,,BXBX如执行前如执行前( (AX)=4567HAX)=4567H,,(BX)=1234H(BX)=1234H,,则执行后,则执行后,( (AX)=1234HAX)=1234H,,(BX)(BX)保持不变。
保持不变 寄存器寻址的指令,操作数在寄存器寻址的指令,操作数在寄存器寄存器中,即寄存中,即寄存器的内容就是操作数的数值由于这种寻址方式操器的内容就是操作数的数值由于这种寻址方式操作数就在寄存器中,不需访问存储器作数就在寄存器中,不需访问存储器即可即可取得操作取得操作数,因而速度快可使用的寄存器有通用寄存器和数,因而速度快可使用的寄存器有通用寄存器和段寄存器段寄存器2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.4 6.2.4 寄存器间接寻址寄存器间接寻址( (Register IndirectRegister Indirect Addressing) Addressing) 【【例例6.56.5】】 MOV AXMOV AX,,[BX][BX]如果如果( (DS)=3000HDS)=3000H,,(BX)=2000H(BX)=2000H,,则物理地址则物理地址= =3000030000H+2000H=32000HH+2000H=32000H,,执行情况执行情况如图如图6-2-26-2-2所示。
所示 寄存器间接寻址方式中,操作数存放在存储器寄存器间接寻址方式中,操作数存放在存储器中,但操作数的有效地址中,但操作数的有效地址EAEA在基址寄存器在基址寄存器BXBX、、BPBP或或变址寄存器变址寄存器SISI、、DIDI中操作数的物理地址为:操作数的物理地址为: 物理地址物理地址=16=16 (段寄存器)(段寄存器)+ +(寄存器)(寄存器) 如果寄存器是如果寄存器是BXBX、、SISI、、DIDI,,则段寄存器用则段寄存器用DSDS,,如果寄存器是如果寄存器是BPBP,,则段寄存器用则段寄存器用SSSS2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指指令令中中也也可可指指定定段段跨跨越越前前缀缀以以取取得得其其它它段段中中的的数数据据如如::MOV MOV AXAX,,ESES::[BX][BX]指指令令,,则则从从附附加加段段中中取得数据取得数据执行结果为:执行结果为:( (AX)=8060HAX)=8060H300003000 0+ 200 03200 032000AH AL代代码码段段数数据据段段图图 6-2-2 例例6-5的执行过程的执行过程 操作码操作码6080DSBX2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.5 6.2.5 寄存器相对寻址寄存器相对寻址( (Register Relative Register Relative Addressing) Addressing) 【例【例6.66.6】】 MOV AX,COUNT[SI] MOV AX,COUNT[SI] 或写为或写为 MOV AX,[COUNT+SI]MOV AX,[COUNT+SI]若若 ( (DS)=3000HDS)=3000H,,(SI)=2000H(SI)=2000H,,COUNT=3000HCOUNT=3000H则:物理地址则:物理地址=30000=30000H+2000H+3000H=35000HH+2000H+3000H=35000H 操作数的有效地址操作数的有效地址EAEA由一个基址或变址寄存器由一个基址或变址寄存器的内容和指令中给出的的内容和指令中给出的8 8位或位或1616位的位移量位的位移量((displacementdisplacement))相加得到。
相加得到 物理地址物理地址=16=16 (段寄存器)(段寄存器)+ +(寄存器)(寄存器)+ +位移量位移量2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.6 6.2.6 基址变址寻址基址变址寻址( (Based Indexed Addressing)Based Indexed Addressing) 【例【例6.76.7】】 MOV AXMOV AX,,[BX][DI] [BX][DI] 或写为:或写为:MOV AXMOV AX,,[BX+DI] [BX+DI] 若若( (DS)=3000HDS)=3000H,,(BX)=1000H(BX)=1000H,,(DI)=2000H,(DI)=2000H, 则偏移地址则偏移地址=1000=1000H+2000H=3000HH+2000H=3000H,, 物理地址物理地址=30000=30000H+3000H=33000HH+3000H=33000H 操作数的有效地址为基址寄存器操作数的有效地址为基址寄存器((BXBX或或BPBP))和和变址寄存器变址寄存器((SISI或或DIDI))的内容之和。
两个寄存器由的内容之和两个寄存器由指令指定指令指定 物理地址物理地址=16=16 (段寄存器)(段寄存器)+ +(基址寄存器)(基址寄存器) + +(变址寄存器)(变址寄存器)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.7 6.2.7 相对基址变址寻址相对基址变址寻址( (Relative Based IndexedRelative Based Indexed Addressing) Addressing) 【例【例6.86.8】】 MOV AX,MASK[BX][SI]MOV AX,MASK[BX][SI]如如( (DS)=3000HDS)=3000H,,(BX)=1000H(BX)=1000H,,(SI)=2000H(SI)=2000H,,MASK=250HMASK=250H,,则:物理地址则:物理地址=30000=30000H+1000H+H+1000H+20002000H+250H=33250HH+250H=33250H 操作数的有效地址为基址寄存器(操作数的有效地址为基址寄存器(BXBX或或BPBP))和和变址寄存器(变址寄存器(SISI或或DIDI))的内容及的内容及8 8位或位或1616位的位移位的位移量之和。
量之和 物理地址物理地址=16=16 (段寄存器)(段寄存器)+ +(基址寄存器)(基址寄存器) + +(变址寄存器)(变址寄存器)+ +位移量位移量2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.2.8 6.2.8 程序转移寻址程序转移寻址 指令在顺序执行时,下一条指令的地址总是由指指令在顺序执行时,下一条指令的地址总是由指令指针令指针IPIP自动递增得到自动递增得到若若程程序序非非顺顺序序执执行行,,将将要要执执行行的的指指令令的的地地址址如如何何得得到呢?到呢? 又分为又分为本段内本段内转移和非本段内(转移和非本段内(段间段间)转移 若在若在本段内转移本段内转移,需要给出即将执行的那条指令,需要给出即将执行的那条指令的偏移地址,并用它取代的偏移地址,并用它取代IPIP的原有内容;的原有内容; 若在若在段间转移段间转移,除了要给出偏移地址取代,除了要给出偏移地址取代IP IP 外,外,还要给出新的代码段的段基址取代还要给出新的代码段的段基址取代CSCS中原有的内容,中原有的内容,此时操作数作为转移地址使用,分别赋予此时操作数作为转移地址使用,分别赋予IPIP和和CSCS。
2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 转转移移地地址址为为当当前前IPIP内内容容加加上上指指令令中中紧紧跟跟操操作作码码之之后后的的相相对对位位移移量量((8 8位位或或1616位位)),,即即转转移移的的有有效效地地址址以以相相对对于于当当前前IPIP值值的的位位移移量量来来表表示示,,因因此此也也被被称为称为相对寻址相对寻址 1 1..段内直接寻址段内直接寻址( (Intrasegment Direct Addressing)Intrasegment Direct Addressing) 该方式适用于该方式适用于条件转移条件转移和和无条件转移无条件转移用于条件转移时,位移量只能为用于条件转移时,位移量只能为8 8位;位;用于无条件转移时,位移量可为用于无条件转移时,位移量可为8 8位或位或1616位 有效地址为:有效地址为:EA=EA=((IPIP))+ +位移量位移量2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令的汇编语言格式表示为:指令的汇编语言格式表示为:ØJMP NEAR PTR VALUEJMP NEAR PTR VALUE ;;位移量为位移量为1616位在符号地址位在符号地址 前加前加NEAR PTRNEAR PTRØJMP SHORT TABLEJMP SHORT TABLE ;;位移量为位移量为8 8位在符号地址前加位在符号地址前加 SHORTSHORT2 2.段内间接寻址.段内间接寻址( (Intrasegment Indirect Intrasegment Indirect Addressing) Addressing) 转转移移的的有有效效地地址址EAEA是是一一个个寄寄存存器器或或一一个个存存储储器器单单元元的的内内容容,,其其内内容容可可用用寄寄存存器器寻寻址址、、寄寄存存器器间间接接寻寻址址、、寄寄存存器器相相对对寻寻址址、、基基址址变变址址寻寻址址、、相相对对基基址址变变址址寻寻址址等等寻寻址址方方式式获获得得,,用用所所取取得得的的内内容容取取代代IPIP寄寄存存器器的的原原有有内内容容。
该该寻寻址址方方式式只只能能用用于于段段内内无无条条件转移 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令的汇编语言格式表示为:指令的汇编语言格式表示为: Ø JMP BXJMP BX Ø JMP WORD PTR[BX+COUNT]JMP WORD PTR[BX+COUNT] 其中其中WORD PTRWORD PTR用以指定所取得的转向地址是一用以指定所取得的转向地址是一个字的有效地址个字的有效地址3.段间直接寻址.段间直接寻址(Intersegment Direct Addressing) 该寻址方式在指令中直接给出了转移到的段地该寻址方式在指令中直接给出了转移到的段地址和偏移地址,第一个地址为偏移地址,第二个地址和偏移地址,第一个地址为偏移地址,第二个地址为段地址,这两个地址都是址为段地址,这两个地址都是16位的地址,用于取位的地址,用于取代代IP和和CS,,从而实现段间转移从而实现段间转移 指令的汇编语言格式表示为:指令的汇编语言格式表示为:Ø JMP FAR PTR VALUEJMP FAR PTR VALUE ;;FAR PTRFAR PTR是是表示表示段间转移段间转移 的操作符的操作符2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础4 4.段间间接寻址.段间间接寻址( (Intersegment IndirectIntersegment Indirect Addressing) Addressing)指令的汇编语言格式表示为:指令的汇编语言格式表示为:ØJMP DWORD PTR[BX+DI]JMP DWORD PTR[BX+DI] ;;DWORD PTRDWORD PTR说明转向说明转向 地址需取双字。
地址需取双字 该该寻寻址址方方式式用用存存储储器器中中的的两两个个连连续续字字单单元元的的内内容容作作为为转转移移到到的的偏偏移移地地址址和和段段地地址址,,来来取取代代IPIP和和CSCS寄寄存存器器中中的的原原有有内内容容,,从从而而达达到到段段间间转转移移的的目目的的这这里里存存储储器器单单元元内内容容的的取取得得,,可可以以采采用用寄寄存存器器寻寻址址、、寄寄存存器器间间接接寻寻址址、、寄寄存存器器相相对对寻寻址址、、基基址址变变址址寻寻址址、、相对基址变址寻址中的任何一种相对基址变址寻址中的任何一种2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.3 80866.3 8086指令系统指令系统 8086 8086的指令系统从功能上可以分为:的指令系统从功能上可以分为:数据传送指令数据传送指令算术运算指令算术运算指令逻辑运算指令逻辑运算指令串处理指令串处理指令控制转移指令控制转移指令处理机控制指令处理机控制指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 数据传送指令又分为四小类:数据传送指令又分为四小类:通用数据传送指令通用数据传送指令累加器累加器专用传送指令专用传送指令地址传送指令地址传送指令标志寄存器传送指令。
标志寄存器传送指令1 1.通用数据传送指令.通用数据传送指令 通用数据传送指令中包括最基本的传送指令通用数据传送指令中包括最基本的传送指令MOVMOV,,入栈指令入栈指令PUSHPUSH和出栈指令和出栈指令POPPOP以及交换指令以及交换指令XCHGXCHG6.3.1 6.3.1 数据传送指令数据传送指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)最基本的传送指令)最基本的传送指令MOV(Move)MOV(Move)指令格式:指令格式:MOV MOV 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:将源操作数内容传送到目的操作数,源操将源操作数内容传送到目的操作数,源操 作数内容不变作数内容不变注意事项注意事项: :① ① 目的操作数和源操作数的搭配规则,目的操作数和源操作数的搭配规则,如图如图6-3-1 6-3-1 所示 特别说明的是,只有在通用数据传送指令中段寄特别说明的是,只有在通用数据传送指令中段寄存器(存器(CSCS除外)才可以作为操作数使用,而其他的除外)才可以作为操作数使用,而其他的指令是绝对不能将段寄存器作为操作数使用的。
指令是绝对不能将段寄存器作为操作数使用的2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 由上图的搭配规则可知,还需由上图的搭配规则可知,还需注意以下几点:注意以下几点: 立即数只能作为源操作数,而不能作为目的操作立即数只能作为源操作数,而不能作为目的操作数;数;如:如: A: MOV AX,1234HA: MOV AX,1234HB:MOV [BX],1234HB:MOV [BX],1234HC:MOV [BX],AXC:MOV [BX],AXD:MOV AX,[BX]D:MOV AX,[BX]存储器存储器寄存器寄存器立即数立即数A AB BCDEE:MOV AX,BXE:MOV AX,BXMOVMOV12H12H,,ALAL ×√MOVMOVALAL,,12H12H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 如:如: MOV [DI]MOV [DI],,[SI][SI] CS CS不能作为目的操作数,即不能作为目的操作数,即CSCS的值不能随意改变;的值不能随意改变; 存储器单元之间不能直接传送数据;存储器单元之间不能直接传送数据;×√×× 正确写法如下:正确写法如下: MOV MOV AX AX,,[SI][SI] MOV [DI] MOV [DI],,AXAX 不允许两个段寄存器之间直接传送信息;不允许两个段寄存器之间直接传送信息; 如:如: MOVMOV CS CS,,AXAX 如:如: MOVMOV DS DS,,ESES2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础立即数不能直接送给段寄存器,要通过其它寄存器。
立即数不能直接送给段寄存器,要通过其它寄存器 ② ② 目的操作数和源操作数的类型要匹配目的操作数和源操作数的类型要匹配 ×√××√√ 如:如:MOV DSMOV DS,,1234H1234H 正确写法如下:正确写法如下: MOV AX MOV AX,,1234H1234H MOV DS MOV DS,,AXAX 如:如:MOV AXMOV AX,,BL BL MOV AL MOV AL,,DXDX MOV AL MOV AL,,BL BL MOV AX MOV AX,,DXDX2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础③③在在给给SSSS用用MOVMOV指指令令赋赋值值时时,,要要紧紧接接着着给给SPSP赋赋值值,,不不能能在在修修改改SSSS和和SPSP指指令令之之间间插插入入其其它它指指令令,,系系统统在在执执行行这这两两条条语语句句时时,,自自动动禁禁止止外外部部中中断断,,以以防防止止堆堆栈栈空间变动过程中出现中断空间变动过程中出现中断④ ④ 不影响标志寄存器的值。
不影响标志寄存器的值例】【例】执行下面程序段:执行下面程序段: MOV AX MOV AX,,5000H 5000H ;((AXAX))=5000H=5000H MOV DS MOV DS,,AX AX ;(;(DSDS))=5000H=5000H MOV [5000H] MOV [5000H],,AL AL ; ;((55000H55000H))=00H=00H MOV BX MOV BX,,AX AX ; ;((BXBX))=5000H=5000H MOV [BX] MOV [BX],,56H 56H ; ;((55000H55000H))=56H=56H MOV[BX+1] MOV[BX+1],1234H 1234H ; ;(55001H)=34H,55001H)=34H,(55002H)=12H55002H)=12H MOV CX MOV CX,,[BX][BX] ;(;(CXCX))=3456H=3456H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((2 2)入栈指令)入栈指令PUSH(Push Word Onto Stack)PUSH(Push Word Onto Stack)和和 出栈指令出栈指令POP(Pop Word Off Stack)POP(Pop Word Off Stack)【例【例6.106.10】】若(若(AXAX))=1234H=1234H,(,(BXBX))=5678H=5678H,, ((SPSP))=1056H=1056H,,执行下面四条指令:执行下面四条指令: PUSH AXPUSH AX PUSH BX PUSH BX POP AX POP AX POP BX POP BX指令功能:指令功能:PUSHPUSH指令是把源操作数送入堆栈的顶部指令是把源操作数送入堆栈的顶部 POP POP指令是把栈顶内容弹出到目的操作数指令是把栈顶内容弹出到目的操作数指令格式:指令格式:PUSH PUSH 源操作数源操作数 POPPOP目的操作数目的操作数2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令执行情况指令执行情况如图如图6-3-26-3-2所示:所示:图图6-3-2 6-3-2 例例6-106-10的执行过程的执行过程出栈方向出栈方向低地址低地址高地址高地址入栈方向入栈方向 SPSP 通过如上执行过程可知,执行后通过如上执行过程可知,执行后,(,(AX)=5678HAX)=5678H,, (BX)=1234H(BX)=1234H,,(SP)=1056H(SP)=1056H,,所以这四条指令完成的所以这四条指令完成的功能是功能是交换寄存器交换寄存器AXAX和和BXBX的内容。
的内容SP+2SPSP+2SPSP-2SPSP-2SP78H56H34H12H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础入入栈栈操操作作是是先先改改变变指指针针SPSP再再入入栈栈;;出出栈栈操操作作是是先先出出栈再改变指针栈再改变指针SPSP 入栈是入栈是SPSP逐渐靠近基地址的过程逐渐靠近基地址的过程,,SPSP始终指向最始终指向最后后 入栈所在地址单元;出栈是入栈所在地址单元;出栈是SPSP逐渐远离基地址的逐渐远离基地址的过过 程程,,SPSP始终指向即将出栈的地址单元始终指向即将出栈的地址单元 对栈操作时对栈操作时低字节放在低地址单元,高字节放在低字节放在低地址单元,高字节放在高高 地址单元地址单元 堆栈操作符合堆栈操作符合后进先出后进先出(或先进后出)(或先进后出)的原则注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础堆堆栈栈位位置置由由SSSS决决定定,,堆堆栈栈容容量量由由SPSP决决定定,,堆堆栈栈容容量量即即为为SPSP的的初初值值与与SSSS之之间间的的距距离离,,80868086堆堆栈栈容容量量为为6464K K。
堆栈指令堆栈指令只能对字操作只能对字操作而不能对字节进行操而不能对字节进行操 堆栈指令的操作数可以是寄存器和存储器,但堆栈指令的操作数可以是寄存器和存储器,但CSCS 只能作为源操作数入栈,只能作为源操作数入栈,而不能作为目的操作数而不能作为目的操作数从从 堆栈中弹出一个值到堆栈中弹出一个值到CSCS寄存器××√√ 如:如:PUSHPUSHBLBL POP POPDHDH PUSH PUSHSISI POP POPESES2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:XCHG XCHG 目的操作数,源操作数目的操作数,源操作数 指令功能:指令功能:将目的操作数内容和源操作数内容将目的操作数内容和源操作数内容 相互交换相互交换例【例6.116.11】】若(若(AXAX))=1234H=1234H,(,(BXBX))=5678H=5678H,, 执行下面指令:执行下面指令: XCHGXCHGAXAX,,BXBX 则执行后,(则执行后,(AXAX))=5678H=5678H,(,(BXBX))=1234H=1234H【例【例6.126.12】】若(若(BXBX))=6F30H=6F30H,(,(BPBP))=0200H,=0200H,((SISI))=0046H=0046H,, ((SSSS))=2F00H=2F00H,(,(2F246H2F246H))=4154H=4154H,, 执行指令:执行指令:XCHGXCHG BX BX,,[BP+SI] [BP+SI] 则执行后,(则执行后,(BXBX))=4154H=4154H,(,(2F246H2F246H))=6F30H=6F30H((3 3)交换指令)交换指令XCHG(Exchange)XCHG(Exchange)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础注意事项:注意事项:目的操作数和源操作数的搭配规则,目的操作数和源操作数的搭配规则,如下图如下图:: 段寄存器不能相互交换段寄存器不能相互交换 寄存器寄存器ABCA:XCHG [BX],AXB:XCHG AX, [BX]存储器存储器2 2.累加器专用传送指令.累加器专用传送指令 在在80868086指令系统中,有两类指令是专门通过累加指令系统中,有两类指令是专门通过累加器来执行的,即器来执行的,即输入输入/ /输出指令输出指令和和换码指令换码指令。
C:XCHG AX, BX 目的操作数和源操作数位数要统一目的操作数和源操作数位数要统一 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)输入指令)输入指令ININ和输出指令和输出指令OUTOUT 指令格式:指令格式:IN IN 累加器,端口地址累加器,端口地址 OUT OUT 端口地址,累加器端口地址,累加器 指令功能:指令功能: ①① IN IN指令是从指令是从I/OI/O端口读入信息到累加器端口读入信息到累加器 ② OUT ② OUT指令是从累加器中输出信息到指令是从累加器中输出信息到I/OI/O端口端口指令用途:指令用途:所有所有I/OI/O端口与端口与CPUCPU之间之间的通信都由的通信都由ININ和和 OUTOUT指令来完成指令来完成注意事项:注意事项: 累加器可以是累加器可以是1616位的位的AXAX或或8 8位的位的ALAL 分为分为直接直接输入输出指令和输入输出指令和间接间接输入输出指令输入输出指令。
2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 直直接接输输入入输输出出指指令令在在指指令令中中直直接接指指定定端端口口号号,,寻寻址址范范围围为为0~255,,共共256个个端端口口;;间间接接输输入入输输出出指指令令是是先先把把端端口口号号放放到到DXDX寄寄存存器器中中,,即即在在指指令令中中用用DXDX代替端口号,寻址范围为代替端口号,寻址范围为0~65535,共,共65536个端口 【例【例6.136.13】】 IN AX IN AX,,70H70H;;将将7070H H、、71H71H两个端口的值读入到两个端口的值读入到AXAX IN AX IN AX,,DXDX;;将将DXDX、、DX+1DX+1所指两个端口的一个字读入所指两个端口的一个字读入 到到AXAX OUT OUT 70H70H,,ALAL;;将将ALAL中的一个字节输出到中的一个字节输出到7070H H端口端口 OUTOUT DXDX,,ALAL;;将将ALAL中的一个字节输出到中的一个字节输出到DXDX所指的端口所指的端口2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.146.14】】若(若(9090H H))=12H=12H,(,(91H91H))=34H=34H,, 执行下面指令:执行下面指令: ININAXAX,,90H90H 则执行后,(则执行后,(AXAX))=3412H=3412H【【例例6.156.15】】若(若(ALAL))=10H=10H,(,(DXDX))=2000H=2000H,, 执行下面指令:执行下面指令: MOVMOVDXDX,,2000H2000H OUT OUTDXDX,,ALAL 则执行后,(则执行后,(20002000H H))=10H=10H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:XLAT XLAT 符号地址符号地址 或或 XLATXLAT 指令功能:指令功能:将一种代码转换成另一种代码。
将一种代码转换成另一种代码例例6.166.16】】若(若(BXBX))=0050H=0050H,(,(ALAL))=0BH=0BH,, ((DSDS))=8000H=8000H,(,(8005BH8005BH))=30H=30H 执行指令:执行指令:XLAT XLAT 则执行后,(则执行后,(ALAL))=30 =30 执行情况执行情况如图如图6-3-46-3-4所示:所示:存储器执行操作:存储器执行操作:[ [BX+AL] → ALBX+AL] → AL ,,即将表格的即将表格的首首地址地址预先存到预先存到BXBX中,要查的表中数据距表首地址的中,要查的表中数据距表首地址的位移量位移量要预先存到要预先存到ALAL寄存器中,根据寄存器中,根据BXBX和和ALAL的内容的内容将找到的数送到将找到的数送到ALAL寄存器中寄存器中2 2)换码指令)换码指令XLAT(Translate)XLAT(Translate)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础80050H8005BH(AL)=0BHBX30H存储器存储器图图6-3-4 6-3-4 例例6-166-16的执行过程的执行过程3 3.地址传送指令.地址传送指令 地址传送指令完成把地址传送指令完成把地址地址传送到指定寄存器的功传送到指定寄存器的功能能, ,地址传送指令处理的地址传送指令处理的是变量的地址,而不是变量是变量的地址,而不是变量的值或变量的内容的值或变量的内容。
在在80868086指令系统中指令系统中, ,有有3 3条专用于条专用于传送地址的指令:取有效地址指令传送地址的指令:取有效地址指令LEALEA,,将地址指针将地址指针送寄存器和送寄存器和DSDS指令指令LDSLDS,,将地址指针送寄存器和将地址指针送寄存器和ESES指指令令LESLES2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:LEA LEA 目的操作数,源操作数目的操作数,源操作数 指令功能:指令功能:将源操作数的有效地址送到目的操作数中将源操作数的有效地址送到目的操作数中 注意事项:注意事项:源操作数源操作数必为内存单元地址或符号地址,必为内存单元地址或符号地址, 目的操作数目的操作数必为一个必为一个1616位的通用寄存器位的通用寄存器例】【例】若(若(BXBX))=1200H=1200H,(,(SISI))=0300H=0300H,, 执行下面指令:执行下面指令: LEA LEADIDI,,[BX+SI+0100H][BX+SI+0100H] 则执行后,(则执行后,(DIDI))=1600H=1600H((1 1)取有效地址指令)取有效地址指令LEA(LOAD EFFECTIVE ADDRESS)LEA(LOAD EFFECTIVE ADDRESS)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:LDS LDS 目的操作数,源操作数目的操作数,源操作数 指指令令功功能能::将将源源操操作作数数指指定定的的4 4个个字字节节的的地地址址指指针针((其其中中包包括括一一个个段段地地址址和和一一个个偏偏移移量量))传传送送到到指指令令指指定定的的寄寄存存器器及及DSDS寄寄存存器器中中,,该该指指令令常常指指定定的的寄寄存存器一般为器一般为SISI。
操作过程:操作过程:[ [源操作数源操作数] → ] → 指定的寄存器指定的寄存器SISI [ [源操作数源操作数+2] → +2] → DSDS【例【例6.186.18】】若(若(DSDS))=2000H=2000H,(,(20060H20060H))=3000H=3000H,, ((20062H20062H))=4000H=4000H,,执行下面指令:执行下面指令: LDS SI LDS SI,,[60H][60H] 则执行后,(则执行后,(SISI))=3000H=3000H,(,(DSDS))=4000H=4000H((2 2)地址指针送寄存器和)地址指针送寄存器和DSDS指令指令LDSLDS(Load Data Segment Register With Pointer)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:LES LES 目的操作数,源操作数目的操作数,源操作数 指令功能:指令功能:将源操作数指定的将源操作数指定的4 4个字节的地址指针个字节的地址指针(其中包括一个段地址和一个偏移量)传送到指令指(其中包括一个段地址和一个偏移量)传送到指令指定的寄存器及定的寄存器及ESES寄存器中,该指令常指定的寄存器一寄存器中,该指令常指定的寄存器一般为般为DIDI。
操作过程:操作过程:[源操作数源操作数] →指定的寄存器指定的寄存器DI [源操作数源操作数+2] → ES【【例例6.196.19】】若(若(DSDS))=5000H=5000H,(,(BXBX))=0200H=0200H,, ((50200H50200H))=6000H=6000H,(,(50202H50202H))=7000H=7000H,, 执行下面指令:执行下面指令:LESLESDIDI,,[BX][BX] 则执行后,(则执行后,(DIDI))=6000H=6000H,(,(ESES))=7000H=7000H((3 3))地址指针送寄存器和地址指针送寄存器和ESES指令指令LESLES(Load Extra Segment Register With Pointer)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(1)(1)标志送标志送AHAH指令指令LAHF(Load AH With Flags)LAHF(Load AH With Flags) 指令格式:指令格式:LAHFLAHF 指令功能:指令功能:将标志寄存器的低将标志寄存器的低8 8位传送到位传送到AHAH中。
传送中传送 后,后,AHAH寄存器的寄存器的D D1 1 、、D D3 3 、、D D5 5位没有意义,位没有意义,如下图2 2))AHAH送标志寄存器指令送标志寄存器指令( (Store AH Into Flags)Store AH Into Flags) 指令格式:指令格式:SAHFSAHF 指令功能:指令功能:与与LAHFLAHF相反,将相反,将AHAH寄存器的内容传送寄存器的内容传送 到标志寄存器的相应位到标志寄存器的相应位 OF DF IFTFSFZFAFPFCFAH:: D7D6D5D4D3D2D1D04..标志传送指令标志传送指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:PUSHF PUSHF 指令功能:指令功能:将标志寄存器的值推入堆栈顶部,但标将标志寄存器的值推入堆栈顶部,但标 志寄存器的值不变,且使栈指针志寄存器的值不变,且使栈指针SPSP的值减的值减2 2 注意事项:注意事项:PUSHFPUSHF一般用在子程序和中断处理程序之一般用在子程序和中断处理程序之 首,用来保存主程序标志。
首,用来保存主程序标志4)(4)标志出栈指令标志出栈指令POPFPOPF((Pop The FlagsPop The Flags)) 指令格式:指令格式:POPF POPF 指令功能:指令功能:从堆栈中弹出一个字到标志寄存器,即从堆栈中弹出一个字到标志寄存器,即 标志寄存器的值改变,且使栈指针标志寄存器的值改变,且使栈指针SPSP的值加的值加2 2 注意事项:注意事项:POPFPOPF一般用在子程序和中断处理程序之一般用在子程序和中断处理程序之 尾,用来恢复主程序标志尾,用来恢复主程序标志3)(3)标志进栈指令标志进栈指令PUSHFPUSHF((Push The FlagsPush The Flags))2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.3.2 6.3.2 算术运算类指令算术运算类指令1 1.加法指令.加法指令((1 1))不带进位加法指令不带进位加法指令ADD(Addition)ADD(Addition)指令格式:指令格式:ADD ADD 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:源操作数内容源操作数内容+ +目的操作数内容目的操作数内容→→目的操目的操 作数作数注意事项:注意事项: 目的操作数和源操作数的搭配规则与目的操作数和源操作数的搭配规则与MOVMOV指令相同。
指令相同 对六个状态标志均有影响对六个状态标志均有影响例【例6.206.20】】若(若(ALAL))=8EH=8EH,(,(BLBL))=0D6H=0D6H,, 执行下面指令:执行下面指令:ADD ALADD AL,,BLBL 则执行后则执行后,(,(AL)=64HAL)=64H,, 且且CF=1CF=1、、AF=1AF=1、、ZF=0ZF=0、、SF=0SF=0、、PF=0PF=0、、OF=1OF=12024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:ADC ADC 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:源操作数内容源操作数内容+ +目的操作数内容目的操作数内容+ +CFCF 内容内容→→目的操作数目的操作数注意事项:注意事项:这条指令一般用在多字节加法中,从第这条指令一般用在多字节加法中,从第 二字节以后的加法使用本条指令二字节以后的加法使用本条指令 【例【例6.21】】若(若(AL))=0C8H,(,(BL))=5FH,, CF=1,,执行下面指令:执行下面指令:ADC AL,,BL 则执行后,则执行后,(AL)=28H 且且CF=1、、AF=1、、ZF=0、、SF=0、、PF=1、、OF=0((2 2))带进位加法指令带进位加法指令ADC(Add With Carry)ADC(Add With Carry)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础MOV AX,,FIRSTADD AX,,SECONDMOV THIRD,,AXMOV AX,,FIRST+2ADC AX,,SECOND+2MOV THIRD+2,,AX 【【例例6.226.22】】若有两个四字节的数,分别存放在若有两个四字节的数,分别存放在 FIRST FIRST和和SECONDSECOND开始的存储区中,存开始的存储区中,存 放时高字节在高地址中,低字节在放时高字节在高地址中,低字节在 低地址中,实现这两个数相加,并低地址中,实现这两个数相加,并 将结果保存在将结果保存在THIRDTHIRD中。
中程序段如下:程序段如下:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:INC 操作数操作数 指令功能:指令功能:操作数内容操作数内容+1→操作数操作数 其中,操作数可以是寄存器和存储器其中,操作数可以是寄存器和存储器 注意事项:注意事项:INC指令不影响指令不影响CF标志INC指令主要用于修改地址指针和循环中的计数指令主要用于修改地址指针和循环中的计数次数 【【例例6.23】】若(若(CX))=6789H,执行下面指令:,执行下面指令: INC CX 则执行后,(则执行后,(CX))=678AH ((3)加)加1指令指令INC(Increment Destination By 1)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础2.减法指令.减法指令 主要包括:不带借位减法指令主要包括:不带借位减法指令SUB,带借位,带借位减法指令减法指令SBB,减,减1指令指令DEC,求补指令,求补指令NEG,比,比较指令较指令CMP。
((1)不带借位减法指令)不带借位减法指令SUB(Subtract)指令格式:指令格式:SUB 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:目的操作数内容-源操作数内容目的操作数内容-源操作数内容→目的目的 操作数操作数注意事项:注意事项:目的操作数和源操作数的搭配规则与目的操作数和源操作数的搭配规则与MOV指令相指令相同 对六个状态标志均有影响对六个状态标志均有影响2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【【例例6.24】】若(若(AL))=7CH,(,(BL))=0E5H 执行下面指令:执行下面指令: SUBAL,,BL 则执行后,(则执行后,(AL))=97H 且且CF=1、、AF=0、、ZF=0、、SF=1、、PF=0、、OF=1((2)带借位减法指令)带借位减法指令SBB(Subtract With Borrow) 指令格式:指令格式:SBB 目的操作数,源操作数目的操作数,源操作数 指令功能:指令功能:目的操作数内容-源操作数内容-目的操作数内容-源操作数内容-CF 内容内容→目的操作数目的操作数 注意事项:注意事项:这条指令一般用在多字节减法中,从这条指令一般用在多字节减法中,从 第二字节以后的减法使用本条指令。
第二字节以后的减法使用本条指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【【例例6.25】】有两个四字节的数,分别存放在数据段中有两个四字节的数,分别存放在数据段中偏移地址为偏移地址为1000H与与2000H开始的存储单元中,存开始的存储单元中,存放时高字节在高地址中,低字节在低地址中,实放时高字节在高地址中,低字节在低地址中,实现这两个数相减,并将结果保存在现这两个数相减,并将结果保存在3000H开始的单开始的单元中程序段如下:程序段如下: MOVAX,,[1000H] SUBAX,,[2000H] MOV[3000H],,AX MOVAX,,[1002H] SBBAX,,[2002H] MOV[3002H],,AX2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:DEC 操作数操作数 指令功能:指令功能:操作数内容-操作数内容-1→操作数操作数 其中操作数可以是寄存器和存储器。
其中操作数可以是寄存器和存储器 注意事项:注意事项:DEC指令不影响指令不影响CF标志 DEC指令主要用于修改地址指针和循指令主要用于修改地址指针和循环中的计数次数环中的计数次数4)求补指令)求补指令NEG(Negate) 指令格式:指令格式:NEG 操作数操作数 指令功能:指令功能:0-操作数-操作数→操作数,或将操作数按位操作数,或将操作数按位 取反再加取反再加1 ((3)减)减1指令指令DEC(Decrement Destination By 1)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 NEG指令影响标志位指令影响标志位CF、、AF、、ZF、、SF、、PF、、OF如果操作数的值为-如果操作数的值为-128(即(即80H)或-)或-32768(即(即8000H),则执行),则执行NEG指令后,结果不变,但使指令后,结果不变,但使OF置置1NEG指令通常使指令通常使CF为为1,只有当操作数为,只有当操作数为0时,才时,才使使CF为为0。
例例6.26】】若(若(AL))=34H,执行下面指令:,执行下面指令: NEG AL 则执行后,(则执行后,(AL))=0CCH 且且CF=1、、AF=0、、ZF=0、、SF=1、、PF=1、、OF=0 注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:CMP 目的操作数,源操作数目的操作数,源操作数 指令功能:指令功能:目的操作数内容-源操作数内容,但目的操作数内容-源操作数内容,但 结果不回送,只是使结果影响标志结果不回送,只是使结果影响标志 位,用以比较两数大小位,用以比较两数大小 注意事项:注意事项:通过通过ZF标志来判断两数是否相等标志来判断两数是否相等若若ZF=1则相等;则相等;ZF=0则不等对于无符号数,通过对于无符号数,通过CF标志来判断两数大小标志来判断两数大小若若CF=0,则被减数大于减数;若,则被减数大于减数;若CF=1,则被减数小,则被减数小于减数。
于减数5)比较指令)比较指令CMP(Compare Two Operands)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础对于有符号数,通过对于有符号数,通过OF和和SF两个标志来判断两数两个标志来判断两数的大小若若OF和和SF状态相同,则被减数大于减数;状态相同,则被减数大于减数;若若OF和和SF状态不同,则被减数小于减数状态不同,则被减数小于减数例例6.27】】判断判断AX与与BX的内容是否相等,若相等则的内容是否相等,若相等则 ((CX))=1,否则(,否则(CX))=0,编写程序段如下:,编写程序段如下: CMP AX,,BX JZ L1 MOV CX,,0 JMP L2 L1::MOV CX,,1 L2::HLT 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 乘法指令包括无符号数乘法指令乘法指令包括无符号数乘法指令MUL和带符和带符号数乘法指令号数乘法指令IMUL。
乘法指令中,有一个操作数乘法指令中,有一个操作数总是放在总是放在AL((8位)或位)或AX((16位)中,乘得结果位)中,乘得结果总是放在总是放在AX((8位)或位)或DX、、AX((16位)中,其位)中,其中中DX存放高位字,存放高位字,AX存放低位字存放低位字1)无符号数乘法指令)无符号数乘法指令MUL(Unsigned Multiply) 指令格式:指令格式:MUL 源操作数源操作数 指令功能:指令功能:字节操作数为(字节操作数为(AL))×源操作数内容源操作数内容 →((AX)) 字操作数为(字操作数为(AX))×源操作数内容源操作数内容→ ((DX、、AX)) 3.乘法指令.乘法指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础MUL指令影响指令影响CF、、OF标志,而对标志,而对AF、、PF、、SF、、ZF是不确定的,因此这四个标志位无意义是不确定的,因此这四个标志位无意义如果乘积的高一半为如果乘积的高一半为0,即字节操作的(,即字节操作的(AH)或)或字操作的(字操作的(DX)为)为0,则,则CF、、OF均为均为0;否则;否则CF、、OF均为均为1。
2)带符号数乘法指令)带符号数乘法指令IMUL(Signed Multiply) 指令格式:指令格式:IMUL 源操作数源操作数 指令功能:指令功能:字节操作数为(字节操作数为(AL))×源操作数内容源操作数内容 →((AX)) 字操作数为(字操作数为(AX))×源操作数内容源操作数内容→ ((DX、、AX))注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础MUL指令影响指令影响CF、、OF标志,而对标志,而对AF、、PF、、SF、、ZF是不确定的,因此这四个标志位无意义是不确定的,因此这四个标志位无意义如果乘积的高一半是低一半的符号扩展,则如果乘积的高一半是低一半的符号扩展,则CF、、OF均为均为0;否则;否则CF、、OF均为均为1例例6.28】】若(若(AL))=0B4H,(,(BL))=11H 执行指令:执行指令:MUL BL 则执行时,只需将(则执行时,只需将(AL)和()和(BL)直接)直接 相乘即可,执行后得(相乘即可,执行后得(AX))=0BF4H,且,且 CF=OF=1 注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 则执行时,要将(则执行时,要将(AL)求补后再和()求补后再和(BL)相)相乘,乘得结果为乘,乘得结果为050CH,再将其求补得,再将其求补得((AX))=0FAF4H,且,且CF=OF=1【【例例6.29】】实现两个字相乘的程序段如下:实现两个字相乘的程序段如下: MOV AX,,FIRST MUL SECOND MOV THIRD,,AX MOV FOURTH,,DX 执行指令:执行指令: IMUL BL2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 除法指令包括无符号数除法指令除法指令包括无符号数除法指令DIV和带符号和带符号 数除法指令数除法指令IDIV以及符号扩展指令以及符号扩展指令CBW、、CWD。
(1)无符号数除法指令无符号数除法指令DIV(Unsigned Division)指令格式:指令格式:DIV 源操作数源操作数指令功能:指令功能:字节操作数:字节操作数:(AL) ← (AX)/(源操作数源操作数)的商的商 (AH) ← (AX)/(源操作数源操作数)的余数的余数 字操作数:字操作数: (AX) ← (DX,AX)/(源操作数源操作数)的商的商 (DX) ← (DX,AX)/(源操作数源操作数)的余数的余数 4.除法指令.除法指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础DIV指令要求除数只能是被除数的一半字长指令要求除数只能是被除数的一半字长当被当被除数为除数为16位时,除数应为位时,除数应为8 位;当被除数为位;当被除数为32位时,位时,除数应为除数应为16位当被除数为当被除数为16位时,应存放在位时,应存放在AX中,除数为中,除数为8位,位,可存放在寄存器或存储器中(不能为立即数),可存放在寄存器或存储器中(不能为立即数),得到的得到的8位商放在位商放在AL中,中,8位余数放在位余数放在AH中;中;当被当被除数为除数为32位时,应存放在位时,应存放在DX(高位)和(高位)和AX(低位(低位)中,除数为)中,除数为16位,可存放在寄存器或存储器中位,可存放在寄存器或存储器中(不能为立即数),(不能为立即数),得到的得到的16位商放在位商放在AX中,中,16位余数放在位余数放在DX中。
中注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 DIV指令对标志位指令对标志位CF、、AF、、ZF、、SF、、PF、、OF都都是是不确定不确定的,即没有意义的,即没有意义被除数位数和除数位数相同时,要对被除数进行被除数位数和除数位数相同时,要对被除数进行扩展,对于无符号数来说,只需使扩展,对于无符号数来说,只需使AH或或DX内容内容为为0即可2) 带符号数除法指令带符号数除法指令IDIV(Signed Division) 指令格式:指令格式:IDIV 源操作数源操作数 指令功能:指令功能:与与DIV指令相同指令相同 注意事项:注意事项:与与DIV指令类似,但操作数必须是带符号数,商和指令类似,但操作数必须是带符号数,商和余数也都是带符号数,且余数也都是带符号数,且余数的符号和被除数的余数的符号和被除数的符号相同符号相同2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 被除数位数和除数位数相同时,要对被除数被除数位数和除数位数相同时,要对被除数进行扩展,对于进行扩展,对于有符号有符号数来说,数来说,AH和和DX的扩展的扩展就是低位字节或低位字的符号扩展,即就是低位字节或低位字的符号扩展,即把把AL中的中的最高位扩展到最高位扩展到AH的的8位中,或把位中,或把AX中的最高位扩中的最高位扩展到展到DX的的16位中。
位中在在8086中,有专用于有符号数中,有专用于有符号数扩展的指令扩展的指令CBW和和CWD 当当字节字节操作时,被除数高操作时,被除数高8位的绝对值大于除位的绝对值大于除数的绝对值(即商超过了数的绝对值(即商超过了8位);或当位);或当字字操作时,操作时,被除数高被除数高16位的绝对值大于除数的绝对值(即商位的绝对值大于除数的绝对值(即商超过了超过了16位);或当位);或当除数为除数为0时,就产生时,就产生0号中断号中断进行处理进行处理0号中断(除数为0) 、1号中断(单步执行程序) 、4号中断(运算溢出) 、3号中断(断点处理)】2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:CBW 指令功能:指令功能:将将AL中的内容进行符号扩展若中的内容进行符号扩展若(AL)的的 最高位为最高位为0,则,则(AH)←0;若;若(AL)的最高的最高 位为位为1,则,则(AH)←0FFH 注意事项:注意事项:当遇到两个字节相除时,要先执行当遇到两个字节相除时,要先执行CBW指令,以指令,以便产生一个便产生一个16位的被除数。
位的被除数 该指令不影响标志位该指令不影响标志位 ((3)字节转换为字指令)字节转换为字指令CBW(Convert Byte To Word)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:CWD 指令功能:指令功能:将将AX中的内容进行符号扩展若中的内容进行符号扩展若(AX) 的的 最高位为最高位为0,则,则(DX)←0;若;若(AX) 的最高的最高 位为位为1,则,则(DX)←0FFFFH 注意事项:注意事项:当遇到两个字相除时,要先执行当遇到两个字相除时,要先执行CWD指令,以便指令,以便产生一个长为产生一个长为32位的被除数位的被除数 该指令不影响标志位该指令不影响标志位4)字转换为双字指令)字转换为双字指令CWD(Convert Word To Double Word)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【【例例6.30】】以以BUFFER开始的缓冲区中,前两个字节开始的缓冲区中,前两个字节是一个是一个16位带符号的被除数,接着两个字节是一个位带符号的被除数,接着两个字节是一个16位带符号的除数,再接着的四个字节分别存放商位带符号的除数,再接着的四个字节分别存放商和余数。
程序段如下:和余数程序段如下: LEABX,,BUFFER MOVAX,,[BX] CWD IDIV [BX+2] MOV [BX+4],,AX MOV [BX+6],,DX2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 在在计计算算机机中中,,可可用用4 4位位二二进进制制码码表表示示1 1个个十十进进制码,这种代码叫制码,这种代码叫BCDBCD码码 BCDBCD码码有有两两类类::一一类类叫叫压压缩缩的的BCDBCD码码,,所所谓谓压压缩缩,,就就是是用用1 1个个字字节节表表示示2 2位位BCDBCD码码;;另另一一类类叫叫非非压压缩缩的的BCDBCD码码,,就就是是1 1个个字字节节只只用用低低4 4位位来来表表示示BCDBCD码码,,高四位为高四位为0 0。
根根据据这这两两种种表表示示法法,,相相应应的的将将十十进进制制调调整整指指令令分分为为两两组组::压压缩缩的的BCDBCD码码调调整整指指令令和和非非压压缩缩的的BCDBCD码调整指令码调整指令5 5.十进制调整指令.十进制调整指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令一:指令一: 加法的十进制调整指令加法的十进制调整指令DAA(Decimal Adjust For Addition) 指令格式:指令格式:DAA 指令功能:指令功能:若若AF=1,或,或AL寄存器的低寄存器的低4位是十六进制数的位是十六进制数的A~F,则,则AL寄存器内容加寄存器内容加06H,且将,且将AF置置1;;若若CF=1,或,或AL寄存器的高寄存器的高4位是十六进制数的位是十六进制数的A~F,则,则AL寄存器内容寄存器内容加加60H,且将,且将CF置置1 注意事项:注意事项:对对OF标志无定义,但影响其它标志标志无定义,但影响其它标志 ((1)压缩的)压缩的BCD码调整指令码调整指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.316.31】】若若( (AL)=34HAL)=34H,,(BL)=88H(BL)=88H执行下面指令:执行下面指令: ADDADDALAL,,BLBL DAA DAA 则执行则执行ADDADD指令后指令后,(,(AL)=0BCH,AL)=0BCH,且且CF=0CF=0、、AF=0AF=0 而执行而执行DAADAA指令后指令后,(,(AL)=22H,AL)=22H,且且CF=1CF=1、、AF=1AF=1【【例例6.326.32】】设有两个多字节数(每一个是设有两个多字节数(每一个是1616位十进位十进制数),分别存放在以制数),分别存放在以BLOCK1BLOCK1和和BLOCK2BLOCK2开始的内存开始的内存单元中,存放时都是高字节在高地址单元中,要求单元中,存放时都是高字节在高地址单元中,要求实现将实现将BLOCK1BLOCK1和和BLOCK2BLOCK2内容相加,加得结果送内容相加,加得结果送BLOCK3BLOCK3开始的单元中。
开始的单元中2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 LEABX,,BLOCK1 LEASI,,BLOCK2 LEADI,,BLOCK3 MOV CX,,8 CLCL1:: MOVAL,,[BX] ADC AL,,[SI] DAA MOV[DI],,AL INC BX INC SI INC DI DEC CX JNZ L1 HLT2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:DASDAS指令功能:指令功能:若若AF=1,或,或AL寄存器的低寄存器的低4位是十六进制的位是十六进制的A~F,则,则AL寄存器内容减去寄存器内容减去06H,且将,且将AF置置1;;若若CF=1,或,或AL寄存器的高寄存器的高4位是十六进制的位是十六进制的A~F,则,则AL寄存器内容减去寄存器内容减去60H,且将,且将CF置置1。
注意事项:注意事项:对对OF标志无定义,但影响其它标志标志无定义,但影响其它标志指令二:减法的十进制调整指令指令二:减法的十进制调整指令DAS(DecimalDAS(Decimal Adjust For Subtraction) Adjust For Subtraction)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【【例例6.33】】若若(AL)=13H,,(BL)=45H 执行下面指令:执行下面指令:SUB AL,,BL DAS 则执行则执行SUB指令后,指令后,(AL)=0CEH,且,且CF=1、、AF=1 而执行而执行DAS指令后,指令后,(AL)=68H,且,且CF=1、、AF=1((2 2)非压缩的)非压缩的BCDBCD码调整指令码调整指令指令一:加法的指令一:加法的ASCIIASCII调整指令调整指令AAA(ASCⅡ AdjustAAA(ASCⅡ Adjust For Addition) For Addition)指令格式:指令格式:AAAAAA2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 若若AL寄存器的低寄存器的低4位在位在0~9之间,且之间,且AF=0,则,则将将AF值送值送CF即可;即可; 若若AL寄存器的低寄存器的低4位在十六进制数位在十六进制数A~F之间,之间,或或AF=1,则将,则将AL寄存器内容加寄存器内容加6,,AH寄存器内容寄存器内容加加1,并将,并将AF和和CF位置位置1,然后将,然后将AL的高四位清的高四位清0,从而将,从而将AL的内容调整为的内容调整为0~9之间的数。
之间的数注意事项:注意事项:影响影响AF和和CF标志,对其它标志位无定义标志,对其它标志位无定义例例6.336.33】】若(若(ALAL))=13H=13H,(,(BLBL))=45H=45H 执行下面指令:执行下面指令: SUB SUB ALAL,,BLBL DAS DAS 指令功能:指令功能:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础则执行则执行ADDADD指令后指令后,(,(AL)=8DHAL)=8DH,,AF=0AF=0而执行而执行AAAAAA指令后指令后,(,(AX)=0703H,AX)=0703H,且且AF=1AF=1、、CF=1CF=1指令二:减法的指令二:减法的ASCIIASCII调整指令调整指令AAS(ASCII Adjust AAS(ASCII Adjust For Subtraction) For Subtraction)指令格式:指令格式:AASAAS指令功能:指令功能: 若若ALAL寄存器的低寄存器的低4 4位在位在0-90-9之间,且之间,且AF=0AF=0,,则将则将AFAF 值送值送CFCF即可;即可; 若若ALAL寄存器的低寄存器的低4 4位在十六进制数位在十六进制数A-FA-F之间,或之间,或 AF=1 AF=1,,则将则将ALAL寄存器内容减去寄存器内容减去6 6,,AHAH寄存器内容寄存器内容减减 去去1 1,并将,并将AFAF和和CFCF位置位置1 1,然后将,然后将ALAL的高四位清的高四位清0 0,, 从而将从而将ALAL的内容调整为的内容调整为0-90-9之间的数。
之间的数2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令三:乘法的指令三:乘法的ASCIIASCII调整指令调整指令AAM(ASCII AdjustAAM(ASCII Adjust For Multiply) For Multiply)指令格式:指令格式:AAMAAM指令功能:指令功能:把把ALAL的内容除以的内容除以1010,商存放到,商存放到AHAH中,余数中,余数 存放到存放到ALAL中注意事项:注意事项:根据根据ALAL寄存器的内容设置寄存器的内容设置SFSF、、ZFZF和和PFPF,,对对 其它标志位无定义其它标志位无定义注意事项:注意事项:影响影响AFAF和和CFCF标志,对其它标志位无定义标志,对其它标志位无定义 【例【例6.356.35】】若(若(ALAL))=06H=06H,(,(BLBL))=08H=08H 执行下面指令执行下面指令 MUL MUL BLBL AAM AAM2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础则执行则执行MULMUL指令后,(指令后,(ALAL))=30H=30H而执行而执行AAMAAM指令后,(指令后,(AHAH))=04H=04H,(,(ALAL))=08H=08H指令四:除法的指令四:除法的ASCIIASCII调整指令调整指令AAD(ASCII AdjustAAD(ASCII Adjust For Division) For Division)指令格式:指令格式:AADAAD指令功能:指令功能:( (AL)←(AH)*10+(AL) , (AH)←0AL)←(AH)*10+(AL) , (AH)←0注意事项注意事项: 该指令与其他调整指令在使用方法上是不同的,加该指令与其他调整指令在使用方法上是不同的,加 减乘法调整在运算后进行,而除法调整应在除法减乘法调整在运算后进行,而除法调整应在除法运运 算之前。
算之前 根据根据ALAL寄存器的内容设置寄存器的内容设置SFSF、、ZFZF和和PFPF,,对其它标志对其它标志 位无定义位无定义2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.366.36】】若(若(AXAX))=0906H=0906H 执行指令:执行指令:AADAAD 则执行则执行AADAAD指令后指令后,(,(AL)=09*10+06=60HAL)=09*10+06=60H,(,(AHAH))=0=0 所以(所以(AXAX))=0060H=0060H6.3.3 逻辑指令逻辑指令 1.逻辑运算指令.逻辑运算指令 8086的逻辑运算指令包括逻辑与指令的逻辑运算指令包括逻辑与指令AND、、逻辑逻辑或指令或指令OR、、逻辑非指令逻辑非指令NOT、、异或指令异或指令XOR和测试和测试指令指令TEST这这5条指令除条指令除NOT指令不影响标志位外指令不影响标志位外其它其它4条指令都使条指令都使CF=OF=0,,对对AF无定义,而无定义,而SFZF和和PF则根据结果而定。
则根据结果而定2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:AND AND 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:目的操作数内容目的操作数内容∧∧源操作数内容源操作数内容→→目的操目的操 作数作数注意事项:注意事项: 操作规则是操作规则是全全1 1为为1 1,有,有0 0为为0 0 自身相与,清进位标志,但结果不变自身相与,清进位标志,但结果不变 AND AND指令可使操作数的某些位清指令可使操作数的某些位清0 0,其它位不变其它位不变只只 需将需将清清0 0的位和的位和0 0相与,不变的位和相与,不变的位和1 1相与即可相与即可例【例6.37】】把把AX中的第中的第1、、4、、8、、14位内容清位内容清0,其,其 它位不变它位不变 指令为:指令为: AND AX,,0BEEDH⑴ ⑴ 逻辑与指令逻辑与指令ANDAND2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:OR OR 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:目的操作数内容目的操作数内容∨∨源操作数内容源操作数内容→→目的目的 操作数操作数注意事项:注意事项: 操作规则是操作规则是全全0 0为为0 0,有,有1 1为为1 1。
自身相或,清进位标志,但结果不变自身相或,清进位标志,但结果不变 OROR指令可使操作数的某些位置指令可使操作数的某些位置1 1,其它位不变只,其它位不变只 需将需将置置1 1的位和的位和1 1相或,不变的位和相或,不变的位和0 0相或即可相或即可例【例6.37】】把把AX中的第中的第2、、5、、7、、12位内容置位位内容置位1,, 其它位不变其它位不变 指令为:指令为:OR AX,,10A4H⑵ ⑵ 逻辑或指令逻辑或指令 OROR2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:NOT NOT 操作数操作数指令功能:指令功能:将操作数的内容按位取反将操作数的内容按位取反注意事项:注意事项:操作规则是操作规则是0 0变为变为1 1,,1 1变为变为0 0⑷⑷ 逻辑异或指令逻辑异或指令XOR指令格式:指令格式:XOR 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:目的操作数内容目的操作数内容∨∨源操作数内容源操作数内容→ 目的目的 操作数操作数注意事项:注意事项:操作规则:操作规则:相同为相同为0,不同为,不同为1⑶ ⑶ 逻辑非指令逻辑非指令NOTNOT2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 自身相异或,结果为自身相异或,结果为0 0,进位标志为,进位标志为0 0。
XOR XOR指令可使操作数的某些位取反,其它位不变指令可使操作数的某些位取反,其它位不变 只需将只需将取反的位和取反的位和1 1相异或,不变的位和相异或,不变的位和0 0相异或相异或即即 可例【例6.396.39】】把把AXAX中的第中的第3 3、、6 6、、9 9、、1515位内容取反,其位内容取反,其 它位不变它位不变 指令为:指令为:XOR AXXOR AX,,8248H8248H⑸ ⑸ 测试指令测试指令TESTTEST指令格式指令格式::TEST TEST 目的操作数,源操作数目的操作数,源操作数指令功能:指令功能:目的操作数内容目的操作数内容∧∧源操作数内容,但结源操作数内容,但结 果不回送果不回送2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础注意事项:注意事项:TESTTEST指令的源操作数一般设置为立即指令的源操作数一般设置为立即 数,其中数,其中要测试目的操作数的哪一位,要测试目的操作数的哪一位, 就相应的令源操作数的哪一位为就相应的令源操作数的哪一位为1,1,其其 它位为它位为0 0。
例【例6.406.40】】测试测试ALAL中第中第0 0位是否为位是否为1 1,如为,如为1 1则转到则转到 L1 L1指令为:指令为: TEST ALTEST AL,,00000001B00000001B JNZ JNZ L1 L12 2.移位指令.移位指令 包括逻辑左移指令包括逻辑左移指令SHLSHL、、算术左移指令算术左移指令SALSAL、、逻辑逻辑右移指令右移指令SHRSHR、、算术右移指令算术右移指令SARSAR;;循环左移指令循环左移指令ROLROL循环右移循环右移RORROR指令、带进位循环左移指令指令、带进位循环左移指令RCLRCL、、带进带进位循环右移指令位循环右移指令RCRRCR2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令功能:指令功能:对操作数按不同的操作码进行移位,对操作数按不同的操作码进行移位,见见 图图6-3-66-3-6。
注意事项:注意事项:移位次数为移位次数为1时直接写在指令中,大于时直接写在指令中,大于1时把移位时把移位次数放在次数放在CL寄存器中寄存器中逻辑左移一位相当于逻辑左移一位相当于无符号数乘无符号数乘2,,逻辑右移一位逻辑右移一位相当于相当于无符号数除无符号数除2;;算术左移一位相当于算术左移一位相当于有符号有符号数乘数乘2,,算术右移一位相当于算术右移一位相当于有符号数除有符号数除2指令格式:指令格式:操作码操作码 操作数,移位次数操作数,移位次数2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础移位指令执行情况如下:移位指令执行情况如下:0(1) SHL/SAL执行情况执行情况(3) SAR执行情况执行情况(4) ROL执行情况执行情况CF (5) ROR执行情况执行情况0(2) SHR执行情况执行情况(6) RCL执行情况执行情况(7) RCR执行情况执行情况图图6 -3 -6移位指令执行情况移位指令执行情况CFCFCFCFCFCF 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.416.41】】若若(AL)=9CH,,CF=1,,执行下面指令:执行下面指令: MOV CL,,2 SHLAL,,CL ;(;(AL))=70H SHRAL,,CL ;(;(AL))=27H SALAL,,CL ;(;(AL))=70H SARAL,,CL ;(;(AL))=0E7H ROLAL,,CL ;(;(AL))=72H ROR AL,,CL ;(;(AL))=27H RCLAL,,CL ;(;(AL))=73H RCRAL,,CL ;(;(AL))=67H【例【例6.426.42】】将将ALAL寄存器中的有符号数乘以寄存器中的有符号数乘以1010,,程序程序 段如下:段如下:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础SALAL,,1MOV BL,,ALSALAL,,1SALAL,,1ADDAL,,BL6.3.4 串处理指令串处理指令串传送指令串传送指令MOVS串比较指令串比较指令CMPS串扫描指令串扫描指令SCAS从串中取指令从串中取指令LODS存入串指令存入串指令STOS。
2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础串操作指令为双操作数指令,两个操作数分别为串操作指令为双操作数指令,两个操作数分别为源源 串和目的串串和目的串源串的地址由源变址寄存器源串的地址由源变址寄存器SISI指示,且假定在数指示,且假定在数据据 段段DSDS中存放;目的串的地址由目的变址寄存器中存放;目的串的地址由目的变址寄存器DIDI 指示,且假定在附加数据段指示,且假定在附加数据段ESES中存放每次串操作后,自动修改指针若标志位每次串操作后,自动修改指针若标志位DF=0DF=0((执执 行行CLDCLD指令),则每次操作后指令),则每次操作后SISI、、DIDI增量;若增量;若DF=1DF=1((执行执行STDSTD指令),则每次操作后指令),则每次操作后SISI、、DIDI减量可以处理可以处理字节串字节串,也可以处理,也可以处理字串字串若处理字节若处理字节 串,则串,则SISI、、DIDI增减量为增减量为1 1;若处理字串,则;若处理字串,则SISI、、DIDI 增减量为增减量为2 2串处理指令有如下特点:串处理指令有如下特点:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础串处理指令可以在前面加一个重复前缀,重复前缀串处理指令可以在前面加一个重复前缀,重复前缀 有:有:REPREP、、REPZ/REPEREPZ/REPE、、REPNZ/REPNEREPNZ/REPNE。
一般来说,一般来说, REPREP常与常与MOVSMOVS、、LODSLODS、、STOSSTOS连用连用,表示连续传送、,表示连续传送、 存取;存取;REPE/REPZREPE/REPZ及及REPNE/REPNZREPNE/REPNZ常与常与CMPSCMPS、、SCASSCAS连连 用,用,表示连续查找、扫描表示连续查找、扫描REP重复,重复串操作直到重复,重复串操作直到(CX)=0 为止REPE/REPZ相等相等/为零则重复,重复串操作直到为零则重复,重复串操作直到(CX)=0或或ZF=0((即某次比较的结果不等)时退出即某次比较的结果不等)时退出REPNE/REPNZ不相等不相等/不为零则重复,重复串操不为零则重复,重复串操作直到作直到(CX)=0或或ZF=1((即某次比较的结果相等)即某次比较的结果相等)时退出2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础1 1.串传送指令.串传送指令MOVS (Move Byte or Word String)MOVS (Move Byte or Word String) 指令格式:指令格式:MOVS MOVS 目的操作数,源操作数目的操作数,源操作数 MOVSB MOVSB ;;字节串传送字节串传送 MOVSW MOVSW ;;字串传送字串传送 指令功能:指令功能:[ [DS(0)+SI] →[ES(0)+DI]DS(0)+SI] →[ES(0)+DI] SI=SI±1 SI=SI±1,,DI=DI±1DI=DI±1((字节操作)字节操作) SI=SI±2 SI=SI±2,,DI=DI±2DI=DI±2((字操作)字操作) 若若DF=0DF=0时,使用+号;若时,使用+号;若DF=1DF=1时,使用-号时,使用-号【例【例6.436.43】】实现以实现以FIRSTFIRST单元开始的单元开始的200200个字个字 节数据传送到节数据传送到SECONDSECOND开始的单元开始的单元 中,程序段如下:中,程序段如下:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOVSI,,OFFSET FIRST MOVDI,,OFFSET SECOND MOVCX,,200 L1:: MOVAL,,[SI] MOV[DI],,AL INCSI INCDI DECCX JNZL1 HLT方法一:方法一:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOVSI,,OFFSET FIRST MOVDI,,OFFSET SECOND MOVCX,,200 CLD L1::MOVSB DECCX JNZ L1 HLT方法三:方法三:MOV SI,,OFFSET FIRST MOV DI,,OFFSET SECOND MOV CX,,200 CLD REP MOVSB HLT方法二:方法二:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:CMPS CMPS 目的操作数目的操作数, ,源操作数源操作数 CMPSB CMPSB ;;字节串比较字节串比较 CMPSW CMPSW ;;字串比较字串比较 指令功能:指令功能:[ [DS(0)+SI]DS(0)+SI]--[ES(0)+DI][ES(0)+DI],,但结果但结果 不回送不回送 SI=SI±1SI=SI±1,,DI=DI±1DI=DI±1((字节操作);字节操作); SI=SI±2 SI=SI±2,,DI=DI±2DI=DI±2((字操作)字操作) 若若DF=0DF=0时,使用+号;若时,使用+号;若DF=1DF=1时,使用-号时,使用-号CMPS(Compare Byte or Word String)CMPS(Compare Byte or Word String)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV SI,,OFFSET AREA1 MOV DI,,OFFSET AREA2 MOV BX,,OFFSET AREA3 MOV CX,,30 CLD REPZ CMPSB JNZ L1 MOV [BX],,0 JMP L2 L1::MOV [BX],,0FFH L2::HLT比较以比较以AREA1AREA1和和AREA2AREA2单元开始的单元开始的3030个字个字节数据是否相同,如果相同则节数据是否相同,如果相同则AREA3AREA3单元单元内容为内容为0 0,不同则为,不同则为0 0FFHFFH,,程序段如下:程序段如下:【例【例6.446.44】】2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:SCAS SCAS 目的操作数目的操作数 SCASB SCASB ;;字节串扫描字节串扫描 SCASW SCASW ;;字串扫描字串扫描 指令功能指令功能: : ( (AL)AL)--[ES(0)+DI][ES(0)+DI],,DI=DI±1DI=DI±1((字节操作);字节操作); ( (AX)AX)--[ES(0)+DI][ES(0)+DI],,DI=DI±2DI=DI±2((字操作)字操作) 若若DF=0DF=0时,使用+号;若时,使用+号;若DF=1DF=1时,使用-号时,使用-号3 3.串扫描指令.串扫描指令SCAS(Scan Byte or Word String)SCAS(Scan Byte or Word String)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 8086中用于字符串检索的指令为SCASB/SCASW,用AL中的字节或者AX中的字与位于ES段由DI寄存器所致的内存单元的字或字节相比较。
通过前缀的控制,可以实现在DI所指的字符串中,寻找第一个与AL(或AX)的内容相同(或不同)的字节(或字)对于所有的串操作指令,都要注意方向标志的设置,指令CLD使方向标志DF清0,SI和DI自动增量修改指令STD使DF置1,SI和DI作自动减量修改 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV DI,,OFFSET BLOCK MOV CX,,30 MOV AL,,20H CLD REPNZ SCASB JZ L1 MOV CX,,0 JMP L2 L1::DEC DI MOV CX,,DI L2::HLT【例【例6.456.45】】设设ESES段中自段中自BLOCKBLOCK单元存有单元存有3030个字符数,个字符数, 要求查找其中是否有空格符,若有则将第要求查找其中是否有空格符,若有则将第 一个被找到字符在一个被找到字符在ESES段中的偏移量送到段中的偏移量送到CXCX 中,否则中,否则CXCX值为值为0 0。
2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:STOS STOS 目的操作数目的操作数 STOSB STOSB ;;字节串传送字节串传送 STOSW STOSW ;;字串传送字串传送指令功能指令功能: : AL→AL→[ [ES(0)+DI],DI=DI±1(ES(0)+DI],DI=DI±1(字节操作);字节操作); AX→AX→[ [DS(0)+SI]DS(0)+SI],,DI=DI±2DI=DI±2((字操作)字操作) 若若DF=0DF=0时,使用+号;若时,使用+号;若DF=1DF=1时,使用-号时,使用-号4 4.存入串指令.存入串指令STOS (Store Byte or Word String)STOS (Store Byte or Word String)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:LODS LODS 源操作数源操作数 LODSB LODSB ;;字节串传送字节串传送 LODSW LODSW ;;字串传送字串传送指令功能指令功能: :[ [DS(0)+SI]→AL,SI=SI±1(DS(0)+SI]→AL,SI=SI±1(字节操作);字节操作); [ [DS(0)+SI] →AXDS(0)+SI] →AX,,SI=SI±2SI=SI±2((字操作)字操作) 若若DF=0DF=0时,使用+号;若时,使用+号;若DF=1DF=1时,使用-号时,使用-号 【例【例6.466.46】】设内存缓冲区中有一长度为设内存缓冲区中有一长度为300300的数据的数据 块,起始地址为块,起始地址为BUFFERBUFFER,,要求把这一数要求把这一数 据区中的正数存放在据区中的正数存放在STR1STR1中,负数存放中,负数存放 在在STR2STR2中。
中 5 5.从串中取指令.从串中取指令LODS (Load Byte or Word String)LODS (Load Byte or Word String)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 LEA SI,,BUFFER LEA DI,,STR1 LEA BX,,STR2 MOV CX,,300 CLD L1:: LODSB TEST AL,,80H JNZ L2 ;最高位为最高位为1(负数负数)转转L2 STOSB ;AL内容送内容送DI(STR1)所指内存单元,所指内存单元,DI=DI+1 JMP L3 L2:: XCHG BX,,DI ;;BX与与DI寄存器内容互换寄存器内容互换 STOSB ;;AL内容送内容送BX(STR2)所指内存单元,所指内存单元,BX=BX+1 XCHG BX,,DI ;STOSB只针对只针对DI寄存器寄存器 L3:: DEC CX JNZ L1 HLT2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础1 1.无条件转移指令.无条件转移指令((1 1)无条件跳转指令)无条件跳转指令JMP(Jump)JMP(Jump) JMP JMP指令共有五种格式:指令共有五种格式: ① ① 段内直接短转移:段内直接短转移: 指令格式:指令格式:JMP SHORT JMP SHORT 目标地址目标地址 指令功能:指令功能:转移转移IPIP地址由当前地址由当前IPIP加加8 8位位移量形成,位位移量形成, 只能在段内只能在段内-128~127字节范围内转移。
字节范围内转移②② 段内直接近转移:段内直接近转移:指令格式:指令格式:JMP NEAR PTR 目标地址目标地址指令功能:指令功能:转移的转移的IP值由当前值由当前IP加加16位位移量形位位移量形 成,可以转移到代码段内任何位置成,可以转移到代码段内任何位置6.3.5 6.3.5 控制转移类指令控制转移类指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础③ ③ 段内间接转移:段内间接转移:指令格式:指令格式:JMP WORD PTR JMP WORD PTR 目标地址目标地址指令功能:指令功能:转移的转移的IPIP值位于一通用寄存器中或由寻址值位于一通用寄存器中或由寻址 方式确定的有效地址中方式确定的有效地址中④ ④ 段间直接转移:段间直接转移:指令格式:指令格式:JMP FAR PTR JMP FAR PTR 目标地址目标地址指令功能:指令功能:转移时转移时CSCS和和IPIP值是目标地址所在的段地址值是目标地址所在的段地址 和段内偏移量。
和段内偏移量⑤⑤ 段间间接转移:段间间接转移:指令格式:指令格式:JMP DWORD PTR 目标地址目标地址指令功能:指令功能:转移地址是存储器中的一个双字,高位转移地址是存储器中的一个双字,高位 字是转移地址的字是转移地址的CS值,低位字是转移地址的值,低位字是转移地址的IP值2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.476.47】】JMP SHORTPTR L1;;段内短转移段内短转移 JMP NEAR PTR L2;;段内直接转移段内直接转移 JMP WORD PTR BX;;段内间接转移段内间接转移 JMP FAR PTR L3;;段间直接转移段间直接转移 JMP DWORD PTR [BX];;段间间接转移段间间接转移 JMP DWORD PTR [BX+SI];;段间间接转移段间间接转移2.条件转移指令.条件转移指令 条件转移指令根据上一条指令所设置的标志位来条件转移指令根据上一条指令所设置的标志位来判别测试条件,满足测试条件则转移到由指令指出的判别测试条件,满足测试条件则转移到由指令指出的转向地址处执行程序,不满足测试条件则顺序执行下转向地址处执行程序,不满足测试条件则顺序执行下一条指令。
一条指令 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(1)(1)单个标志位的条件转移指令单个标志位的条件转移指令, ,如下表:如下表: 标志标志 指令助记符指令助记符 测试条件测试条件 指令功能指令功能 ZFJZ/JEZF=1结果为结果为0 0或相等则转移或相等则转移JNZ/JNEZF=0结果不为结果不为0 0或不相等则转移或不相等则转移CFJCCF=1有进位(或借位)则转移有进位(或借位)则转移JNCCF=0无进位(或借位)则转移无进位(或借位)则转移 SFJSSF=1结果为负则转移结果为负则转移JNSSF=0结果为正则转移结果为正则转移OFJOJO=1结果有溢出则转移结果有溢出则转移JNOJO=0结果无溢出则转移结果无溢出则转移PFJP/JPEJP=1结果中结果中1 1的个数为偶数则转移的个数为偶数则转移JNP/JPOJP=0结果中结果中1 1的个数为奇数则转移的个数为奇数则转移2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令助记指令助记符符指令功能指令功能JA/JNBEJA/JNBE大于大于/ /不小于等于则转移不小于等于则转移JAE/JNBJAE/JNB大于等于大于等于/ /不小于则转移不小于则转移JB/JNAEJB/JNAE小于小于/ /不大于等于则转移不大于等于则转移JBE/JNAJBE/JNA小于等于小于等于/ /不大于则转移不大于则转移((3 3)判断有符号数大小条件转移指令如下表。
判断有符号数大小条件转移指令如下表指令助记符指令助记符指令功能指令功能JG/JNLEJG/JNLE大于大于/ /不小于等于则转移不小于等于则转移JGE/JNLJGE/JNL大于等于大于等于/ /不小于则转移不小于则转移JL/JNGEJL/JNGE小于小于/ /不大于等于则转移不大于等于则转移JLE/JNGJLE/JNG小于等于小于等于/ /不大于则转移不大于则转移((2 2)判断无符号数大小条件转移指令如下表判断无符号数大小条件转移指令如下表2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:JCXZ JCXZ 目标标号目标标号指令功能:指令功能:当当CXCX为为0 0时转移,时转移,CXCX非非0 0时不转移时不转移 JCXZ JCXZ指令相当于:指令相当于:CMP CXCMP CX,,0 0 JZ 标号标号3 3.循环指令.循环指令 8086 8086的循环指令主要包括的循环指令主要包括LOOPLOOP、、LOOPE/LOOPZLOOPE/LOOPZ、、LOOPNE/LOOPNZLOOPNE/LOOPNZ。
1 1))指令格式:指令格式:LOOP LOOP 标号标号 指令功能:指令功能:循环次数循环次数( (CX)-1→CX,CX)-1→CX,若若CX=0CX=0则退出则退出 循环循环, ,若若CX≠0CX≠0则循环则循环. .LOOPLOOP指令相当于:指令相当于:DEC CX DEC CX JNZ JNZ 标号标号((4 4))CXCX条件转移指令条件转移指令JCXZJCXZ2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(2)(2)指令格式指令格式::LOOPE/LOOPZLOOPE/LOOPZ标号标号 指令功能:指令功能:循环次数循环次数( (CX)-1→CXCX)-1→CX,,若若CX=0CX=0则退出则退出 循环循环, ,若若CX≠0CX≠0且且ZF=1(ZF=1(结果为结果为0 0或相等时或相等时) )则循环3)(3)指令格式:指令格式:LOOPNE/LOOPNZLOOPNE/LOOPNZ标号标号 指令功能:指令功能:循环次数(循环次数(CXCX)-)-1→CX1→CX,,若若CX=0CX=0则退则退 出循环,若出循环,若CX≠0CX≠0且且ZF=0ZF=0((结果不为结果不为0 0或不相等时)或不相等时) 则循环。
则循环例【例6.486.48】】自自ARRAYARRAY开始的内存缓冲区中,有开始的内存缓冲区中,有8080个个1616 位有符号数,找出最大值,存放在位有符号数,找出最大值,存放在MAXMAX存存 储单元中储单元中2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV BX,,OFFSET ARRAY MOV DI,,OFFSET MAX MOV AX,,[BX] INC BX INC BX MOV CX,,79 ;;第一个数已经送进第一个数已经送进AX中中 L1::CMP AX,,[BX] ;AX中始终存放最大数中始终存放最大数 JG L2 MOV AX,,[BX] L2::INC BX INC BX LOOP L1 ;;CX-1送入送入CX MOV [DI],,AX HLT2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 (1) (1)子程序调用指令子程序调用指令CALLCALL CALL CALL指令用于暂停正在执行的主程序,转去执指令用于暂停正在执行的主程序,转去执行相应的子程序,子程序执行完后再返回到主程序行相应的子程序,子程序执行完后再返回到主程序中,所以要把中,所以要把CALLCALL指令的下一条指令的指令的下一条指令的CSCS和和IPIP值入值入栈保护。
栈保护① ① 段内直接调用段内直接调用指令格式指令格式: :CALL CALL 直接地址直接地址 或或 CALL NEAR PTR CALL NEAR PTR 标号标号指令功能:指令功能:首先将断点的首先将断点的IPIP值压入堆栈,再将子程值压入堆栈,再将子程序的地址偏移量加到当前序的地址偏移量加到当前IPIP上,然后根据上,然后根据IPIP转到相转到相应子程序执行应子程序执行4 4.子程序及中断指令.子程序及中断指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:CALL CALL 寄存器寄存器 或或 CALL WORD PTR CALL WORD PTR存储器存储器指令功能:指令功能:首先将断点的首先将断点的IPIP值压入堆栈,再将子程值压入堆栈,再将子程序的地址偏移量送入序的地址偏移量送入IPIP,,然后根据然后根据IPIP转到相应子程转到相应子程序执行③ ③ 段间直接调用段间直接调用指令格式:指令格式:CALL FAR PTR CALL FAR PTR 标号标号指令功能:指令功能:首先将断点的首先将断点的CSCS值压入堆栈,并将子程值压入堆栈,并将子程序的段地址送入序的段地址送入CSCS;;再把断点的再把断点的IPIP值压入堆栈,把值压入堆栈,把子程序的地址偏移量送入子程序的地址偏移量送入IPIP,,然后根据然后根据CSCS::IPIP值转值转到相应子程序执行。
到相应子程序执行② ② 段内间接调用段内间接调用2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:CALL DWORD PTR CALL DWORD PTR 存储器存储器指令功能:指令功能:首先将断点的首先将断点的CSCS值压入堆栈,并将指令值压入堆栈,并将指令中指定的双字存储器的第二个字的内容送入中指定的双字存储器的第二个字的内容送入CSCS;;再再把断点的把断点的IPIP值压入堆栈,然后把双字存储器的第一值压入堆栈,然后把双字存储器的第一个字的内容送入个字的内容送入IPIP,,最后根据最后根据CSCS::IPIP值转到相应子值转到相应子程序执行程序执行例】【例】CALL NEAR PTR L1 ;;段内直接调用段内直接调用 CALL 1000H ;;段内直接调用段内直接调用 CALL BX ;;段内间接调用段内间接调用 CALL WORD PTR [BX] ;;段内间接调用段内间接调用 CALL FAR PTR L2 ;;段间直接调用段间直接调用 CALL DWORD PTR [BX] ;;段间间接调用段间间接调用 CALL DWORD PTR[BX+SI] ;;段间间接调用段间间接调用④ ④ 段间间接调用段间间接调用2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础RETRET与与CALLCALL相对应,通常作为一个子程序的最相对应,通常作为一个子程序的最后一条指令,用以返回到调用这个子程序的主程序后一条指令,用以返回到调用这个子程序的主程序断点处继续执行。
断点处继续执行① ① 直接返回指令直接返回指令指令格式:指令格式:RETRET指令功能:指令功能:若是段内的若是段内的RETRET指令,只返回主程序断点指令,只返回主程序断点处的处的IPIP值,即从堆栈中弹出一个字送值,即从堆栈中弹出一个字送IPIP;;若是段间的若是段间的RETRET指令,则要返回主程度断点处的指令,则要返回主程度断点处的CSCS和和IPIP值,即从值,即从堆栈中弹出一个字送堆栈中弹出一个字送IPIP,,再从堆栈中弹出一个字送再从堆栈中弹出一个字送CSCS2 2)子程序返回指令)子程序返回指令RETRET2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:RETRETn n指令功能:指令功能:先执行与先执行与RETRET相同的操作相同的操作, ,再修改再修改SPSP,,使使SP+n→SP,nSP+n→SP,n为一个十六位的立即数为一个十六位的立即数, ,通常是偶数通常是偶数, ,表示表示返回时从堆栈中舍弃的字节数返回时从堆栈中舍弃的字节数3 3)中断指令)中断指令① ① 中断调用指令中断调用指令INTINT指令格式指令格式: :INT n;nINT n;n为中断类型号为中断类型号, ,值为值为n=0~255 指令功能:指令功能:把把PSWPSW、、CSCS、、IPIP寄存器内容依次压入堆栈,寄存器内容依次压入堆栈,并根据中断类型号从中断向量表中取出连续四个字节并根据中断类型号从中断向量表中取出连续四个字节的内容赋予的内容赋予IPIP和和CSCS,,转到中断服务程序执行。
转到中断服务程序执行② ② 带立即数返回指令带立即数返回指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令格式:指令格式:INTOINTO 指令功能:指令功能:若若OF=1OF=1则启动一个中断类型号为则启动一个中断类型号为4 4的中断的中断 过程,否则不中断过程,否则不中断③ ③ 中断返回指令中断返回指令IRETIRET指令格式:指令格式:IRETIRET指令功能:指令功能:放在中断服务程序的最后,用于返回主放在中断服务程序的最后,用于返回主程序,同时从堆栈中恢复程序,同时从堆栈中恢复IPIP、、CSCS、、PSWPSW寄存器的内容,寄存器的内容,返回原断点执行程序返回原断点执行程序② ② 溢出中断指令溢出中断指令INTOINTO2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.3.6 6.3.6 处理机控制指令处理机控制指令 1.1.标志处理指令标志处理指令(1)CLC(1)CLC 进位位清零进位位清零,(,(CF)←0CF)←0(2)CMC(2)CMC 进位位求反进位位求反,(,(CF)←(CF)CF)←(CF)(3)STC(3)STC 进位位置位进位位置位,(,(CF)←1CF)←1(4)CLD(4)CLD 方向标志清零方向标志清零,(,(DF)←0DF)←0(5)STD (5)STD 方向标志置位,方向标志置位, ( (DF)←1DF)←1(6)CLI(6)CLI 中断标志清零,中断标志清零,( (IF)←0IF)←0(7)STI(7)STI 中断标志置位,中断标志置位,( (IF)←1IF)←12024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(1)HLT(1)HLT暂停,使暂停,使80868086CPUCPU进入暂停状态,进入暂停状态,除非复位除非复位 或有中断发生退出暂停状态。
或有中断发生退出暂停状态2)ESC(2)ESC又称换码指令、交权指令,又称换码指令、交权指令,把控制权交给协把控制权交给协 处理器,处理器,即把存储单元的内容送到数据总线,由即把存储单元的内容送到数据总线,由 协处理器获得该内容协处理器获得该内容3)WAIT(3)WAIT等待,检测等待,检测TESTTEST状态,状态,若若TESTTEST无效无效( (高电高电 平平) )则等待,则等待,否则执行否则执行WAITWAIT指令后的下条指令指令后的下条指令2 2..其他处理机控制指令其他处理机控制指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(4)LOCK(4)LOCK总线封锁,总线封锁,LOCKLOCK可加在任何指令前作为前可加在任何指令前作为前 缀,缀,使得处理机在执行该指令期间保持总线锁定使得处理机在执行该指令期间保持总线锁定 信号信号LOCKLOCK有效,有效,把总线封锁,使别的主设备不能把总线封锁,使别的主设备不能 控制总线,以便实现多处理机对资源共享的要求控制总线,以便实现多处理机对资源共享的要求。
(5)NOP(5)NOP空操作,空操作,NOPNOP使使CPUCPU不执行任何操作,除非响不执行任何操作,除非响应外中断放在程序中有两个作用:一是让它应外中断放在程序中有两个作用:一是让它占有占有一定的存储单元一定的存储单元,以便以后用其他指令代替;二是,以便以后用其他指令代替;二是可以起到可以起到延时延时的作用2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.4 6.4 汇编语言程序设计基础汇编语言程序设计基础 6.4.1 6.4.1 伪指令伪指令 伪指令语句是说明性语句,伪指令语句是说明性语句,不像机器指令,它不像机器指令,它没有对应的机器码,没有对应的机器码,汇编后不产生目标代码,只是汇编后不产生目标代码,只是在对程序汇编时起作用在对程序汇编时起作用1 1.数据定义伪指令.数据定义伪指令 数据定义伪指令包括数据定义伪指令包括DBDB、、DWDW、、DDDD、、DQDQ、、DTDT,,用于用于定义变量及分配存储区定义变量及分配存储区指令格式指令格式: : [ [变量名变量名] ] 数据定义伪指令数据定义伪指令, ,操作数项操作数项指令功能:指令功能:用于定义变量的类型、给存储器赋初值用于定义变量的类型、给存储器赋初值 或给变量分配存储单元。
或给变量分配存储单元2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 方括号中的变量名为任选项,方括号中的变量名为任选项,变量名后不跟冒号变量名后不跟冒号 DB DB定义定义字节字节类型变量,类型变量,DWDW定义定义字字类型变量,类型变量,DDDD定义定义 双字双字类型变量,类型变量,DQDQ定义定义四字四字类型变量,类型变量,DTDT定义定义十十字字 类型变量类型变量 操作数值不能超出相应数据类型限定的取值范围操作数值不能超出相应数据类型限定的取值范围 操作数项可以包括多个数据,它们之间用操作数项可以包括多个数据,它们之间用逗号逗号隔隔 开操作数项可以是常数表达式、地址表达式开操作数项可以是常数表达式、地址表达式( (仅仅 适用适用DWDW、、DDDD) )、、字符串(字符串(超过超过2 2个字符仅用个字符仅用DBDB)、)、问问 号号( (只分配存储单元只分配存储单元, ,而不赋值而不赋值) )、重复子句、重复子句DUPDUP注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 BUF1 BUF1::DB 90HDB 90H,,80H80H;;变量不能有冒号变量不能有冒号 BUF2 DB 1000 BUF2 DB 1000;;操作数项超过了字节数的取值范围操作数项超过了字节数的取值范围 BUF3 DD BUF3 DD ‘HELLO’‘HELLO’;;超超过过2 2个个字字符符的的字字符符串串只只能能用用DBDB BUF4 DB BLOCK BUF4 DB BLOCK;;地址表达式只能用地址表达式只能用DWDW或或DDDD定义定义 如将如将DBDB改为改为DWDW,,则操作数项表示则操作数项表示取取BLOCKBLOCK的偏移地的偏移地址;址;如将如将DBDB改为改为DDDD,,则操作数项表示则操作数项表示取取BLOCKBLOCK的偏移的偏移地址和段地址,地址和段地址,且第一个字为偏移地址,第二个字为且第一个字为偏移地址,第二个字为段地址。
段地址例【例6.506.50】】下面是不正确的定义:下面是不正确的定义:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 14H20H41H42H43H--00H00H--00H00HDATA145H44H03H00H----03H00H----DATA2--------32H00H00H00H0F7H0FFH00H00HDATA3【例【例6.516.51】】画出下列存储单元分配示意图,画出下列存储单元分配示意图, 如图如图6-4-16-4-1所示:所示: (1) DATA1DB 20,,20H,,‘ABC’,,2 DUP(?,(?,2 DUP(0))) (2) DATA2DW ‘DE’,,2 DUP((3,?),?) (3) DATA3DD ?,?,5*10,,-92024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础2 2.赋值伪指令.赋值伪指令 指令格式:指令格式:名字名字 EQU EQU 表达式表达式 指令功能:指令功能:将表达式的值赋予一个名字,以后可以将表达式的值赋予一个名字,以后可以 用这个名字来代替对应的表达式。
用这个名字来代替对应的表达式 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础表表达达式式可可以以是是一一个个常常数数、、符符号号、、数数值值表表达达式式或或地地址表达式址表达式已已赋赋值值的的名名字字可可以以在在以以后后的的赋赋值值语语句句中中引引用用如如下面两条语句执行后下面两条语句执行后TAB2TAB2的值为的值为6 6 TAB1TAB1 EQU 9 EQU 9 TAB2 TAB2 EQU TAB1 EQU TAB1--3 3EQU伪指令的功能类似于伪指令的功能类似于等号等号“=”的功能,区别的功能,区别在于由在于由EQU赋值的名字不可重复赋值,而由赋值的名字不可重复赋值,而由“=”赋值的名字可以重复赋值赋值的名字可以重复赋值如:如:STR=1 STR=STR+1注意事项:注意事项:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)完整段定义伪指令)完整段定义伪指令 指令格式:指令格式:段名段名 SEGMENTSEGMENT …… …… 段名段名 ENDSENDS 指令功能:指令功能:SEGMENTSEGMENT和和ENDSENDS成对使用,用来定义一成对使用,用来定义一 个段的开始和结束。
个段的开始和结束 注意事项注意事项: :SEGMENTSEGMENT和和ENDSENDS前面的前面的段名段名必须一致必须一致SEGMENSEGMEN和和ENDSENDS之间的语句是定义段的内容之间的语句是定义段的内容. .可以定义代码段、数据段、附加数据段和堆栈段可以定义代码段、数据段、附加数据段和堆栈段3 3.段定义伪指令.段定义伪指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式指令格式: :ASSUME ASSUME 段寄存器名段寄存器名: :段名段名[,[,段寄存器段寄存器 名名: :段名段名] ]指令功能指令功能::由于段名是用户定义的,所以要指由于段名是用户定义的,所以要指 明哪个段名对应哪个段寄存器明哪个段名对应哪个段寄存器注意事项:注意事项:段寄存器名必须是段寄存器名必须是CSCS、、DSDS、、ESES、、SSSS中的中的 一个,而段名则必须是由一个,而段名则必须是由SEGMENTSEGMENT定义的定义的 段名,并且用段名,并且用SEGMENTSEGMENT定义了几个段,定义了几个段, ASSUME ASSUME伪指令就需要指明几个段。
伪指令就需要指明几个段2 2)指定段寄存器伪指令)指定段寄存器伪指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 过过程程定定义义伪伪指指令令用用来来定定义义一一个个子子程程序序,,子子程程序序又又称称过过程程,,在在主主程程序序中中由由CALLCALL指指令令调调用用,,调调用用结结束束将将返返回回到到主主程程序序中中CALLCALL指指令令的的下下一一条条指指令令继继续续执执行行,,而子程序中必须有一条返回指令而子程序中必须有一条返回指令RETRET 指令格式:指令格式:过程名过程名 PROCPROC类型类型 …… …… 过程名过程名 ENDPENDP 指令功能:指令功能:PROCPROC和和ENDPENDP成对使用,用来定义一个过成对使用,用来定义一个过 程的开始和结束程的开始和结束 注意事项:注意事项:PROCPROC和和ENDPENDP前面的过程名必须一致。
前面的过程名必须一致4 4.过程定义伪指令.过程定义伪指令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础PROCPROC和和ENDPENDP之间的语句是定义过程的内容之间的语句是定义过程的内容过过程程的的类类型型有有NEARNEAR和和FARFAR两两种种,,在在本本段段内内调调用用的的过过程程是是NEARNEAR过过程程,,可可在在不不同同段段间间调调用用的的过过程程是是FARFAR过过程,定义时若不指定类型,程,定义时若不指定类型,缺省为缺省为NEARNEAR类型5 5.模块定义伪指令.模块定义伪指令 在汇编语言中每一个独立的源程序称为一个模块,在汇编语言中每一个独立的源程序称为一个模块,在源程序的开始可以用在源程序的开始可以用NAMENAME或或TITLETITLE伪指令为模块命名,伪指令为模块命名,而源程序结束使用而源程序结束使用ENDEND伪指令指令格式:指令格式:NAME NAME 模块名模块名 TITLE TITLE 模块名模块名 ENDEND [ [标号标号] ]2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 NAME NAME伪指令可以缺省伪指令可以缺省, ,如果缺省如果缺省NAMENAME指令指令, ,汇编程汇编程序序 以以TITLETITLE指令中前指令中前6 6个个字符作为模块名字符作为模块名. . TITLE TITLE伪指令用于给程序一个标题伪指令用于给程序一个标题, ,列表文件列表文件中每中每一一 页的第一行都会显示这个标题页的第一行都会显示这个标题, ,它是用户任意选它是用户任意选定定 的字符串的字符串, ,但是字符的个数不能超过但是字符的个数不能超过6060. .TITLETITLE指指令令 也可以缺省也可以缺省, ,如果如果NAMENAME和和TITLETITLE都缺省都缺省, ,则以源文则以源文件件 名作为模块名名作为模块名. . END END伪指令中的标号指出程序开始执行的第一条指伪指令中的标号指出程序开始执行的第一条指 令的地址令的地址, ,ENDEND不能缺省。
不能缺省指令功能:指令功能:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础ENDS段结束ENDP过程结束END完整的程序结束格式: END 过程操作数FAR的PROC2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础指令格式:指令格式:ORGORG n n指令功能:指令功能:为指令或数据设置由为指令或数据设置由n n开始的偏移地址开始的偏移地址注意事项:注意事项:n n的取值范围是的取值范围是0~655357 7.地址计数器伪指令.地址计数器伪指令指令格式:指令格式:$ $指令功能:指令功能:在汇编程序内,为了指示在汇编程序内,为了指示下一个下一个数据或数据或 指令在相应段中的偏移量,汇编程序使指令在相应段中的偏移量,汇编程序使 用了一个用了一个当前位置计数器当前位置计数器$ $例【例6.51】】执行下面程序段后,(执行下面程序段后,(CX))= STR1 DW‘AB’ STR2 DB 16 DUP(?)(?) CNT EQU $-STR1 MOV CX,, CNT6 6.偏移地址设置伪指令.偏移地址设置伪指令12H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.4.2 6.4.2 汇编语言语句格式汇编语言语句格式1 1.名字项.名字项((1 1)名字项的组成规则)名字项的组成规则 组成名字的字符可以是:组成名字的字符可以是:A~Z、、a~z 、、0~9、?、、?、· 、、 @ 、、$ 、、_ 名字中名字中不能以数字开头不能以数字开头;;问号问号本身不能单独作为名本身不能单独作为名 字;如果用到字;如果用到“·”“·”则必须是第一个字符则必须是第一个字符. . 名字的最大长度为名字的最大长度为3131,若超过则后续字符无效。
若超过则后续字符无效 在汇编语言源程序中每个语句可由四项组成,在汇编语言源程序中每个语句可由四项组成,格式如下:格式如下: [ [名字项名字项] ] 操作项操作项 操作数项操作数项 [ [注释项注释项] ]2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 名名字字项项可可以以是是标标号号和和变变量量标标号号在在代代码码段段中中定定义义,,后后跟跟冒冒号号,,用用以以表表示示转转向向地地址址;;变变量量在在除除代码段以外的其它段中定义,后不跟冒号代码段以外的其它段中定义,后不跟冒号2 2.操作项.操作项 操作项可以是操作项可以是指令、伪指令的助记符指令、伪指令的助记符对于指令,对于指令,汇编程序将其翻译为机器语言;对于伪指令,汇编程汇编程序将其翻译为机器语言;对于伪指令,汇编程序将根据其所要求的功能进行处理序将根据其所要求的功能进行处理3 3.操作数项.操作数项 操作数项可以是操作数项可以是常量、变量、表达式和标号常量、变量、表达式和标号2 2)名字项的构成)名字项的构成2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)算术运算符)算术运算符 算术运算符有:算术运算符有:+、-、+、-、* *、/、、/、MODMOD((取余)取余) 变量变量是存放在存储单元或寄存器中的数据;是存放在存储单元或寄存器中的数据; 表表达达式式是是由由常常数数、、变变量量通通过过操操作作运运算算符符连连接接而而成成的的,,这这些些操操作作运运算算符符主主要要分分为为::算算术术运运算算符符、、逻逻辑运算符和关系运算符等;辑运算符和关系运算符等; 标号标号则表示机器指令的符号地址。
则表示机器指令的符号地址例【例6.536.53】】把首地址为把首地址为ARRAYARRAY的字数组的第的字数组的第5 5个个 字传送到字传送到AXAX寄存器中指令如下:寄存器中指令如下: MOV BXMOV BX,,OFFSET ARRAYOFFSET ARRAY MOV AX MOV AX,,[BX+[BX+((5 5--1 1))*2]*2] 常量常量就是指令中出现的一些就是指令中出现的一些固定值固定值,可分为,可分为数数值常量和字符串常量;值常量和字符串常量;2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((2 2))逻辑运算符逻辑运算符 逻辑运算符有:逻辑运算符有:ANDAND、、OROR、、NOTNOT、、XORXOR【【例例6.546.54】】ANDANDAXAX,,35H AND 0FH35H AND 0FH第一个第一个ANDAND是逻辑与指令,第二个是逻辑与指令,第二个ANDAND是逻辑运算符。
是逻辑运算符3 3)关系运算符)关系运算符 关关系系运运算算符符有有::EQEQ((等等于于))、、NENE((不不等等于于))、、LTLT((小于)、小于)、GTGT((大于)、大于)、LELE((小于等于)、小于等于)、 GE GE((大于等于)大于等于) 参参加加运运算算的的必必须须是是两两个个数数值值或或同同一一段段内内的的两两个个存存储储单单元元地地址址计计算算结结果果应应为为逻逻辑辑值值,,当当关关系系式式成成立立时时,,结结果果为为真真,,用用全全1 1表表示示;;当当关关系系式式不不成成立立时时,,结结果为假,用果为假,用0 0表示2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.556.55】】MOV AXMOV AX,,5 GT 2 5 GT 2 因为因为5 5>>2 2关系式成立,所以结果关系式成立,所以结果 为真,即(为真,即(AXAX))=0FFFFH=0FFFFH4)分析运算符)分析运算符 分析运算符有分析运算符有:TYPE、、LENGTH、、SIZE、、OFFSET、、SEG① ① 指令格式:指令格式:TYPETYPE变量或标号变量或标号 指令功能指令功能: :如果是变量如果是变量, ,则汇编程序将回送该变量则汇编程序将回送该变量的类型值的类型值: :DBDB为为1,1,DWDW为为2 2,,DDDD为为4 4,,DQDQ为为8 8,,DTDT为为10;10;如如果是标号果是标号, ,则汇编程序将回送代表该标号类型的数值则汇编程序将回送代表该标号类型的数值: :NEARNEAR为为-1,-1,FARFAR为为-2-2。
② ② 指令格式:指令格式:LENGTH LENGTH 变量变量 指令功能指令功能: :对于变量中使用对于变量中使用DUPDUP的情况的情况, ,则返回则返回外外层层DUPDUP的给定值;的给定值;如果没有使用如果没有使用DUP,DUP,则返回值是则返回值是1.1.2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础③ ③ 指令格式:指令格式:SIZESIZE变量变量 指令功能:指令功能:汇编程序将返回分配给该变量的字节汇编程序将返回分配给该变量的字节 数,此值是数,此值是LENGTHLENGTH和和TYPETYPE的乘积ONE DB ‘GOOD’TWO DW 30 DUP(?)(?)THREE DD 1,,2MOV AH,,TYPE ONE ;(;(AH))=1回送该变量的类型值回送该变量的类型值MOV AL,,TYPE TWO;(;(AL))=2MOV BH,,TYPE THREE ; ((BH))=4MOV BL,,LENGTH ONE ;(;(BL))=1使用使用DUPDUP的情况的情况MOV CH,,LENGTH TWO ;(;(CH))=30MOV CL,,LENGTH THREE ; ((CL))=1MOV DH,,SIZE ONE ;(;(DH))=1MOV DL,,SIZE TWO ;(;(DL))=60MOV DI,,SIZE THREE ;(;(DI))=42024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础⑤ ⑤ 指令格式:指令格式:SEGSEG变量或标号变量或标号 指令功能:指令功能:回送变量或标号的段地址值。
回送变量或标号的段地址值例【例6.576.57】】设符号地址设符号地址BLOCKBLOCK所在的段地址为所在的段地址为10001000H H,, 偏移地址为偏移地址为20002000H H,,则执行下面指令:则执行下面指令: MOV MOVSISI,,OFFSET BLOCKOFFSET BLOCK;(;(SISI))=2000H=2000H MOV DI MOV DI,,SEGSEGBLOCK BLOCK ;(;(DIDI))=1000H=1000H④ ④ 指令格式:指令格式:OFFSET OFFSET 变量或标号变量或标号 指令功能:指令功能:回送变量或标号的偏移地址值回送变量或标号的偏移地址值2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 属性运算符有属性运算符有: :PTRPTR、、THISTHIS、、SHORTSHORT、、段操作符段操作符① ① 指令格式:指令格式:类型类型PTRPTR 存储器存储器 指令功能:指令功能:运算符运算符PTRPTR用于指定存储器操作数的用于指定存储器操作数的 类型,类型可以是类型,类型可以是BYTEBYTE、、WORDWORD、、 DWORD DWORD、、NEARNEAR、、 FAR FAR。
例例6.586.58】】如下面是使用如下面是使用PTRPTR运算符的例子:运算符的例子: INC BYTE INC BYTEPTR [BX]PTR [BX] 在这条语句中操作数是存储单元,如果只使用在这条语句中操作数是存储单元,如果只使用[ [BX]BX],,则汇编该语句时不能确定存储单元是字节单则汇编该语句时不能确定存储单元是字节单元还是字单元,所以必须使用元还是字单元,所以必须使用PTRPTR来说明5 5)属性运算符)属性运算符MOV [BX], 4 错;– –MOV WORD PTR [BX], 4MOV WORD PTR [BX], 4– –MOV BYTE PTR [BX], 4MOV BYTE PTR [BX], 42024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指令功能:指令功能:建立一个指定类型(建立一个指定类型(BYTEBYTE、、WORDWORD、、 DWORD DWORD))或指定距离(或指定距离(NEARNEAR、、 FAR FAR))的的 地址操作数,该操作数的段地址和偏地址操作数,该操作数的段地址和偏 移地址与下一个存储单元地址相同。
移地址与下一个存储单元地址相同例【例6.596.59】】如下面是使用如下面是使用THISTHIS运算符的例子:运算符的例子: DATA1 EQU DATA1 EQU THIS BYTE THIS BYTE DATA2 DW 30 DUP DATA2 DW 30 DUP((0 0)) 在这两条语句中的在这两条语句中的DATA1DATA1和和DATA2DATA2实际上表示同一实际上表示同一个数据区地址,由个数据区地址,由3030个字组成,只是个字组成,只是DATA1DATA1的类型为的类型为字节,而字节,而DATA2DATA2的类型为字的类型为字② ② 指令格式:指令格式:THISTHIS 属性或类型属性或类型2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 指指令令功功能能::用用来来指指定定JMPJMP指指令令中中转转向向地地址址的的属属性性,,即即指指出出转转向向地地址址是是在在下下一一条条指指令令地地址址的的-128~+127个字节的范围内。
个字节的范围内④ ④ 指令格式:指令格式:段寄存器段寄存器 :存储器:存储器 指指令令功功能能::冒冒号号跟跟在在段段寄寄存存器器名名之之后后,,给给一一个个存存储器操作数指定段属性,也称为储器操作数指定段属性,也称为段超越段超越例【例6.606.60】】取出取出ESES段内偏移地址由段内偏移地址由BXBX和和SISI指定指定 存储单元内容送存储单元内容送DIDI的指令为:的指令为: MOVMOVDIDI,,ESES::[BX+SI][BX+SI]③ ③ 指令格式:指令格式:SHORT SHORT 标号标号2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础(),(),[ ],,LENGTH、、SIZE冒号:冒号: PTR、、OFFSET、、SEG、、TYPE、、THIS*、、/、、MOD、、SHL、、SHR+、-+、-EQ、、NE、、LT、、LE、、GT、、GENOTANDOR、、XOR SHORT((6 6)运算符的优先级)运算符的优先级2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 注注释释项项是是一一个个任任选选字字段段,,在在汇汇编编语语言言语语句句的的最最后后,,它它必必须须以以分分号号开开始始,,如如果果注注释释的的内内容容超超出出一一行行,,则则第第二二行行要要以以分分号号开开始始。
注注释释项项的的内内容容不不影影响响程程序序的的功功能能,,也也不不出出现现在在汇汇编编后后的的机机器器代代码码中,只是提高程序的可读性中,只是提高程序的可读性6.4.3 6.4.3 汇编语言程序框架汇编语言程序框架1 1.汇编语言程序框架格式.汇编语言程序框架格式 汇编语言程序框架格式如下(格式一):汇编语言程序框架格式如下(格式一):2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础DATASEGMENT ;;定义数据段定义数据段 …… ;SEGMENTSEGMENT和和ENDSENDS成对使用,用来定义一个段的开始和结束成对使用,用来定义一个段的开始和结束DATAENDSEDATA SEGMENT ;;定义附加数据段定义附加数据段 …… ;变量在除变量在除代码段以外代码段以外的其它段中定义,后不跟冒号的其它段中定义,后不跟冒号EDATA ENDSSTACK SEGMENT ;;定义堆栈段定义堆栈段 ……STACK ENDSCODESEGMENT ASSUME CS::CODE,,DS::DATA,,ES::EDATA,,SS::STACK ;SEGMENTSEGMENT定义了几个段,定义了几个段,ASSUMEASSUME伪指令就需要指明几个段伪指令就需要指明几个段START: MOVAX,,DATA ;;给给DSDS段赋值段赋值 MOV DS,,AX ;标号在标号在代码段代码段中定义,后跟冒号,用以表示转向地址中定义,后跟冒号,用以表示转向地址 MOV AX,,EDATA ;;给给ESES段赋值段赋值 MOV ES,,AX2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础MOV AX,,STACK ;;给给SSSS段赋值段赋值MOV SS,,AX ……MOV AH,,4CH ;将所需要调用的子程序的功能号送入将所需要调用的子程序的功能号送入AHAH寄存器寄存器,4,4CHCH返回返回DOSDOSINT 21H ;该指令将程序控制自动转向相应子程序的入口并执行功能该指令将程序控制自动转向相应子程序的入口并执行功能CODE ENDSEND START; ENDEND伪指令中的标号指出程序开始执行的第一条指伪指令中的标号指出程序开始执行的第一条指 令的地址令的地址, ,ENDEND不能缺省。
不能缺省NAMENAME和和TITLETITLE都缺省都缺省, ,则以源文件名作为模块名则以源文件名作为模块名. .汇编语言程序框架格式如下(格式二):汇编语言程序框架格式如下(格式二):DATA SEGMENT ;;定义数据段定义数据段 ……DATAENDSEDATASEGMENT ;;定义附加数据段定义附加数据段 ……EDATAENDS2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础STACK SEGMENT ;;定义堆栈段定义堆栈段 ……STACK ENDSCODE SEGMENT ASSUME CS::CODE,,DS::DATA,,ES::EDATA,,SS::STACKMAIN PROC FAR; PROCPROC和和ENDPENDP成对使用,用来定义一个过程的开始和结束成对使用,用来定义一个过程的开始和结束START::PUSH DS ;;另一种返回另一种返回DOS的方式的方式 XOR AX,,AX ;结果为零,进位标志为零结果为零,进位标志为零 PUSH AX MOV AX,,DATA ;;给给DS段赋值段赋值 MOV DS,,AX MOV AX,,EDATA ;;给给ES段赋值段赋值 MOV ES,,AX 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV AX,,STACK ;;给给SS段赋值段赋值 MOV SS,,AX …… RET MAIN ENDP CODE ENDS END START; ENDEND伪指令中的标号指出程序开始执行的第一条指伪指令中的标号指出程序开始执行的第一条指 令的地址令的地址, ,ENDEND不能缺省。
不能缺省NAMENAME和和TITLETITLE都缺省都缺省, ,则以源文件名作为模块名则以源文件名作为模块名. .2 2.汇编语言程序框架格式说明.汇编语言程序框架格式说明((1 1))任任何何一一个个汇汇编编语语言言的的源源程程序序,,至至少少应应含含有有一一个个代码段代码段,,其它其它段视需要而定段视需要而定2))ASSUME伪伪指指令令只只是是说说明明了了汇汇编编程程序序中中段段寄寄存存器器与与逻逻辑辑段段之之间间的的关关系系,,并并没没有有给给段段寄寄存存器器赋赋予予实实际际的的初初值值,,所所以以要要在在代代码码段段的的开开始始处处给给各各段段寄寄存存器器赋赋值值((代代码码段段CS由由系系统统自自动动赋赋值值)),,使使用用了了这这样样的语句:的语句:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础MOVAX,,DATAMOVDS,,AXMOVAX,,EDATAMOVES,,AXMOVAX,,STACKMOVSS,,AX((3))在在IBM-PC DOS环境下运行汇编语言程序,为环境下运行汇编语言程序,为了使程序执行结束后正常返回了使程序执行结束后正常返回DOS系统,要在代系统,要在代码段中使用如下的指令:码段中使用如下的指令: 格式一中使用:格式一中使用:MOV AH,,4CH INT 21H 这两条语句是利用这两条语句是利用DOS系统功能调用(调用系统功能调用(调用号为号为4CH),),执行后将由系统结束程序并返回到执行后将由系统结束程序并返回到DOS状态下。
状态下重置系统状态,执行的第重置系统状态,执行的第一条指令位于一条指令位于FFFF0HFFFF0H– –CS = CS = FFFFhFFFFh– –IP = 0000hIP = 0000h– –其余各个寄存器清零其余各个寄存器清零2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MAIN PROC FAR START::PUSH DS XOR AX,,AX PUSH AX …… RET MAIN ENDP 为了使用过程编写程序,并能自动返回为了使用过程编写程序,并能自动返回DOSDOS,,所以要在过程段的开始处,先将所以要在过程段的开始处,先将DSDS入栈入栈,然后再,然后再将将段内偏移量段内偏移量0 0入栈入栈,在过程结束时,执行,在过程结束时,执行RETRET指指令后,就会结束程序并返回令后,就会结束程序并返回DOSDOS系统系统格式二中使用:格式二中使用:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 格式一:格式一: DATASEGMENT BUFF1 DB20 DUP((‘R’)) DATAENDS EDATASEGMENT BUFF2DB20 DUP(?)(?) EDATAENDS CODESEGMENT ASSUME CS:CODE, DS:DATA, ES:EDATA START::MOVAX,,DATA MOVDS,,AX MOVAX,,EDATA MOVES,,AX【例【例6.616.61】】把内存中以把内存中以BUFF1BUFF1开始的开始的2020个字母个字母R R传送传送到以到以BUFF2BUFF2开始的单元中,写出完整的汇编语言程开始的单元中,写出完整的汇编语言程序。
序2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOVSI,,OFFSETBUFF1 MOVDI,,OFFSETBUFF2 CLD MOVCX,,20 REPMOVSB MOVAH,,4CH INT21H CODEENDS ENDSTART格式二:格式二:DATASEGMENT BUFF1 DB20 DUP((‘R’)) DATAENDS EDATASEGMENT BUFF2DB20 DUP(?)(?) EDATAENDS2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 CODESEGMENT ASSUME CS:CODE, DS:DATA, ES:EDATA MAINPROC FAR;;定义子程序,定义子程序,段间调用段间调用 START:: PUSH DS ;;子程序结束后返回子程序结束后返回DOS XOR AX,,AX PUSH AX MOV AX,,DATA MOV DS,,AX MOV AX,,EDATA MOV ES,,AX MOV SI,,OFFSETBUFF1 MOV DI,,OFFSETBUFF2 CLD MOV CX,,20 REP MOVSB RET MAIN ENDP CODEENDS END START2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础在计算机上运行汇编语言程序步骤概括如下:在计算机上运行汇编语言程序步骤概括如下:用编辑程序建立用编辑程序建立. .ASMASM源文件。
源文件用汇编程序把用汇编程序把. .ASMASM文件转换成文件转换成. .OBJOBJ文件用连接程序把用连接程序把. .OBJOBJ文件转换成文件转换成. .EXEEXE文件用用DEBUGDEBUG调试或在调试或在DOSDOS下执行文件下执行文件1 1.建立.建立. .ASMASM文件文件 编辑一个汇编语言源程序,可以使用各种文本编辑一个汇编语言源程序,可以使用各种文本编辑软件,如:编辑软件,如:EDITEDIT、、CCEDCCED、、WPSWPS、、TURBOCTURBOC、、TURBO TURBO PASCALPASCAL等6.4.4 6.4.4 汇编语言上机过程汇编语言上机过程2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 设存放汇编程序的目录是:设存放汇编程序的目录是:C:\MASMC:\MASM,,文件名为文件名为LIANXILIANXI,,则在则在DOSDOS提示符下键入:提示符下键入: C:\MASM>ED LIANXI.ASM ( C:\MASM>ED LIANXI.ASM (回车回车) )参考程序如下(求内存中两个字单元参考程序如下(求内存中两个字单元AREA1AREA1和和AREA2AREA2内容之和,结果送内容之和,结果送AREA3AREA3)) DATASEGMENT AREA1 DW1234H AREA2DW5678H AREA3DW?? DATAENDS CODESEGMENT ASSUME CS:CODE, DS:DATA建立建立.ASM文件的方法是:文件的方法是:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 START::MOVAX,,DATA MOVDS,,AX MOVAX,,AREA1 ADD AX,,AREA2 MOVAREA3,,AX MOVAH,,4CH INT21H CODE ENDS END START2 2.用汇编程序产生.用汇编程序产生. .OBJOBJ文件文件 用用MASMMASM汇编程序对刚建立的文件汇编程序对刚建立的文件进行汇编进行汇编, ,产生目标文件产生目标文件, ,方法是键入:方法是键入: C:\MASM>MASM LIANXI;(C:\MASM>MASM LIANXI;(回车回车) )也可在文件名后不加也可在文件名后不加“;”,“;”,回车后按提示进行操作。
回车后按提示进行操作2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 若在汇编过程中有错误若在汇编过程中有错误, ,再用再用编辑文件编辑文件进行修改进行修改, ,修改后再重新汇编修改后再重新汇编, ,直至没有错误为止直至没有错误为止. .此汇编过程此汇编过程是查找源文件中的语法错误,汇编后输出文件有三是查找源文件中的语法错误,汇编后输出文件有三个个: :第一个是第一个是OBJOBJ目标文件目标文件, ,第二个是第二个是LSTLST列表文件列表文件, ,该该文件给出源程序和汇编后的机器码文件给出源程序和汇编后的机器码, ,第三个是第三个是CRFCRF索索引文件引文件. .其中后两个文件是可选的其中后两个文件是可选的, ,如不需要可直接如不需要可直接按回车,不输入文件名按回车,不输入文件名3.用连接程序产生.用连接程序产生.EXE文件文件 用用LINK连接程序对刚建立的目标文件进行连接连接程序对刚建立的目标文件进行连接,产产生可执行文件生可执行文件,方法是键入方法是键入 C:\MASM>LINK LIANXI;(回车回车) 也可在文件名后不加也可在文件名后不加“;;”,回车后按提示进行操作。
回车后按提示进行操作2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 连接程序可以将若干个目标模块连同子程序库连接程序可以将若干个目标模块连同子程序库的的库文件库文件LIBLIB连接在一起连接在一起. .连接后给出的无堆栈段的连接后给出的无堆栈段的警告错误(警告错误(no stack segmentno stack segment)), ,并不影响形成可执并不影响形成可执行文件行文件, ,也不影响文件的执行也不影响文件的执行. .连接后输出文件有二连接后输出文件有二个个: :第一个是第一个是EXEEXE可执行文件可执行文件, ,第二个是第二个是MAPMAP连接映象连接映象文件4.程序的执行.程序的执行 当形成可执行文件后,就可以在当形成可执行文件后,就可以在DOS下直接输下直接输入文件名运行程序方法是键入:入文件名运行程序方法是键入: C:\MASM> LIANXI.EXE (回车回车) 程序运行结束返回程序运行结束返回DOS,,如果程序中使用了系统调如果程序中使用了系统调用,就可直接在显示器上把结果显示出来,否则需用,就可直接在显示器上把结果显示出来,否则需要使用要使用DEBUG调试程序。
调试程序2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 在在DOSDOS下下, ,键入键入: : C:\MASM>DEBUG LIANXI.EXE(C:\MASM>DEBUG LIANXI.EXE(回车回车) ) DEBUG DEBUG运行后,在屏幕上出现运行后,在屏幕上出现DEBUGDEBUG的状态提示符的状态提示符短划线:-短划线:-. . DEBUGDEBUG的主要命令有:的主要命令有:((1)检查修改寄存器内容命令)检查修改寄存器内容命令 格式:格式:-r 或或-r <寄存器名寄存器名> 或或-rf 功能:功能:用于显示所有寄存器内容或显示修改指定寄用于显示所有寄存器内容或显示修改指定寄 存器内容,存器内容,rf是显示修改标志寄存器内容其是显示修改标志寄存器内容其 中,标志寄存器状态如下:中,标志寄存器状态如下:5 5..DEBUGDEBUG的运行的运行2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础状态状态标志标志OFDFIFSFZFAFPFCF0NVUPEIPLNZNAPONC1OVDNDINGZRACPECY((2)显示存储单元的命令)显示存储单元的命令 格式:格式:-d[地址地址1 [地址地址2] 功能:功能:显示指定地址开始的显示指定地址开始的80H个字节单元内容或个字节单元内容或 显示指定范围内的内容。
显示指定范围内的内容3 3)修改存储单元内容的命令)修改存储单元内容的命令格式:格式:- -e < e < 地址地址> [> [内容列表内容列表] ]功能:功能:显示指定地址的内容,并可修改某字节修改显示指定地址的内容,并可修改某字节修改完成或不修改按空格键,整体修改完成或不再修改按完成或不修改按空格键,整体修改完成或不再修改按回车键若给出内容列表,则可实现批量修改若给出内容列表,则可实现批量修改2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础格式:格式:- -f
反汇编出汇编指令的机器码4 4)填充命令)填充命令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 格式:格式:- -t/p[=t/p[=地址地址] ]或或- -t[=t[=地址地址][][n]n] 功能:功能:用于从指定地址执行一条或用于从指定地址执行一条或n n条指令,执行后条指令,执行后 显示所有寄存器的内容显示所有寄存器的内容 t t、、p p命令的区别是:命令的区别是:t t命令碰到命令碰到CALLCALL指令时会指令时会 进入子程序,而进入子程序,而p p命令会当作普通命令处理命令会当作普通命令处理8 8)运行命令)运行命令格式:格式:- -g[=g[=地址地址] [] [,地址,地址[ [,地址,地址]]]]功能功能: :从第一个地址处开始连续执行指令从第一个地址处开始连续执行指令, ,后面的地后面的地 址是断点地址址是断点地址. .执行后显示所有寄存器内容执行后显示所有寄存器内容9 9)退出命令格式:)退出命令格式:- -q q 功能:功能:结束结束DEBUGDEBUG,,返回返回DOSDOS。
7 7)跟踪命令)跟踪命令2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础6.5 6.5 汇编语言程序设计汇编语言程序设计 1 1..DOSDOS功能调用方式功能调用方式 一般进行一般进行DOSDOS功能调用要做三方面的工作功能调用要做三方面的工作::6.5.1 6.5.1 DOSDOS系统功能调用系统功能调用 ((1 1)设置入口参数)设置入口参数 DOSDOS功功能能调调用用一一般般都都是是通通过过DL/DXDL/DX寄寄存存器器传传送送入入口参数,也有一些功能调用不需要设置入口参数口参数,也有一些功能调用不需要设置入口参数2 2)设置功能号)设置功能号 将所需要调用的子程序的功能号送入将所需要调用的子程序的功能号送入AHAH寄存器3 3)执行软中断指令)执行软中断指令INT 21HINT 21H 该指令将程序控制自动转向相应子程序的入口,该指令将程序控制自动转向相应子程序的入口,并执行功能并执行功能2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础((1 1)带显示的键盘输入()带显示的键盘输入(1 1号调用)号调用) 入口参数:入口参数:无无 调用方式:调用方式:MOVMOV AH AH,,01H01H INT INT 21H 21H 出口参数:出口参数:ALAL中为输入字符中为输入字符ASCIIASCII码。
码 功能:功能:等待从键盘输入一个字符,并将输入字符的等待从键盘输入一个字符,并将输入字符的 ASCII ASCII码送入码送入ALAL寄存器,且在屏幕上显示输入寄存器,且在屏幕上显示输入 的字符若输入字符为的字符若输入字符为CTRL+BREAKCTRL+BREAK组合键组合键 时,则中断程序执行,返回时,则中断程序执行,返回DOSDOSDOSDOS功能调用功能调用2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础入口参数:入口参数:DLDL的内容,为要显示字符的的内容,为要显示字符的ASCIIASCII码调用方式:调用方式:MOVMOVDLDL,,要显示字符的要显示字符的ASCIIASCII码码 MOV MOVAHAH,,02H02H INT INT21H21H功能:功能:将将DLDL寄存器中的字符送显示器输出寄存器中的字符送显示器输出3 3)不带显示的键盘输入()不带显示的键盘输入(7 7、、8 8号调用)号调用) 操作:操作:同同1 1号调用号调用 功能:功能:与与1 1号调用不同的是,号调用不同的是,键入的字符不在屏幕键入的字符不在屏幕 上显示。
上显示且且7 7号调用对键入的字符不做号调用对键入的字符不做 CTRL+BREAK CTRL+BREAK检查2 2)显示字符()显示字符(2 2号调用)号调用)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础入口参数:入口参数:DXDX的内容,为要显示字符串的首地址的内容,为要显示字符串的首地址调用方式:调用方式:LEA DXLEA DX,,要显示字符串的首地址要显示字符串的首地址 MOV MOVAHAH,,09H09H INT INT21H21H功功能能::显显示示以以‘$’‘$’为为结结束束标标志志的的字字符符串串,,且且字字符符串串应应 在在数据段数据段中5 5)字符串输入()字符串输入(1010号调用)号调用)入口参数:入口参数:DXDX寄存器的内容,为要显示字符串的首寄存器的内容,为要显示字符串的首 地址4 4)字符串显示()字符串显示(9 9号调用)号调用)2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础调用方式:调用方式:LEA DXLEA DX,,接收字符的输入缓冲区首地址接收字符的输入缓冲区首地址 MOV AHMOV AH,,0AH0AH INT INT21H21H功能:功能:从键盘输入字符串到指定缓冲区,直到输入回从键盘输入字符串到指定缓冲区,直到输入回 车符为止。
车符为止说明说明: : 缓冲区的第一个字节存放缓冲区缓冲区的第一个字节存放缓冲区能接收的字符的能接收的字符的个个 数,数,其值的范围为其值的范围为1~255,不能为,不能为0.0. 缓冲区的第二个字节存放缓冲区的第二个字节存放实际输入的字符数实际输入的字符数( (不含不含 回车键回车键),),该值由该值由DOSDOS返回时自动填入返回时自动填入. .2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.626.62】】从键盘输入一个字符,并在显示器上输从键盘输入一个字符,并在显示器上输 出,按下出,按下CTRL+BREAKCTRL+BREAK组合键时结束,可组合键时结束,可 使用下面两种方法使用下面两种方法 方法一:方法一:使用使用1 1号功能调用号功能调用 MOVAH,,01H ;带显示的键盘输入带显示的键盘输入 INT21H 从缓冲区的第三个字节开始存放输入的字符从缓冲区的第三个字节开始存放输入的字符, ,若实若实际输入的字符多于定义的字节数际输入的字符多于定义的字节数, ,则多余字符被略去则多余字符被略去, ,且响铃报警且响铃报警. . 缓冲区一定要定义在当前数据段中缓冲区一定要定义在当前数据段中. .2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.636.63】】使用使用9 9号和号和1010号功能调用实现人机对话。
号功能调用实现人机对话 DATA SEGMENT DAT1 DB‘5++3=’,,‘$’ DAT2 DB‘6--2=’,,‘$’ BUF1 DB5 ;;定义缓冲区定义缓冲区1 DB?? DB5 DUP(?)(?) 使用使用8 8号和号和2 2号功能调用号功能调用 MOVAH,,08H ;不不带显示的键盘输入带显示的键盘输入 INT21H MOVDL,,AL MOVAH,,2 ;显示字符显示字符 INT21H方法二:方法二:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 BUF2 DB5;;定义缓冲区定义缓冲区2 DB ?? DB 5 DUP(?)(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,,DATA MOV DS,,AX MOV DX,,OFFSET DAT1;显示显示DAT1DAT1信息信息 MOV AH,,09H ;;字符串显示字符串显示 INT 21H MOV DX,OFFSET BUF1;键盘输入回答键盘输入回答DAT1信息信息 MOV AH,,0AH ;;字符串输入字符串输入 INT 21H 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV DL,,0AH;;输出换行符输出换行符 MOV AH,,2 ;;显示字符显示字符 INT 21H MOV DX,OFFSET DAT2;显示显示DAT2DAT2信息信息 MOV AH,,09H ;;字符串显示字符串显示 INT 21H MOV DX,OFFSET BUF2;键盘输入回答键盘输入回答DAT2信息信息 MOV AH,,0AH ;;字符串输入字符串输入 INT 21H MOV AH,,4CH ;;回回DOS INT 21H CODE ENDS END START2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 用汇编语言编写的程序称为汇编语言源程序,用汇编语言编写的程序称为汇编语言源程序,其主要有其主要有顺序结构程序、分支结构程序、循环结构顺序结构程序、分支结构程序、循环结构程序和子程序。
程序和子程序 1 1.顺序结构程序.顺序结构程序 按指令书写的先后顺序执行的程序称为按指令书写的先后顺序执行的程序称为顺序结构顺序结构程序程序, ,在程序中没有转移在程序中没有转移, ,调用等指令调用等指令例【例6.646.64】】求两个字节数之差求两个字节数之差, ,并将结果显示出来并将结果显示出来. .分析分析: :本程序实现两个字节数相减,并将减后的结果本程序实现两个字节数相减,并将减后的结果 显示在显示器上,只需要顺序执行下列指令序显示在显示器上,只需要顺序执行下列指令序 列即可列即可. . 6.5.2 6.5.2 程序设计结构及举例程序设计结构及举例2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 DATA SEGMENT ADR1 DB68H ADR2 DB32H DATA ENDS STACK SEGMENT DB100 DUP(?)(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA; SS:STACK START::MOV AX,,DATA MOV DS,,AX MOV AX,,STACK MOV SS,,AX MOV AL,,ADR1 SUB AL,,ADR2 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV AH,,0 PUSH AX;将结果入栈保存,注意栈指令对字操作将结果入栈保存,注意栈指令对字操作 MOV CL,,4 ROL AL,,CL AND AL,,0FH;;屏蔽高屏蔽高4位位 ADD AL,,30H;;计算计算ASCII码码 MOV DL,,AL;;输出高位输出高位 MOV AH,,2 INT 21H POP AX AND AL,,0FH ADD AL,,30H MOV DL,,AL;;输出低位输出低位 MOV AH,,2 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 INT 21H MOV AH,4CH INT 21H CODE ENDS END START2 2.分支结构程序.分支结构程序 分支结构是根据某一判断的不同结果执行不同分支结构是根据某一判断的不同结果执行不同的程序段的程序设计方法。
典型的分支结构流程的程序段的程序设计方法典型的分支结构流程如如图图6-5-16-5-1所示2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础】设内存中自】设内存中自BUFFERBUFFER单元存有单元存有1010个字节个字节 数,要求查找是否有数,要求查找是否有5050H H这个数,若有显这个数,若有显 示示FOUNDFOUND,,如果没有则显示如果没有则显示NOT FOUNDNOT FOUND,, 并返回并返回DOSDOS状态 程序段程序段条件条件不满足不满足满足满足分支结构分支结构A A程序段程序段2 2条件条件程序段程序段1 1分支结构分支结构B B图图6-5-6-5-1 1 分支结构分支结构2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 本程序是典型的分支程序,用重复串扫描指令本程序是典型的分支程序,用重复串扫描指令 REPNZ SCASBREPNZ SCASB查找查找5050H H这个数,执行操作为当这个数,执行操作为当ALAL --[DI][DI]结果不为结果不为0 0且且CXCX值不为值不为0 0时重复查找。
时重复查找 若若ALAL--[DI][DI]结果为结果为0 0,则说明源串中有,则说明源串中有5050H H这个这个 数,则转到标号数,则转到标号FOUNDFOUND去执行,在显示器上显去执行,在显示器上显 示字符串示字符串FOUNDFOUND;;若循环次数已经为若循环次数已经为0 0时,结果时,结果 仍不为仍不为0 0,则表示源串中没有要找的,则表示源串中没有要找的5050H H这个这个 数,则顺序执行程序,在显示器上显示字符串数,则顺序执行程序,在显示器上显示字符串 NOT FOUNDNOT FOUND分析:分析:2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础DATA SEGMENT FSUB DB ‘FOUND’,,‘$’ NSUB DB ‘NOT FOUND’,,‘$’ DATA ENDSEDATA SEGMENTEDATA SEGMENTBUFFER DB 12H, 34H, 56H, 78H, 90H, 0H, 77H, 88H, 99HEDATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:EDATASTART:: MOV AX,,DATA MOV DS,,AX MOV AX,,EDATA MOV ES,,AX MOV DI,,OFFSET BUFFER MOV CX,,10 MOV AL,,50H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 REPNZ SCASB;结果不为结果不为0(0(没找到没找到) )则重复搜索则重复搜索 JZ FOUND;;找到找到50H,,转到标号转到标号FOUND MOV AX,,DATA MOV DS,,AX MOV DX,OFFSET NSUB;没找到显示没找到显示NOT FOUNDNOT FOUND MOV AH,,09H INT 21H JMP EXITFOUND:: MOV AX,DATA;找到显示找到显示FOUND MOV DS,,AX MOV DX,,OFFSET FSUB MOV AH,,09H INT 21H EXIT::MOV AH,,4CH INT 21H CODE ENDS END START2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 循环结构是按给定的条件重复执行一系列指令,循环结构是按给定的条件重复执行一系列指令,直到循环条件不满足为止。
循环程序结构有两种,直到循环条件不满足为止循环程序结构有两种,一种是先判断后工作(一种是先判断后工作(whilewhile循环),另一种是先工循环),另一种是先工作后判断(作后判断(untiluntil循环),循环),如图如图6-5-26-5-2所示先判断后工作方式先判断后工作方式循环体循环体循环初值设置循环初值设置循环条件循环条件不满足不满足满足满足先工作后判断方式先工作后判断方式循环体循环体循环初值设置循环初值设置循环条件循环条件不满足不满足满足满足图图6-5-26-5-2循环结构循环结构3 3.循环结构程序.循环结构程序2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.66】】数组数组A包含包含30个互不相等的整数,个互不相等的整数, 数组数组B包含包含40个互不相等的整数,个互不相等的整数, 将既在数组将既在数组A中又在数组中又在数组B中出现中出现 的整数存放在数组的整数存放在数组C中分析:分析:本程序是典型的循环程序,且为本程序是典型的循环程序,且为二重循环二重循环. .设设 外层循环次数为外层循环次数为3030,内层循环次数为,内层循环次数为4040,首,首 先让数组先让数组A A中第一个数和数组中第一个数和数组B B中的所有数相中的所有数相’’ 比较比较, ,若相等则存入数组若相等则存入数组C C中,若不相等则让中,若不相等则让 数组数组A A中下一个数和数组中下一个数和数组B B中的所有数相比中的所有数相比 较,依此类推直到都比较完为止。
较,依此类推直到都比较完为止 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 DATASEGMENT ADW30 DUP(?)(?) BDW40 DUP(?)(?) CDW30 DUP(?)(?) DATAEND CODE SEGMENT ASSUME CS:CODE, DS:DATA MAIN PROC FAR START::PUSH DS XOR AX,,AX PUSH AX MOV AX,,DATA MOV DS,,AX MOV SI,,0 MOV BX,,0 MOV CX,,30;;外层循环次数外层循环次数 NEXT1::PUSH CX;;保存外层循环次数保存外层循环次数 MOV DI,,02024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOVCX,,40;;内层循环次数内层循环次数 MOVAX,,A[SI] NEXT2::CMPB[DI],,AX;;比较两数组中的数比较两数组中的数 JNE L1;不相等不相等, ,转转L1L1取数组取数组B B中下一个数中下一个数 MOV C[BX],AX;相等则存入数组相等则存入数组C C中中 ADDBX,,2 JMP L2 L1::ADDDI,,2;;取数组取数组B B中下一个数中下一个数 LOOPNEXT2 L2::ADDSI,,2;;取数组取数组A A中下一个数中下一个数 POPCX;;恢复外层循环次数恢复外层循环次数 LOOPNEXT1 RET MAIN ENDP CODE ENDS END START2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 子程序的调用和返回可用指令子程序的调用和返回可用指令CALLCALL和和RETRET实现实现, ,CALLCALL指令在主程序中指令在主程序中, ,而而RETRET指令则在被调用子程序指令则在被调用子程序的末尾的末尾. . 另外由于子程序执行时要用到某些寄存器另外由于子程序执行时要用到某些寄存器, ,而主而主程序也可能正在使用这些寄存器,所以程序也可能正在使用这些寄存器,所以要考虑现场要考虑现场信息的保护,信息的保护,例如:主程序中正在使用例如:主程序中正在使用AXAX、、BXBX、、CXCX寄存器,子程序需要使用寄存器,子程序需要使用BXBX、、CXCX寄存器,这时就要寄存器,这时就要将将BXBX、、CXCX的内容压入堆栈,待子程序返回后,再从的内容压入堆栈,待子程序返回后,再从堆栈中恢复堆栈中恢复BXBX、、CXCX的内容。
的内容4 4..子程序结构子程序结构2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础方法一:方法一:在主程序中信息保护的格式为:在主程序中信息保护的格式为: PUSHBX PUSHCX CALLSUB1 POPCX POPBX方法二:方法二:在子程序中信息保护的格式为:在子程序中信息保护的格式为: SUB1 PROC NEAR PUSHBX PUSHCX …… ;;子程序功能段子程序功能段 POP CX POP BX RET SUB1 ENDP2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础【例【例6.676.67】】实现将实现将1010个个8 8位的无符号数按递减次序位的无符号数按递减次序 排序,并将结果显示出来。
排序,并将结果显示出来分析:分析:本程序是采用本程序是采用冒泡算法冒泡算法,共有,共有两个循环体两个循环体 内循环进行两两相邻比较,如果符合递减次内循环进行两两相邻比较,如果符合递减次 序则不交换,否则就相互交换外循环设置序则不交换,否则就相互交换外循环设置 一个一个交换标志位(交换标志位(BLBL),),每次进入外循环就每次进入外循环就 设置为设置为0 0,而内循环每作一次交换就将该标志,而内循环每作一次交换就将该标志 设置为设置为1 1,在每次内循环结束后就测试交换标,在每次内循环结束后就测试交换标 志,如果该位为志,如果该位为1 1,则再一次进入外循环;如,则再一次进入外循环;如 果该位不为果该位不为1 1,则说明上一轮比较已经不再引,则说明上一轮比较已经不再引 起交换操作,数组已经排序完毕,这样就立起交换操作,数组已经排序完毕,这样就立 即结束外循环当实现排序后将排好的结果即结束外循环。
当实现排序后将排好的结果 调用显示子程序将结果显示在显示器上调用显示子程序将结果显示在显示器上2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 DATA SEGMENT ARRAY DB 05H,78H,0F8H,7BH,00H,8CH,20H, 0A0H,80H60H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA MAIN PROC FAR START:: PUSH DS XOR AX,,AX PUSH AX MOV AX,,DATA MOV DS,,AX AB1::MOV SI,,OFFSET ARRAY MOV BL,,0;;交换标志交换标志BLBL置置0 0 MOV CX,,92024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 AGAIN: MOV AL,,[SI] INC SI CMP AL,,[SI];;两两相比较两两相比较 JNC CD1;;若前一个数大于等于后一个数则转到若前一个数大于等于后一个数则转到CD1CD1去执行去执行 MOV AH,,[SI];;若前一个数小于后一个数则顺序执行程序若前一个数小于后一个数则顺序执行程序 来实现交换来实现交换 MOV [SI],,AL DEC SI MOV [SI],,AH INC SI MOV BL,,1 CD1::LOOP AGAIN DEC BL JZ AB1;;BL值减值减1 1后为后为0 0说明排序没完成,再一次进入外说明排序没完成,再一次进入外 循环循环2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 MOV SI,,OFFSET ARRAY;;BL值减值减1 1后不为后不为0 0则排序已完成则排序已完成 需显示需显示 MOV DI,,10LP11:: MOV BL,,[SI] CALL DISPL;;调用显示子程序调用显示子程序 INC SI DEC DI JNZ LP11 RETMAIN ENDPDISPL PROC NEAR;;显示子程序显示子程序 MOV DH,2;显示两位十六进制数显示两位十六进制数LOP2:: MOV CL,,4 ROR BL,,CL MOV DL,,BL AND DL,,0FH ADD DL,,30H2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 CMP DL,,3AH;判断是否为判断是否为A-FA-F之间的数之间的数 JB DIP;;0~9之间的数直接显示之间的数直接显示 ADD DL,,7;;A~F之间的数之间的数ASCIIASCII值加值加7 DIP:: MOV AH,,2;;显示字符显示字符 INT 21H DEC DH JNZ LOP2;;显示空格符显示空格符 MOV DL,,20H MOV AH,,2 INT 21H RETDISPL ENDPCODE ENDS END START2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具 DEBUG程序使用在DOS提示符下键入命令:C>DEBUG 这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序 返回2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础1 选择题选择题1.十进制数运算调整指令AAS可以紧跟在()之后: B.DEC 2. 在多字节加减运算时,特别要注意标志( )对运算的影响: A. AF B.CF C. SF 3.设VAR是数据段中定义的字节变量,指令MUL VAR乘积存放在() A. AX B.BX C. CX 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础4.执行下面指令序列后,结果是() MOV AL,82H CBW A.AX=0FF82H B.AX=8082H C.AX=0082H D.AX=0F82H 5.在串指令REP MOVSB中,重复次数一定放在()寄存器中。
6.下面指令中,合理而有意义的指令是() A.REP LODSB B.REP SCASB C.REP CMPSB D.REP MOVSB2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础7.串操作指令中,目标串操作数的段地址一定在()寄存器中 B.SS 8.在程序状态字寄存器中,当方向标志DF位为0时,每次操作后使变址寄存器SI和DI() A.减量 B.增量 C.保持不变 D.地址减1 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础2 判断题判断题DS2.串操作指令一般用CX存放长度AAA必须紧跟在加法指令之后使用 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 现有下列数据段: DATA SEGMENT S1 DB ‘ABCDEFGHIJKL’ COUNT EQU $-S1 BUF DB COUNT DUP(0) DATA ENDS 下面程序段是实现把S1中所有字符逆向传送到BUF缓冲区(即S1中第一个字符送到BUF的最后一个单元,S1中最后一个字符送到BUF的第一个单元)。
试把程序中所空缺的2条指令填上 MOV SI,OFFSET BUF-1 MOV DI,OFFSET BUF MOV CX,COUNT (1)________________ L1: MOVSB (2)________________ LOOP L1 参考答案: (1)CLD (2)SUB SI,2 或 (1)STD (2)ADD DI,2 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 1.定义一个数据区,它包含有23H,24H,25H和26H四个字符数据,把这个数据区复制20次,并显示出复制结果要求用字符串指令)参考答案: DATA SEGMENT PATTERN DB 23H,24H,25H,26H DISPLAY DB 80 DUP(‘ ’),‘$’ DATE ENDS 2024/9/22第第6 6章章 8086 8086指令系统与汇编基础指令系统与汇编基础 CODE SEGMENT ┇ CLD LEA SI,PATTERN LEA DI,DISPLAY MOV CX,80 REP MOVSB MOV AH,09H LEA DX,DISPLAY INT 21H RET CODE ENDS 2024/9/22。
