1、第 六 讲,8086/8088的指令系统,指令系统概述,按照汇编指令格式划分,指令有三种: 双操作数指令:指令中指定两个操作数,其中一个是源操作数(SRC),另一个是目的操作数(DEST)。 单操作数指令:指令只需一个操作数。它既是源操作数( SRC ),也是目的操作数( DEST )。 无操作数指令:虽然指令本身未指明操作数在哪里,但是指令却隐含指明操作数的地方。,指令系统概述,学习每一条指令应该注意以下几点: 指令的格式和执行的操作 允许的寻址方式 与标志位的关系,指令系统概述,按照汇编指令功能划分,8086的指令可以分成六大类: 数据传送指令 算术运算指令 位运算指令 串操作指令 控制转
2、移指令 处理器控制指令,数据传送指令,指令类型,指 令,指令功能,通用数据传送,目标地址传送,标志位传送,I/O数据传送,MOV d, s PUSH s POP d XCHG d, s XLAT,字节或字传送 字压入堆栈 字弹出堆栈 字节或字交换 字节翻译(代码转换),LEA d, s LDS d, s LES d, s,装入有效地址 装入地址指针(用DS) 装入地址指针(用ES),LAHF SAHF PUSHF POPF,将F低字节装入AH寄存器 将AH内容装入F低字节 将F的内容压入堆栈 从堆栈中弹出一个字装入F,IN 累加器,端口 OUT 端口,累加器,输入字节或字 输出字节或字,表一
3、数据传送指令列表,通用数据传送指令,有以下五条 MOV 把源操作数传送到目的操作数 PUSH 指针上移,源操作数进栈 POP 出栈到目的操作数,指针下移 XCHG 交换源,目的操作数 XLAT 代码转换,通用数据传送指令,MOV 指令 基本格式和功能指令格式:MOV dest,src其中 dest 表示目的操作数,src表示源操作数 执行的操作: (dest)(src) 与标志的关系: 与标志没有关系,不影响标志位。,通用数据传送指令,MOV 指令 数据传送通道,图1 MOV 指令数据传送通道,通用数据传送指令,MOV 指令 一些说明 说明: 立即数不能直接传给段寄存器;段寄存器之间也不能进行
4、直接传送。(这2种情况通常要通过通用寄存器间接进行) DEST和SRC两个操作数不能同时为存储器操作数;两个存储单元之间不能用一条MOV指令直接完成数据传送。存储器操作数可用任何一种存储器寻址方式。 DEST和SRC长度须相同,即同时为字或字节。,通用数据传送指令,MOV 指令 一些说明 说明 立即数只能出现在源操作数位置,不能作DEST CS只能作源操作数,不能作目的操作数。 传送实质上是复制,对源操作数无影响。 16位数据的传送遵循地址“高对高,低对低”的原则。这个原则不仅对MOV指令适用,对所有的传送皆适用。,通用数据传送指令,MOV 指令 例子立即数r/mMOV CL, 05HMOV
5、AX, 1234HMOV ADDR, 12HMOV ADDR, 1234H,通用数据传送指令,MOV 指令 例子reg regMOV DH, ALMOV DS, AXr mMOV DL, DA_BYTE MOV DL, SIMOV AX, DA_WORD,通用数据传送指令,MOV 指令 例子 m mMOV DL, DA_BYTE1MOV DA_BYTE2, DLm m(存储单元内容互换)MOV CL,DA_BYTE1MOV DL,DA_BYTE2MOV DA_BYTE1,DLMOV DA_BYTE2,CL,通用数据传送指令,MOV 指令 例子指令辩误:判断下列指令的正误并说明原因 MOV AL
6、,CX MOV AL, CX MOV 3000H, BX MOV AL, 1200H MOV CS, BX MOV DS, 1200H MOV ES, DS,通用数据传送指令,MOV 指令 练习题目1:已知当前BX=1200H,CS=1800H,IP=0500H,DS=3000H,则执行指令MOV BX+2000H,12ABH 后,12ABH放在哪两个存储单元(物理地址)?,答案:12ABH放在33200H和33201H存储单元中。其中12H放在33201H单元中,而0ABH放在33200单元中。,通用数据传送指令,MOV 指令 练习题目2:将DS段中2000H单元与3000H单元的内容互换,
7、请写出指令序列。 解:,MOV AL,2000H MOV BL, 3000H MOV 2000H, BL MOV 3000H, AL,通用数据传送指令,PUSH 和 POP指令 基本格式和功能指令格式: PUSH SRC POP DEST执行的操作:PUSH 压入。源操作数进栈至栈顶。“先减再压” SP SP -2 SS:(SP),(SP)+1) (SRC)POP 弹出。栈顶出栈到目的操作数。“先弹再加” (DEST) SS:(SP),(SP)+1) SP SP +2,通用数据传送指令,PUSH 和 POP指令 基本格式和功能与标志的关系: 与各标志位无关,不影响标志位 寻址方式: PUSH
8、mem / reg POP mem / reg注意: 操作数一律为16位操作数。允许使用段寄存器,但POP操作数不允许为CS。可以使用除立即数以外的任何数据寻址方式。,通用数据传送指令,PUSH 和 POP指令 关于堆栈 堆栈是一段特殊组织的内存区域,其内容的存取主要由堆栈指针控制,规则是:“先进后出”或者“后进先出”。,XX,32H,30012H,30013H,30011H,30010H,3000FH,3000EH,30000H,3000H,SS,000FH,SP,6CH,45H,0AH,0013H,SP,堆栈段,通用数据传送指令,PUSH 和 POP指令 关于堆栈 例:将4456H压入堆栈
9、。,XX,30012H,30013H,30011H,30010H,3000FH,3000EH,30000H,3000H,SS,56H,堆栈段,44H,“先减再压”,通用数据传送指令,PUSH 和 POP指令 关于堆栈 例:从堆栈弹出两个字节送AX。,XX,30012H,30013H,30011H,30010H,3000FH,3000EH,30000H,3000H,SS,56H,堆栈段,78H,12H,34H,34H,AX,12H,AH,AL,“先弹再加”,通用数据传送指令,PUSH 和 POP指令 用途 堆栈常有两个用途:暂存和传送。 暂存:PUSH AXPUSH BXPOP BXPOP AX
10、 传送: PUSH AXPUSH BXPOP AXPOP BX,XX,5A06H,AX,1200H,BX,sp,通用数据传送指令,PUSH 和 POP指令 练习题目:已知SS=2000H,AX=1600H,SP=0202H,CX=3456H,当执行以下两条指令后:PUSH AXPUSH CX 问:这时SS,AX,CX,SP的内容?存储器中20200H单元的内容为多少?,答案:SS=2000H,AX=1600H,CX=3456H ,SP=01FEH;(20200H)=00H,01FEH,01FFH,0200H,0201H,0202H,XX,通用数据传送指令,XCHG指令 基本格式和功能指令格式:
11、 XCHG DEST, SRC 执行的操作:源操作数与目的操作数内容互换 (DEST) (SRC) 与标志的关系: 与各标志位互不影响,通用数据传送指令,XCHG指令 基本格式和功能寻址方式:XCHG mem/reg, mem/reg注意:两操作数均不允许为立即数和段寄存器,不能同为存储器操作数;可以是字或字节交换。,图3 XCHG指令的数据交换通路,通用数据传送指令,XCHG指令 例子例:两个存储单元之间进行数据交换。(应用三条指令实现),MOV AL,DABYTE1 XCHG AL,DABYTE2 XCHG AL,DABYTE1,通用数据传送指令,XLAT指令 基本格式和功能指令格式:XL
12、AT 或 XLAT AL, BX执行的操作:其功能是从转换表中找出一个字节的内容,用其取代AL寄存器的内容。转换表由用户设计,最长为256个字节,换码时,应将代码表首地址保存在BX中, AL中保存待查字节序号(即代码表中字符序号),换码后,A L取得对应的码值。,通用数据传送指令,XLAT指令 例子 例:假设用户设计转换表TABLE如下图所示,如需要查找表中第8个单元的内容,则可以使用指令序列:,MOV AX,SEG TABLE MOV DS,AX MOV BX,OFFSET TABLE MOV AL,07H XLAT,TABLE,+1,+2,+3,+4,+5,+6,+7,+8,7EH,30H
13、,6DH,79H,33H,5BH,1FH,70H,7FH,执行后AL=70H,通用数据传送指令,课堂练习1、请将存储器中DS段内三个存储单元的内容轮换。(设3个存储单元的偏移地址分别是1020H,1040H,1060H)2、将CX与DX的内容互换,可以有多少种方法?,通用数据传送指令,参考答案1、 MOV AL, 1020H XCHG AL, 1040H XCHG AL,1060H MOV 1020H, AL2、至少有三种: 用MOV指令: 用堆栈指令: 用XCHG指令:,MOV AX, CX MOV CX, DX MOV DX, AX,PUSH CX PUSH DX POP CX POP D
14、X,XCHG CX, DX,目标地址传送指令,共3条 LEA 取有效地址 LDS 从双字中取偏移地址和数据段的段地址 LES 从双字中取偏移地址和附加段的段地址,目标地址传送指令,LEA指令 基本格式和功能 指令格式:LEA DEST, SRC 执行的操作: 指令功能:源操作数的有效地址EA送给目的操作数。DESTSRC的有效地址EA 与标志的关系: 指令对标志无影响。,目标地址传送指令,LEA指令 基本格式和功能 寻址方式:LEA reg, mem 说明: SRC必须是存储器操作数。 DEST一定是一个16位通用寄存器,而不能是8位的寄存器或段寄存器。 编程时,程序员不必了解数据或指令的有效
15、地址,但有时这些地址会在程序其它部分用到, 这时可以使用LEA 指令。,目标地址传送指令,LEA指令 例子例:如BX=00CDH,SI=00A6H,存储单元的内容为78ABH,则指令MOV AX,BXSI 执行后,AX78ABH;而LEA AX,BXSI 执行后,AX00CDH00A6H=0173H。,目标地址传送指令,LDS和LES指令 基本格式和功能 指令格式:LDS DEST, SRCLES DEST, SRC 执行的操作: 功能:将SRC中的双字内容依次送入到DEST及DS(LDS指令)或ES(LES指令)中。 指令中SRC为一双字指针,高位字送指定的段寄存器,低位字送指定的寄存器。,
16、目标地址传送指令,LDS和LES指令 基本格式和功能 与标志的关系: 指令对标志无影响。 寻址方式:LDS/ LES reg, mem 说明: SRC处保存的一般是某个逻辑地址(SEG:OFFSET),事先由用户准备好。 DEST必须是任一通用寄存器(16位);SRC一定是存储器操作数。 本指令用于同时建立段地址和段内偏移地址。,目标地址传送指令,LDS和LES指令 例子例:设当前DS2000H,DI2400H,存储单元2340AH处的内容如下图所示。则指令LDS SI,DI100AH 执行后,DS与SI的值分别为多少?,80H,01H,30H,22H,2340AH,答案:DS2230H, S
17、I0180H,标志位传送指令,共有4条: LAHF 标志送AH指令 SAHF AH送标志指令 PUSHF 标志进栈指令 POPF 标志出栈指令这些指令用于保存和恢复PSW,标志位传送指令,LAHF 与 SAHF指令 基本格式和功能指令格式:LAHFSAHF 功能: LAHF:AH FlagsL SAHF:FlagsL AH,标志位传送指令,LAHF 与 SAHF指令 基本格式和功能说明: LAHF指令对F本身无影响; SAHF指令对F高8位无影响,对F低8位的影响要看AH的内容。 复习:F标志寄存器各位位置,OF,DF,IF,TF,SF,ZF,AF,PF,CF,15,0,8,7,标志位传送指令
18、,LAHF 与 SAHF指令 例子例:欲将F中的进位标志和奇偶标志都设置为1,请写出指令序列。,答案: MOV AH,05HSAHF,标志位传送指令,PUSHF 与 POPF指令 基本格式和功能指令格式:PUSHFPOPF 功能: PUSHF:stack Flags (F进栈) POPF :Flags stack (F出栈),标志位传送指令,PUSHF 与 POPF指令 基本格式和功能说明: PUSHF指令对F本身无影响。 POPF指令对F的影响由栈顶内容决定。 Flags中各标志位的值只有少数几个能通过别的指令去设置,其余的只能通过上述4条指令去设置。,标志位传送指令,PUSHF 与 POP
19、F指令 例子例1:欲将F的内容传送到AX中。请写出指令序列。,答案:PUSHFPOP AX,标志位传送指令,PUSHF 与 POPF指令 例子例2:欲设置F寄存器的内容为1234H。请写出指令序列。,答案:PUSH 1234HPOPF,正确答案:MOV AX,1234HPUSH AXPOPF,指令有误,I/O数据传送指令,IN 和 OUT指令 基本格式和功能指令格式: 长格式(直接寻址):IN AL,端口地址IN AX, 端口地址OUT 端口地址,ALOUT 端口地址,AX 注意: 长格式中直接采用端口地址,但地址必须是8位的,也就是00FFH号端口才可以使用长格式。,I/O数据传送指令,IN
20、 和 OUT指令 例子合法的I/O指令:IN AL,70HIN AX,70HOUT 71H,ALOUT 71H,AX,I/O数据传送指令,IN 和 OUT指令 基本格式和功能短格式(间接寻址)IN AL, DXIN AX, DXOUT DX, ALOUT DX, AX 短格式中的端口地址保存在DX中,由于DX是十六位寄存器,所以这种寻址方式可对0 65535个端口进行寻址。,I/O数据传送指令,IN 和 OUT指令 基本格式和功能 执行的操作: 16位端口 IN : (AX) (port) OUT : (port) (AX) 8位端口 IN : (AL) (port) OUT : (port)
21、 (AL),I/O数据传送指令,IN 和 OUT指令 说明 要注意区分I/O端口的数据与地址的宽度(位数)。所谓16位端口指的是数据宽度是16位的端口,8位端口指其数据宽度是8位,它们的地址可以是8位或16位的。 因此I/O指令可能有如下几种情况:(以IN指令为例) 8位数据8位地址: IN AL, 61H 8位数据16位地址: IN AL, DX 16位数据8位地址: IN AX, 61H 16位数据16位地址: IN AX, DX,I/O数据传送指令,IN 和 OUT指令 例子例:编写指令:将2024H端口中一个字的内容存入堆栈。,答案:MOV DX, 2024HIN AX, DXPUSH AX,