资源描述
第第3章章寻址方式和指令系统寻址方式和指令系统3.3 8086/8088指令系统指令系统8086/8088的指令系统可分为以下的指令系统可分为以下6类类(功能组功能组)3.3.1 数据传送类指令数据传送类指令(Data transfer)3.3.2 算术运算类指令算术运算类指令(Arithmetic)3.3.3 逻辑运算与位移逻辑运算与位移(Logic&Shift)3.3.4 串操作指令串操作指令(String manipulation)3.3.5 控制转移指令控制转移指令(Control Transfer)3.3.6 处理器的控制类指令处理器的控制类指令(Processor Control)3.3.1 数据传送类指令数据传送类指令数据传送是计算机中最基本、最重要的一种操作数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位除标志寄存器传送指令外,均不影响标志位重点掌握重点掌握MOV XCHG XLAT PUSH POP LEA1.通用数据传送指令通用数据传送指令提供方便灵活的通用传送操作提供方便灵活的通用传送操作有有5条指令条指令MOVXCHGXLAT PUSHPOPMOV dest,src ;(dest)(src)目的目的源源目的目的 源源 把一个字节把一个字节(B)或一个字(或一个字(W)操作数由源传送至目的。)操作数由源传送至目的。实现实现:寄存器寄存器 寄存器寄存器/存储器之间;存储器之间;立即数立即数寄存器寄存器/存储器存储器 寄存器寄存器/存储器存储器段寄存器之间的数据传送。段寄存器之间的数据传送。1)传送指令传送指令 MOV通用寄存器AX/BX/CX/DXBP/SP/SI/DI段寄存器DS/ES/SS/CS存 储 器立即数图图3.7数据传送通道示意图数据传送通道示意图 具体说,通用数据传送指令能实现:具体说,通用数据传送指令能实现:CPU内部寄存器之间的数据的任意传送内部寄存器之间的数据的任意传送(除了代码段寄存器(除了代码段寄存器CS和指令指针和指令指针IP以外)。以外)。例:例:MOV DL,CH;8位寄存器位寄存器 8位寄存器位寄存器 MOV AX,DX;16位寄存器位寄存器 16位寄存器位寄存器 MOV SI,BP MOV DS,BX;通用寄存器;通用寄存器 段段寄存器寄存器 MOV AX,CS ;段段寄存器寄存器 通用寄存器通用寄存器 立即数传送至立即数传送至CPU内部通用寄存器组内部通用寄存器组 (AX、BX、CX、DX、BP、SP、SI、DI)。)。用于给寄存器赋初值。用于给寄存器赋初值。例:例:MOV CL,04H;立即数;立即数8位位寄存器寄存器 MOV AX,03FFH;立即数;立即数16位位寄存器寄存器 MOV WORD PTR SI,057BH;立即数;立即数存储器存储器MOV BYTE PTR MEM,5 ;立即数;立即数存储器存储器明确指令是字节操作还是字操作明确指令是字节操作还是字操作 CPU内部寄存器(除内部寄存器(除CS和和IP外)外)与存储器(所有寻址方式)之间数据传送。与存储器(所有寻址方式)之间数据传送。可以实现一字节或一个字的传送。可以实现一字节或一个字的传送。例:例:MOV MEM,AX;累加器累加器存储器存储器,直接寻址直接寻址MOV MEM,DS;段寄存器;段寄存器存储器,存储器,直接寻址直接寻址MOV DISPBX,CX;寄存器;寄存器存储器,存储器,变址寻址变址寻址MOV AX,DISP SI;存储器;存储器累加器,累加器,变址寻址变址寻址MOV DS,MEM;存储器;存储器段寄存器,段寄存器,直接寻址直接寻址MOV CX,DISP BX SI ;存储器;存储器累加器,累加器,相对基址加变址相对基址加变址 寄存器具有明确的字节和字类型寄存器具有明确的字节和字类型 不存在存储器向存储器的传送指令不存在存储器向存储器的传送指令 j MOV MEM2,MEM1 错。错。MOV AX ,MEM1MOV MEM2 ,AX 对。对。例例:MOV DS,2000H 错。错。MOV AX,2000HMOV DS,AX 对。对。l MOV ES,DS ;错错MOV AX,DSMOV ES,AX ;对对。例:例:MOV CS,AX ;错错 MOV AX,CS ;对对。对段寄存器的操作不灵活对段寄存器的操作不灵活例例3.1 数据传送数据传送有如下两条指令有如下两条指令:MOV DS,1000HMOV BX,ES设执行前设执行前:(DS)=4000H,41000H=00H,41001H=11H,(ES)=3000H,(BX)=2000H 则这两条指令执行后则这两条指令执行后:(DS)=1100H,13000H=00H,13001H=30HMOV指令传送功能图解指令传送功能图解立即数立即数段寄存器段寄存器CS DS ES SSCS DS ES SS通用寄存器通用寄存器AX BX CX DXAX BX CX DXBP SP SI DIBP SP SI DI存存储储器器非法指令的主要现象:非法指令的主要现象:两个操作数的类型不一致两个操作数的类型不一致无法确定是字节量还是字量操作无法确定是字节量还是字量操作两个操作数都是存储器两个操作数都是存储器不允许两个段寄存器之间直接传送数据不允许两个段寄存器之间直接传送数据立即数、立即数、CS、IP不能作为目的操作数不能作为目的操作数不允许立即数直接送段寄存器不允许立即数直接送段寄存器非法指令两个操作数类型不一致非法指令两个操作数类型不一致在绝大多数双操作数指令中,目的操作数和源操在绝大多数双操作数指令中,目的操作数和源操作数作数必须具有一致的数据类型必须具有一致的数据类型,或者同为字量,或者同为字量,或者同为字节量,否则为非法指令或者同为字节量,否则为非法指令MOV AL,050AH;非法指令,;非法指令,修正:修正:;mov ax,050ahMOV SI,DL;非法指令,;非法指令,修正:修正:;mov dh,0;mov si,dx非法指令无法确定是字节量还是字量操作非法指令无法确定是字节量还是字量操作当无法通过任一个操作数确定操作类型时,需要当无法通过任一个操作数确定操作类型时,需要利用汇编语言的操作符显式指明利用汇编语言的操作符显式指明MOV BX+SI,255;非法指令,;非法指令,修正:修正:;mov byte ptrbyte ptr bx+si bx+si,255;byte ptrbyte ptr 说明是字节操作说明是字节操作;mov word ptrword ptr bx+si bx+si,255;word ptrword ptr 说明是字操作说明是字操作非法指令两个操作数都是存储器非法指令两个操作数都是存储器8088指令系统除串操作指令外,不允许两个操作指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)数都是存储单元(存储器操作数)MOV buf2,buf1;非法指令,;非法指令,修正:修正:;假设;假设buf2和和buf1是两个字变量是两个字变量;mov ax,buf1;mov buf2,ax;假设;假设buf2和和buf1是两个字节变量是两个字节变量;mov al,buf1;mov buf2,al非法指令段寄存器的操作有一些限制非法指令段寄存器的操作有一些限制8086/8088指令系统中,能直接对段寄存器操作指令系统中,能直接对段寄存器操作的指令只有的指令只有MOV等个别传送指令,并且不灵活等个别传送指令,并且不灵活MOV DS,ES;非法指令,;非法指令,修正:修正:;mov ax,es;mov ds,axMOV DS,100H;非法指令,;非法指令,修正:修正:;mov ax,100h;mov ds,ax MOV CS,SI;非法指令;非法指令;指令存在,但不能执行;指令存在,但不能执行(Exchange)格式:格式:XCHG dest,src;(dest)(src)执行操作:执行操作:可以可以 实现:实现:注意:注意:存储器之间不能交换,存储器之间不能交换,两个操作数中必须有一个在寄存器中;两个操作数中必须有一个在寄存器中;段寄存器和立即数不能作为一个操作数;段寄存器和立即数不能作为一个操作数;允许字或字节操作,不影响标志位。允许字或字节操作,不影响标志位。应用举例:应用举例:XCHG BL,DLXCHG AX,SIXCHG COUNTDI,AXXCHG BX,DI(错)错)XCHG DS,AX (错)错)XCHG AL,20H?例例3.2 数据交换数据交换movmov ax,1199h ax,1199h;ax=1199hax=1199hxchgxchg ah,al ah,al;ax=9911hax=9911h;等同于;等同于 xchgxchg al,ah al,ahmov wvar,5566hmov wvar,5566h;wvarwvar是一个字量变量是一个字量变量xchg ax,wvarxchg ax,wvar ;ax=5566hax=5566h,wvarwvar=9911h=9911h;等同于;等同于 xchg wvar,axxchg wvar,ax xchg al,byte ptrxchg al,byte ptr wvar+1 wvar+1;ax=5599hax=5599h,wvarwvar=6611h=6611h;“byte ptrbyte ptr wvar+1”wvar+1”强制为字节量,只取高字强制为字节量,只取高字节与节与ALAL类型交换,否则数据类型不匹配类型交换,否则数据类型不匹配3)换码(查表)指令换码(查表)指令XLAT(translate)将将BX指定的缓冲区中、指定的缓冲区中、AL指定的位移处的一个指定的位移处的一个字节数据取出赋给字节数据取出赋给AL 将一种代码翻译成另一种代码。将一种代码翻译成另一种代码。功能:完成一个字节的查表转换。功能:完成一个字节的查表转换。XLATXLAT ;ALDS:BX+ALALDS:BX+AL演示演示或或XLAT 表首址表首址 ;表首址置于;表首址置于BX中中3)换码(查表)指令换码(查表)指令XLAT(translate)换码指令执行前:换码指令执行前:建立字节表格建立字节表格 BX BX表首地址表首地址 AL AL需转换的代码(相对表格首地址的位移需转换的代码(相对表格首地址的位移量)量)表格的内容即为转换后的代码表格的内容即为转换后的代码换码指令执行后:换码指令执行后:将将ALAL寄存器的内容转换为寄存器的内容转换为目标代码目标代码注意:注意:因因AL AL 寄存器只有寄存器只有8 8位位,所以表格的长度所以表格的长度256256例例3.3 3.3 换码(查表)换码(查表)查平方表,查平方表,3 32 2=?LEA BXLEA BX,TABLETABLE;令令BX=TABLEBX=TABLE值值MOV ALMOV AL,3 3XLAT TABLEXLAT TABLE;AL=BX+3;AL=BX+3;=TABLE+3;=TABLE+3;=3;=32 2注:注:XLATXLAT指令对无规律的代码转换特别方便。指令对无规律的代码转换特别方便。若把字符的若把字符的扫描码扫描码转换成转换成ASCII码码;或或数字数字09转换成转换成7段数码所需要的相应代码(段数码所需要的相应代码(字形码字形码)等)等就要用就要用XLAT指令。指令。P105例:内存的数据段中有一张十六进制数字的例:内存的数据段中有一张十六进制数字的ASCII码表。码表。首地址为:首地址为:Hex_table,欲查出表中第欲查出表中第10个元素(个元素(A)执行指令序列执行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT Hex_table假设:假设:(DS)=F000H,Hex_table=0040H(AL)=0AH执行执行XLAT以后:以后:(AL)=41H=F004AH,即即A的的ASCII码。码。30H30H31H31H32H32H.39H39H41H41H42H42H.46H46H.Hex_tableHex_tableHex_table+1Hex_table+1Hex_table+2Hex_table+2Hex_table+0AHHex_table+0AHHex_table+0BHHex_table+0BHHex_table+0FHHex_table+0FHFFBBAA9911220016进制数的进制数的ASCII码表码表4)堆栈操作指令堆栈操作指令堆栈是一个堆栈是一个“后进先出后进先出FILO”FILO”(或说(或说“先先进后出进后出FILO”FILO”)的主存区域,位于堆栈段)的主存区域,位于堆栈段中;中;SSSS段寄存器段寄存器记录其段地址记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈只有一个出口,即当前栈顶;用堆栈堆栈指针寄存器指针寄存器SPSP指定指定堆栈只有两种基本操作:进栈和出栈,对堆栈只有两种基本操作:进栈和出栈,对应两条指令应两条指令PUSH和和POP图示图示(1)进栈指令进栈指令PUSH进栈指令先使堆栈指针进栈指令先使堆栈指针SP减减2,然后把一,然后把一个个字字操作数存入堆栈顶部操作数存入堆栈顶部PUSH r16/m16/segPUSH r16/m16/seg;SPSPSPSP2 2;SS:SPr16/m16/segSS:SPr16/m16/seg演示演示push axpush 2000h(2)出栈指令出栈指令POP出栈指令把栈顶的一个字传送至指定的目出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针的操作数,然后堆栈指针SP加加2POP r16/m16/segPOP r16/m16/seg;r16/m16/segSS:SPr16/m16/segSS:SP;SPSPSPSP2 2pop axpop wvar演示演示 可以可以用一条立即数传送指令给用一条立即数传送指令给SP赋值赋值,确定,确定SP在在SS段段中的初始位置。中的初始位置。例:例:设:设:(SS)=9000H,堆栈段为堆栈段为64KB MOV SP,0E200H;(SP)=0E200H则:则:整个堆栈段的物理地址范围为:整个堆栈段的物理地址范围为:堆栈在内存中的情况如右图所示:堆栈在内存中的情况如右图所示:.偏移地址偏移地址物理地址物理地址00000H(低地址)00000H(低地址)90000H90000H9E200H9E200H9FFFFH9FFFFHFFFFHFFFFH(SP)=E200H(SP)=E200H0000H0000H堆堆栈栈段段堆栈在内存中的情况堆栈在内存中的情况q 调用子程序(或过程)或发生中断时要调用子程序(或过程)或发生中断时要保护断点的地址保护断点的地址,子程序或中断返回时恢复断点。子程序或中断返回时恢复断点。栈底的一端地址较大,栈顶的一端地址较小栈底的一端地址较大,栈顶的一端地址较小 堆栈操作都按堆栈操作都按字字操作。操作。PUSH,POP 指令的操作数可能有三种:指令的操作数可能有三种:寄存器(通用寄存器,地址指针,变址寄存器)寄存器(通用寄存器,地址指针,变址寄存器),段寄存器段寄存器(CS除外,除外,PUSH CS 合法,合法,POP CS 非法)非法),存储器。存储器。执行执行PUSH 指令指令,(SP)-2 (SP),低字节放在低地址,高字节放在高地址。低字节放在低地址,高字节放在高地址。随着推入堆栈内容增加,堆栈就扩展,随着推入堆栈内容增加,堆栈就扩展,SP的值减少,的值减少,但但SP总是指向栈顶,总是指向栈顶,堆栈工作原则堆栈工作原则后进先出。后进先出。堆栈最大容量即为堆栈最大容量即为SP的初值与的初值与SS之间的差。之间的差。栈底的定义:栈底的定义:SS:SP赋初值赋初值规定堆栈在规定堆栈在内存中的位置,内存中的位置,SP的初值规定了所用堆栈的初值规定了所用堆栈段的大小。段的大小。堆栈应用举例:堆栈应用举例:例:例:MOV BP,SPPUSH AXPUSH BXPUSH CXMOV CX,BP-6 MOV BX,BP-4MOV AX,BP-2ADD SP,6例例 :PUSH AXPUSH BXPUSH CXPOP CXPOP BX POP AX注意注意:堆栈操作总是按字进行,没有字节操作。堆栈操作总是按字进行,没有字节操作。PUSH AL PUSH AL POP DH POP DH 操作数:操作数:REGREG或内存单元或内存单元 PUSH 1000HPUSH 1000H PUSH CS PUSH CS POP CS POP CS (Address-object transfer)8086/8088 提供三条提供三条:地址指针写入指定寄存器或寄存器对指令。地址指针写入指定寄存器或寄存器对指令。1、LEA(Load Effective Address)2、LDS(Load pointer using DS)3、LES(Load pointer using ES)将存储器操作数的有效地址送至指定的将存储器操作数的有效地址送至指定的16位通用位通用寄存器寄存器1)有效地址传送指令)有效地址传送指令LEA(load effective address)LEA r16,mem;r16mem的有效地址的有效地址EA例题例题 有效地址的获取有效地址的获取mov bx,400hmov si,3chlea bx,bx+si+0f62h;BX400H3CH0F62H139EH注意:设注意:设 (DS)=3000HBUFFER=1000H(31000H)=0040H(1)LEA 指令与指令与MOV 的区别:的区别:不是传送变量本身,而是传送变量的地址。不是传送变量本身,而是传送变量的地址。LEA BX,BUFFER ;(;(BX)=1000HMOV BX,BUFFER ;(BX)=0040H LEA 指令与指令与MOV等价等价LEA BX,BUFFER ;(BX)=1000HMOV BX,OFFSET BUFFER ;(BX)=1000H40H40H00H00H.3000H:1000H3000H:1000H(DS)(DS)BUFFERBUFFER31001H31001H.存储器存储器(2),。(3)请思考下列指令的正、误)请思考下列指令的正、误LEA DX,BETABXSILEA DX,AX2)地址传送指令)地址传送指令LDSLDS LDS 目的,源;目的,源;目的目的REG“REG“源源”开始的两单元内容开始的两单元内容 (地址偏移量)(地址偏移量)DSDS “源源+2”+2”开始的两单元内容开始的两单元内容 (段基地址)(段基地址)例:例:LDS SI,2030H 若执行前:若执行前:DS=5000H,52030H=0240H,52032H=3000H。指令执行后:指令执行后:SI=0240H,DS=3000H例例:假设:假设:(DS)=C 000H指令指令:LDS SI,0010H执行指令后执行指令后:(SI)=(DS)=80H80H01H01H00H00H20H20HC000H:0010HC000H:0010H(DS)(DS)C0011HC0011HC0012HC0012HC0013HC0013H.存储器存储器0180H2000H格式:格式:LES reg16,mem32 ;(;(reg16)(EA)(ES)(EA)+2)功能:功能:此指令常常指定此指令常常指定DI寄存器。寄存器。将指令指定将指令指定mem32单元的前两个单元内容单元的前两个单元内容(16位偏移量位偏移量)装入装入指定通用寄存器,把后两个单元内容指定通用寄存器,把后两个单元内容(段地址段地址)装入到装入到ES段段寄存器。寄存器。用于写远地址指针。用于写远地址指针。例例:假设:假设:(DS)=B 000H (BX)=080AH指令指令:LES DI,BX执行指令后执行指令后:(DI)=05A2H(ES)=4000HA2HA2H05H05H00H00H40H40HB000H:080AHB000H:080AH(DS)(DS)B080BHB080BHB080CHB080CHB080DHB080DH.存储器存储器(BX)(BX)综合举例:综合举例:设:设:(DS)=5000H TABLE=1000H分析下列指令执行结果:分析下列指令执行结果:MOV BX,TABLE ;(;(BX)=MOV BX,OFFSET TABLE ;(;(BX)=LEA BX,TABLE ;(;(BX)=LES BX,TABLE ;(;(BX)=,(,(ES)=LDS BX,TABLE ;(;(BX)=,(,(DS)=40H40H00H00H00H00H5000H:1000H5000H:1000H(DS)(DS)TABLETABLE51001H51001H.存储器存储器30H30H.51002H51002H51003H51003H0040H1000H1000H0040H3000H0040H3000H(Flag register transfer)采用了隐含寄存器(采用了隐含寄存器(AH、Flags)操作数方式。操作数方式。8088有四条标志传送操作指令:有四条标志传送操作指令:1LAHF(Load AH into flags)2SAHF(Store AH into flags)3PUSHF(Push flags onto stack)4POPF(Pop flags off stack)3.标志位传送标志位传送FRAH(字节);(字节);FR 堆栈(字)堆栈(字)单字节指令,操作数隐含规定,无操作数指令单字节指令,操作数隐含规定,无操作数指令1)读取标志指令)读取标志指令 LAHF 格式:格式:LAHF 功能:功能:AHFR的低字节的低字节 即:即:AHSF ZFAFPFCF3.标志位传送标志位传送2 2)设置标志指令)设置标志指令SAHFSAHF 格式:格式:SAHFSAHF 功能功能:FRFR的低字节的低字节AHAH 这些指令不影响溢出标志、方向标志这些指令不影响溢出标志、方向标志DFDF,中断,中断允许标志和跟踪标志。可能影响标志允许标志和跟踪标志。可能影响标志寄存器的寄存器的SFSF、ZFZF、AFAF、PFPF和和CFCF,它取决于,它取决于AHAH中相应位的状态。中相应位的状态。3.标志位传送标志位传送3)PUSHF3)PUSHF 功能:将功能:将FRFR内容压入堆栈内容压入堆栈 同时同时(SP)(SP)(SP)(SP)POPF)POPF 功能:从堆栈弹出一个字送功能:从堆栈弹出一个字送FRFR 同时同时(SP)(SP)(SP)(SP)2 2 这条指令执行后,标志寄存器的标志位就取决这条指令执行后,标志寄存器的标志位就取决于源堆栈顶部单元的内容。于源堆栈顶部单元的内容。用途:用途:PUSHF PUSHF和和POPFPOPF指令一般用于子程序和中断处理程序指令一般用于子程序和中断处理程序的首尾,对主程序标志起保护和恢复作用。的首尾,对主程序标志起保护和恢复作用。实现对跟踪标志实现对跟踪标志TFTF状态的修改。状态的修改。(Input and Output)输入输出指令共两条:输入输出指令共两条:(Input byte or word)(Output byte or word)输入指令输入指令IN用于用于CPU从外设端口接受数据从外设端口接受数据,输出指令输出指令OUT用于用于CPU向外设端口发送数据。向外设端口发送数据。无论接受还是发送数据,必须通过累加器无论接受还是发送数据,必须通过累加器AX(字)或字)或AL(字节),字节),又称累加器专用传送指令又称累加器专用传送指令。每个外设要占几个端口:数据口,状态口和控制口。每个外设要占几个端口:数据口,状态口和控制口。CPUCPUI/OI/O设备设备译译码码数据端口数据端口DBDBABABCBCBI/O接口I/O接口状态端口状态端口控制端口控制端口在在IBMPC机里,可以配接许多外部设备,机里,可以配接许多外部设备,每个外设与每个外设与CPU之间交换数据,状态信息和控制命令,之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有端口数:外部设备最多有65536个个I/O端口。端口。A0A15译码形成。译码形成。端口号:端口号(即外设端口地址)为端口号:端口号(即外设端口地址)为0000HFFFFH。,可以直接写在指令中,可以直接写在指令中,这就是长格式,这就是长格式,。端口号代替指令中的端口号代替指令中的PORT,机器指令用二字节表示,第二字节就是端口号。机器指令用二字节表示,第二字节就是端口号。,必须先把端口号放到必须先把端口号放到DX寄存器中。寄存器中。不需要用任何段寄存器来修改它的值。不需要用任何段寄存器来修改它的值。格式:格式:IN acc,port ;(acc)(port)具体形式有四种:具体形式有四种:IN AL,port8 ;端口地址端口地址8位,输入一个字节位,输入一个字节IN AX,port8 ;端口地址;端口地址8位,输入一个字位,输入一个字IN AL,DX ;端口地址;端口地址16位,输入一个字节位,输入一个字节IN AX,DX ;端口地址;端口地址16位,输入一个字位,输入一个字 必须通过累加器必须通过累加器AX(字)或字)或AL(节)节)输入输入数据。数据。(Output byte or word)格式:格式:OUT port,acc;(port)(acc)具体形式有四种:具体形式有四种:OUT port8 ,AL;端口地址端口地址8位,输出一个字节位,输出一个字节OUT port8,AX;端口地址;端口地址8位,输出一个字位,输出一个字OUT DX,AL ;端口地址;端口地址16位,输出一个字节位,输出一个字节 OUT DX,AX ;端口地址;端口地址16位,输出一个字位,输出一个字 必须通过累加器必须通过累加器AX(字)或字)或AL(节)节)输出输出数据。数据。MOV指令的功能指令的功能XCHG指令的功能指令的功能XLAT指令的功能指令的功能堆栈的图示堆栈的图示SSSSSPSP0000H0000H(栈顶)(栈顶)存储器存储器高地址高地址堆栈段堆栈段PUSH指令的功能指令的功能POP指令的功能指令的功能
展开阅读全文