1、8086/8088指令系统之 5.2.1 数据传送类指令,8086指令系统概述,Intel 8086指令系统共有117条基本指令,可分成6个功能组 数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 控制转移类指令 处理器控制类指令,学习指令的注意事项,指令的功能该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 指令支持的寻址方式该指令中的操作数可以采用何种寻址方式 指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响 其他方面该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等,指令操作数的表达(1),r8任意一
2、个8位通用寄存器 AH AL BH BL CH CL DH DL r16任意一个16位通用寄存器 AX BX CX DX SI DI BP SP reg代表r8或r16 sreg段寄存器 CS/DS/ES/SS,指令操作数的表达(2),m8一个8位存储器操作数单元(所有主存寻址方式) m16一个16位存储器操作数单元(所有主存寻址方式) mem代表m8或m16,指令操作数的表达(3),i8一个8位立即数 i16一个16位立即数 imm代表i8或i16 p8 8位I/O端口号,数据传送类指令,数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送
3、到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLAT PUSH POP LEA,一、传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,MOV reg/mem,imm ;立即数送寄存器或主存,MOV,例1,MOV reg/mem/sreg,reg ;寄存器送(段)寄存器或主存,例 2,MOV reg/sreg,mem ;主存送(段)寄存器,例 3,MOV reg/mem,sreg ;段寄存器送寄存器或主存,例 4,例1:立即数传送,mov al,4 ;al4,字节传送 mov cx,0ffh ;cx00ffh,字传送 mov si,2
4、00h ;si0200h,字传送 mov byte ptr si,0ah ;byte ptr 说明是字节操作 mov word ptr si+2,0bh ;word ptr 说明是字操作,注意立即数是字节量还是字量明确指令是字节操作还是字操作,MOV,例2:寄存器传送,mov ax,bx ;axbx,字传送 mov ah,al ;ahal,字节传送 mov ds,ax ;dsax,字传送 mov si,al ;sial,字节传送,MOV,例3:存储器传送,mov al,bx mov dx,bp ;dxss:bp mov es,si ;esds:si,不存在存储器向存储器的传送指令,MOV,例4
5、:段寄存器传送,mov si,ds mov ax,es ;axes mov ds,ax ;dsaxes,对段寄存器的操作有一些限制!,MOV,课堂练习 数据传送,有如下两条指令:MOV DS, 1000HMOV BX, ES 设执行前:(DS)=4000H,41000H=00H,41001H=11H (ES)=3000H, (BX)=2000H,则这两条指令执行后:(DS)=1100H,13000H=00H,13001H=30H,MOV指令传送功能,MOV也并非任意传送,MOV 指令使用注意事项,1、立即数只能作为源操作数,且立即数不能送段寄存器。 【例5.10】 MOV 12H,AX ;非法
6、指令 MOV AX,1234H ;字操作,将AX赋值为1234H,AH=12H,AL=34H MOV DS,12H ;非法指令 修正为: MOV AX,12H MOV DS,AX,MOV 指令使用注意事项,2、源操作数和目的操作数类型要匹配。 【例5.11】 MOV AX,BL ;非法指令,AX和BL宽度不一致 MOV AL,1000H ;非法指令,AL为8位寄存器 MOV WORD PTR SI,12H ;字操作;SI=0012H MOV BYTE PTR SI,12H ;字节操作;SI=12H,MOV 指令使用注意事项,3、存储器和存储器之间不能直接传送数据。 【例5.12】 MOV BX
7、,SI ;非法指令 修正为: MOV AX, SI MOV BX, AX ;以寄存器为中转实现存储单元到存储单元的数据传送,MOV 指令使用注意事项,4、段寄存器和段寄存器不能直接传送数据,且CS不能作为目的操作数。 【例5.13】 MOV DS, ES ;非法指令 修正为: MOV AX, ES MOV DS, AX ;以寄存器为中转实现段寄存器到段寄存器的数据转移 【例5.14】 MOV CS, AX ;非法指令,改变了下条指令的段地址,造成不可预知结果,二、交换指令XCHG(exchange),把两个地方的数据进行互换,寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器
8、与存储器之间对换数据,XCHG,XCHG reg,reg/mem ;reg reg/mem,例6,例5,例 5:寄存器间交换,mov ax,1234h ;ax=1234h mov bx,5678h ;bx=5678h xchg ax,bx ;ax=5678h,bx=1234h xchg ah,al ;ax=7856h,XCHG,例6:寄存器与存储器交换,xchg ax,2000h ;实现DS:2000H与AX内容的字交换 ;等同于 xchg 2000h,ax xchg al,2000h ;字节交换 ;等同于 xchg 2000h,al,XCHG,换码指令执行前: 在主存建立一个字节量表格,内含
9、要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码,三、换码指令XLAT(translate),将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT ;alds:bx+al,例5.15,例5.15:代码转换,【例5.15】将数字2转换为ASCII码。 TABLE DB 30H,31H,32H,33H,34HDB 35H,36H,37H,38H,39H ;建立数字09的ASCII码表TABLEMOV AL,2 ;把测试数据2装入AL LEA BX,TABLE ;BX指向表格首地址 XLAT
10、;换码结果,AL=32H,换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,XLAT,四、有效地址传送指令LEA(load EA),将存储器操作数的有效地址传送至指定的16位寄存器中,例5.16,LEA r16,mem ;r16mem的有效地址EA,LEA,例5.16,【例5.16】 已知DS:1200H=1234H MOV BX,1200H ;BX=1234H LEA BX,1200H ;BX=1200H,获得主存单元的有效地址; 不是物理地址 也不是该单元的内容,注意地址传送与内容传送,与MOV指令的区别:不是传送变量本身,而是传送变量的地址。 w
11、var dw 4142h ;假设偏移地址为04H mov ax,wvar ;内容传送:AX4142H lea si,wvar ;地址传送:SI0004H;等同于 lea si, 0004h mov cx,si ;内容传送:CX4142H mov di,offset wvar ;mov di,0004h;利用操作符OFFSET获取变量的有效地址 mov dx,di ;内容传送:DX4142H,五、PUSH/POP堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 栈顶是
12、地址较小的一端(低端),栈底不变,堆栈和队列,堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈) 队列:按照先进先出(FIFO)的原则组织的存储器空间,堆栈的操作,堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,PUSH ;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,POP ;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,进栈指令PUSH,push ax push 2000h,PUSH r16/m16/seg ;SPSP2 ;SS:SPr16/m16/sreg,PUSH,例5.17,动画过程,例5.17,【例5.17】已知AX=1
13、234H,SP=1200H,SS=1000H,问执行指令PUSH AX后的结果。 分析:高字节压入高地址,低字节压入低地址,故AH压入ss:sp-1,AL压入SS:SP-2。 解: 111FFH=12H,111FEH=34H,SP=SP-2=11FEH,出栈指令POP,pop ax pop 2000h,POP r16/m16/seg ;r16/m16/sregSS:SP ;SPSP2,POP,动画过程,PUSH指令的功能,POP指令的功能,堆栈的特点,堆栈操作的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用
14、存储器寻址方式随机存取堆栈中的数据,例5.18,例题5.18,【例5.18】已知堆栈中021FEH=34H,021FFH=56H,02200H=78H,02201H=9AH,SS=0000H,假定执行指令POP DX时,02200H单元正在被访问,问指令执行后,SP和DX的值。 分析:SP为栈顶指针,总是指向堆栈中正在被访问的单元。出栈时SS:SP弹出的第1个字节装入DL,从堆栈SS:SP+1弹出的第2个字节装入DH,SP+2。 解:指令执行后SP=2202H,DX=9A78H。,堆栈操作的特点,注意: 堆栈操作总是按字进行,没有字节操作。PUSH AL POP DH 操作数:REG或内存单元
15、PUSH 1000H PUSH CS POP CS ,例5.19 保护和恢复现场,SUBPRO PROC ;定义子程序 PUSH AX ;将主程序中的AX PUSH CX 和CX入栈保护 POP CX ;先出栈到CX, POP AX ;再出栈到AX RET SUBPRO ENDP,六、输入输出指令 IN OUT,8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址 8086用于寻址外设端口的地址线为16条,端口最多为21665536(64K)个,端口号为0000HFFFFH 每个端口用于传送一个字节的外设数据,关于外设端口,每个外设要占几个端口:数据口,
16、状态口和控制口。,输入输出寻址方式,8086的端口有64K个,无需分段,设计有两种寻址方式 直接寻址:只用于寻址00HFFH前256个端口,操作数p8表示端口号 间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号 对大于FFH的端口只能采用间接寻址方式,六、输入/输出指令IN/OUT,输入指令IN,将外设数据传送给CPU内的AL/AX,IN AL,p8 ;字节输入:ALI/O端口(p8直接寻址) IN AL,DX ;字节输入:ALI/O端口(DX间接寻址) IN AX,p8 ;字输入:AXI/O端口(p8直接寻址) IN AX,DX ;字输入:AXI/O端口(DX间接寻址),IN,
17、举例,演示,举例:输入字量,;直接寻址,字节量输入 in al,21h mov ah,al in al,20h ;直接寻址,字量输入 in ax,20h ;间接寻址,字量输入 mov dx,20h in ax,dx,两段功能相同字量数据传送实际上实现了连续的两个端口地址的字节量传送,IN,输出指令OUT,将CPU内的AL/AX数据传送给外设,OUT p8,AL ;字节输出:I/O端口AL(p8直接寻址) OUT DX,AL ;字节输出:I/O端口AL(DX间接寻址) OUT p8,AX ;字输出:I/O端口AX(p8直接寻址) OUT DX,AX ;字输出:I/O端口AX(DX间接寻址),OU
18、T,例5.20,演示,例5.20,IN BL,32H ;非法指令,数据只能读入AL或AX OUT 32H,I8 ;非法指令,立即数I8不能直接输出 修正为: MOV AL,I8 OUT 32H,AL,OUT,IN AL,21H,OUT 43H,AL,1、指针传送指令LDS/LES,LDS r16,mem ;r16mem, ;DSmem+2 LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器,LES r16,mem ;r16mem, ;ESmem+2 LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器,例题,八、其他数据传送指令,例题:地址指针传送
19、,mov word ptr 3060h,0100h mov word ptr 3062h,1450h les di,3060h ;es=1450h,di=0100h lds si,3060h ;ds=1450h,si=0100h,mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r16,2、标志低字节进出AH指令,LAHF ;AHFLAGS的低字节 LAHF指令将标志寄存器的低字节送寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意,SAHF ;FLAGS的低字节AH SAHF将AH寄存器内容送
20、FLAGS的低字节 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志,读取标志指令,(1). 读取标志指令 LAHF格式:LAHF功能:AHFR的低字节即:AH,设置标志指令,(2). 设置标志指令SAHF格式: SAHF功能: FR的低字节AH这些指令不影响溢出标志OF、方向标志DF,中断允许标志IF和跟踪标志TF。可能影响标志寄存器的SF、ZF、AF、PF和CF,它取决于AH中相应位的状态。,3、标志寄存器进出堆栈指令,PUSHF ;SPSP2 ;SS:SPFLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2,POPF ;FLAGSSS:SP
21、;SPSP2 POPF指令将栈顶字单元内容送标志寄存器同时栈顶指针SP加2,例题,用途: PUSHF和POPF指令一般用于子程序和中断处理程序的首尾,对主程序标志起保护和恢复作用。 实现对跟踪标志TF状态的修改。,例题:置位单步标志,pushf ;保存全部标志到堆栈 pop ax ;从堆栈中取出全部标志 or ax,0100h ;设置D8=TF=1,;ax其他位不变 push ax ;将ax压入堆栈 popf ;FLAGSAX ;将堆栈内容取到标志寄存器,教学要求,掌握基本指令:MOVXCHGXLAT PUSH POP 熟悉熟悉特色指令:INOUT 了解不常使用的指令:LAHFSAHFPUSHFPOPF、LDSLES;,