1、6.16.1 数据传送类数据传送类数据传送指令数据传送指令堆栈操作指令堆栈操作指令地址传送指令地址传送指令输入输入/输出指令输出指令6.1.1 计算机内部的数据交换计算机内部的数据交换6.1.2 通用数据传送指令通用数据传送指令 数据传送是计算机中最基本、最重要的数据传送是计算机中最基本、最重要的一种操作一种操作传送指令也是最常使用的一类指令传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一传送指令把数据从一个位置传送到另一个位置个位置除标志寄存器传送指令外,均除标志寄存器传送指令外,均不影响标不影响标志志位位掌握掌握nMOV XCHG1.传送指令传送指令MOV(move)MOV
2、指令的格式指令的格式 MOV Dest,Src ;DestSrc功能功能 将源操作数将源操作数Src复制到目的操作数复制到目的操作数Dest,Src不变。不变。语法格式语法格式 MOV Reg/Mem/seg,Reg/Mem/seg/Imm1.传送指令传送指令MOV(move)MOV指令的数据传送方向指令的数据传送方向MOV并非任意传送并非任意传送1.传送指令传送指令MOV(move)说明:说明:Dest与与Src必须类型匹配,即同必须类型匹配,即同时是字节或字。时是字节或字。n立即数没有明确的类型;立即数没有明确的类型;n寄存器有明确的类型,例如,寄存器有明确的类型,例如,AL,AX分分别为
3、字节,字类型;别为字节,字类型;n存储器操作数的类型不确定,可以用存储器操作数的类型不确定,可以用 byte ptr(字节)和(字节)和word ptr(字)指定;(字)指定;n只要有一个操作数的类型确定即可。只要有一个操作数的类型确定即可。例:例:mov ax,02h ;ax02hmov byte ptr2000h,0 ;ds:2000h0mov bx,ax ;bxaxmov 1000h,ax ;ds:1000haxmov ds,ax ;dsax1.传送指令传送指令MOV(move)mov 1000h,ax执行执行前后比较前后比较例例6.1例例6.1例:非法指令例:非法指令mov ax,bl
4、 ;类型不匹配;类型不匹配mov ds,1000h;不允许立即数直接送到段寄;不允许立即数直接送到段寄存器存器mov bx,si ;不允许存储器之间传送;不允许存储器之间传送mov es,cs ;不允许段寄存器之间传送;不允许段寄存器之间传送mov cs,ax ;CS不能作为目的操作数不能作为目的操作数mov 1000h,02h ;类型不确定;类型不确定1.传送指令传送指令MOV(move)例例6.3mov ax,1000h ;ax1000hmov ds,ax ;dsax1.传送指令传送指令MOV(move)例例6.31.传送指令传送指令MOV(move)2.交换指令交换指令XCHG(exch
5、ange)把两个地方的数据进行互换把两个地方的数据进行互换XCHG reg,reg/memXCHG reg,reg/mem;reg reg reg/memreg/memXCHG reg/mem,reg2.交换指令交换指令XCHG(exchange)不能在存储器与存储器之间对换数据不能在存储器与存储器之间对换数据源或目的操作数都不能是立即数源或目的操作数都不能是立即数 例例6.46.4 xchg ax,bx ;axbx,xchg bx,axxchg ax,bx+si ;axds:bx+si,xchg bx+si,axxchg 2000h,bx ;ds:2000h bx,xchg bx,2000h
6、bx2.交换指令交换指令XCHG(exchange)例例6.4-6.4-xchg ax,bx+si 执行前后执行前后 2.交换指令交换指令XCHG(exchange)例例6.46.4 2.交换指令交换指令XCHG(exchange)例例6.46.4 2.交换指令交换指令XCHG(exchange)例:例:xchg bx,si ;不允许存储器操作数之间;不允许存储器操作数之间交换交换xchg es,ax ;xchg指令的操作数不能为指令的操作数不能为段寄存器段寄存器xchg ax,10h ;xchg指令的操作数不能为指令的操作数不能为立即数立即数2.交换指令交换指令XCHG(exchange)例
7、例6.56.5mov al,0010h ;alds:0010hxchg al,0020h ;alds:0020hmov 0010h,al ;ds:0010hal2.交换指令交换指令XCHG(exchange)例例6.56.52.交换指令交换指令XCHG(exchange)例例6.56.52.交换指令交换指令XCHG(exchange)3.堆栈堆栈操作指令操作指令堆栈:后进先出堆栈:后进先出FILOFILO,位于堆栈,位于堆栈段;段;SSSS段寄存器段寄存器记录其段地址记录其段地址堆栈只有一个出堆栈只有一个出口,即当前栈顶;口,即当前栈顶;用用堆栈指针寄存堆栈指针寄存器器SPSP指定指定堆栈的操
8、作堆栈的操作堆栈只有两种基本操作:进栈和出栈,堆栈只有两种基本操作:进栈和出栈,对应两条指令对应两条指令PUSH和和POP堆栈操作只能以字为单位,小端方式堆栈操作只能以字为单位,小端方式Word 1Word 2Word 3Word 4Word 5StackPUSHPOPPUSH;进栈指令先使堆栈指;进栈指令先使堆栈指针针SP减减2,然后把一个字操作数,然后把一个字操作数存入堆栈顶部存入堆栈顶部POP;出栈指令把栈顶的一;出栈指令把栈顶的一个字传送至指定的目的操作数,个字传送至指定的目的操作数,然后堆栈指针然后堆栈指针SP加加21.进栈指令进栈指令PUSHpush axpush axpush w
9、ord ptr 2000hpush word ptr 2000hPUSH r16/m16/segPUSH r16/m16/seg;SPSPSPSP2 2;SS:SPr16/m16/segSS:SPr16/m16/segWordStackPUSHSP-22.出栈指令出栈指令POPpop axpop axpop word ptr 2000hpop word ptr 2000hPOP r16/m16/seg POP r16/m16/seg(不能是不能是CS);r16/m16/segSS:SPr16/m16/segSS:SP;SPSPSPSP2 2WordStackPOPSP+2堆栈的特点堆栈的特点堆
10、栈操作的单位是字,进栈和出栈只堆栈操作的单位是字,进栈和出栈只对字量对字量字量数据从栈顶压入和弹出时,都是字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送低地址字节送低字节,高地址字节送高字节高字节堆栈操作遵循先进后出原则,但可用堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数存储器寻址方式随机存取堆栈中的数据据例例6.8push ax ;SP=000EH,AX内容内容不变不变push bx ;SP=000CH,BX内容内容不变不变pop bx;BX=1986H,SP=000EHpop ax;AX=95E3H,SP=000EH例例6.8例例6.8例例6.8例例6
11、.9push axpush axpush cxpush cxpop axpop axpop cxpop cx例例6.9例例6.9 6.1.4 地址传送指令地址传送指令地址传送指令将存储器单元的地址传送指令将存储器单元的逻辑地址逻辑地址送至指定的寄存器送至指定的寄存器n有效地址传送指令有效地址传送指令 LEA注意注意不是获取存储器单元的内容不是获取存储器单元的内容 有效地址传送指令有效地址传送指令LEA(load EA)将存储器操作数的有效地址传送至将存储器操作数的有效地址传送至指定的指定的16位寄存器中位寄存器中LEA LEA r16r16,mem,mem;r16memr16mem的有效地址的
12、有效地址EAEA例例6.10:获取有效地址获取有效地址mov bx,0400hmov bx,0400hmov si,3chmov si,3chlea bx,bx+si+0f62hlea bx,bx+si+0f62h;BXBX0400h0400h003ch003ch0f62h0f62h139EH139EH 获得主存单元的有效地址;不是物理地获得主存单元的有效地址;不是物理地址,也不是该单元的内容址,也不是该单元的内容 可以实现计算功能可以实现计算功能例例6.10:获取有效地址获取有效地址6.1.5 输入输出指令输入输出指令 I/O原理原理 I/O地址及寻址方式地址及寻址方式8086通过输入输出指
13、令与外设进行数通过输入输出指令与外设进行数据交换;呈现给程序员的外设是据交换;呈现给程序员的外设是端口端口(Port)即)即I/O地址地址8086用于寻址外设端口的地址线为用于寻址外设端口的地址线为16条,端口最多为条,端口最多为21665536(64K)个,)个,端口号为端口号为0000HFFFFH输入输出寻址方式输入输出寻址方式v直接寻址直接寻址:只用于寻址:只用于寻址00HFFH前前256个个端口,操作数端口,操作数i8表示端口号表示端口号v间接寻址间接寻址:可用于寻址全部:可用于寻址全部64K个端口,个端口,DX寄存器的值就是端口号寄存器的值就是端口号大于大于FFH的端口只能采用间接寻
14、址方式的端口只能采用间接寻址方式 I/O地址及寻址方式地址及寻址方式 输入输出指令输入输出指令1.输入指令输入指令IN将外设数据传送给将外设数据传送给CPU内的内的AL/AXIN指令的格式:指令的格式:IN AL/AX,Src;AL/AXSrc指定的端口指定的端口 功能:将功能:将Src指定端口的指定端口的1个字节个字节/字读入字读入AL/AX 语法格式:语法格式:IN AL/AX,i8/DX输入输出指令输入输出指令1.输入指令输入指令IN 将外设数据传送给将外设数据传送给CPU内的内的AL/AXIN指令的格式:指令的格式:IN AL/AX,Src ;AL/AXSrc指定的端口指定的端口 功能
15、:将功能:将Src指定端口的指定端口的1个字节个字节/字读入字读入AL/AX 语法格式:语法格式:IN AL/AX,i8/DX;i8为为0-255之间的端口号之间的端口号 输入输出指令输入输出指令2.输出指令输出指令OUT 将将CPU内的内的AL/AX数据传送给外设。数据传送给外设。OUT指令的格式指令的格式 OUT Dest,AL/AX;Dest指定的端口指定的端口AL/AX功能:将功能:将AL/AX的的1个字节个字节/字写到字写到Dest指定的端指定的端口口语法格式:语法格式:OUT i8/DX,AL/AX ;i8为为0-255之间的端口号之间的端口号例例6.11:输入输入in al,21H ;直接寻址;直接寻址mov dx,21H ;间接寻址;间接寻址in al,dx例例6.12:输出输出mov dx,4ff ;间接寻址;间接寻址mov al,70out dx,al