1、3.4 8086指令系统,8086指令系统按照功能分成六类:数据传送、算术运算、逻辑运算及移位、字符串处理、控制转移和处理器控制。 一、 数据传送类指令 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLAT PUSH POP LEA,(1)传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,MOV reg/mem,imm ;立即数送寄存器或主存,MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存,MOV reg/s
2、eg,mem ;主存送(段)寄存器,MOV reg/mem,seg ;段寄存器送寄存器或主存,演示,1. 通用传送指令,MOV指令立即数传送,MOV CL,4 ;CL4,字节传送 MOV DX,0FFH ;DX00ffh,字传送 MOV SI,200h ;SI0200h,字传送 MOV bvar,0AH ;字节传送 ;假设bvar是一个字节变量,定义如下:bvar DB 0 MOV wvar,0BH ;字传送 ;假设wvar是一个字变量,定义如下:wvar DW 0,明确指令是字节操作还是字操作,MOV指令寄存器传送,MOV AH,AL ;AHAL,字节传送 MOV bvar,CH ;bvar
3、CH ,字节传送 MOV AX,BX ;AXBX,字传送 MOV DS,AX ;DSAX,字传送 MOV BX,AL ;BXAL,字节传送,寄存器具有明确的字节和字类型,MOV指令存储器传送,MOV AL,BX ;ALDS:BX MOV DX,BP ;DXSS:BP+0 MOV DX,BP+4 ;DXSS:BP+4 MOV ES,SI ;ESDS:SI,不存在存储器向存储器的传送指令,MOV指令段寄存器传送,MOV SI,DS MOV AX,DS ;AXDS MOV ES,AX ;ESAXDS,对段寄存器的操作不灵活,MOV指令传送功能图解,MOV指令也并非任意传送!,非法指令的主要现象: 两
4、个操作数的类型不一致 无法确定是字节量还是字量操作 两个操作数都是存储器 段寄存器的操作有一些限制,非法指令两个操作数类型不一致,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令MOV AL, 050AH ;非法指令,修正:;mov ax,050ahMOV SI, DL ;非法指令,修正:;mov dh,0;mov si,dx,非法指令无法确定是字节量还是字量操作,当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明MOV BX+SI, 255 ;非法指令,修正:;mov byte ptr bx+si,255
5、;byte ptr 说明是字节操作;mov word ptr bx+si,255;word ptr 说明是字操作,非法指令两个操作数都是存储器,8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)MOV buf2, buf1 ;非法指令,修正:;假设buf2和buf1是两个字变量;mov ax,buf1;mov buf2,ax;假设buf2和buf1是两个字节变量;mov al,buf1;mov buf2,al,非法指令段寄存器的操作有一些限制,8086指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活MOV DS, ES ;非法指令,修正:;m
6、ov ax,es;mov ds,axMOV DS, 100H ;非法指令,修正:;mov ax,100h;mov ds,axMOV CS, SI ;非法指令;指令存在,但不能执行CS和IP不能是目的操作数,(2)交换指令XCHG(exchange),把两个地方的数据进行互换,寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据,XCHG reg,reg/mem ;reg reg/mem,演示,例2.2 数据交换,mov ax,1199h ;ax=1199h xchg ah,al ;ax=9911h ;等同于 xchg al,ah mov wvar,5566h
7、 ;wvar是一个字量变量 xchg ax,wvar ;ax=5566h,wvar=9911h ;等同于 xchg wvar,ax xchg al,byte ptr wvar+1;ax=5599h,wvar=6611h;“byte ptr wvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配,(3)堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,图示,进栈指令PUSH,进栈指令先使
8、堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,PUSH r16/m16/seg;SPSP2;SS:SPr16/m16/seg,演示,push ax push 2000h,出栈指令POP,出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,POP r16/m16/seg; r16/m16/segSS:SP;SPSP2,pop ax pop wvar,演示,堆栈操作的特点,堆栈操作的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈段是程序中不可或缺的一个
9、内存区,常用来 临时存放数据 传递参数 保存和恢复寄存器,2. 累加器专用传送指令,(1) 输入/输出指令IN AL,PORT OUT PORT,ALIN AX,PORT OUT PORT,AXIN AL,DX OUT DX,ALIN AX,DX OUT DX,AX 注意: 这类指令只能用累加器做I/O过程机构 长格式指令端口范围0FFH,短格式指令端口范围0FFFFH,并且使用短格式指令时,应将端口地址先赋给DX,而且只能赋给DX,(2)换码指令XLAT(translate),将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,换码指令执行前: 在主存建立一个字节量表格,内含要
10、转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码,XLAT ;alds:bx+al,演示,3 标志操作指令,1) 标志位操作指令 CLC ;复位进位标志:CF0 STC ;置位进位标志:CF1 CMC ;求反进位标志:CFCF CLD ;复位方向标志:DF0 STD ;置位方向标志:DF1 CLI ;复位中断标志:IF0 STI ;置位中断标志:IF1 2) 标志寄存器低字节与AH的传送指令LAHF SAHF 3) 标志寄存器出入堆栈指令 PUSHF POPF,(1)有效地址传送指令LEA(load effective
11、address) 将存储器操作数的有效地址送至指定的16位通用寄存器,4. 地址目标传送指令,LEA r16, mem ;r16mem的有效地址EA,例题 有效地址的获取mov bx,400hmov si,3chlea bx,bx+si+0f62h;BX400H3CH0F62H139EH,例 地址传送与内容传送,wvar dw 4142h ;假设偏移地址为04H mov ax,wvar ;内容传送:AX4142H lea si,wvar ;地址传送:SI0004H ;等同于 lea si, 0004h mov cx,si ;内容传送:CX4142H mov di,offset wvar ;mo
12、v di,0004h;利用操作符OFFSET获取变量的有效地址 mov dx,di ;内容传送:DX4142H,(2) 装入地址指令 LDS LES,一般格式: LDS r,srcLES r,src 完成一个32位地址指针的传送,地址指针包括段地址和偏移量,指令把src指定的4个字节地址指针传送到两个目标寄存器,其中前2个字节传送到某一寄存器r,后两个字节传送到DS/ES LDS常指定SI作为寄存器r,LES常指定DI作为寄存器r,例1:若指令执行前(DS)=3000H,LDS SI,2130H,MOV指令的功能,XCHG指令的功能,XLAT指令的功能,堆栈的图示,SS,SP,0000H,(栈顶),存储器,高地址,堆栈段,PUSH指令的功能,POP指令的功能,