3.2.1 数据传送指令
1. MOVOPRD1,OPRD2
MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。
源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器。数据传送方向的示意图,如图3.13所示。
各种数据传送指令例举如下:
(1)在CPU各内部寄存器之间传送数据(除代码段寄存器CS和指令指针IP以外)。
MOV AL,BL
MOV DL,CH 8位数据传送指令(1个字节)
MOV AX,DX
MOV CX,BX
MOV DX,BX } 16位数据传送指令(1个字)
MOV DX,ES
MOV BX,DI
MOV SI,BP
(2)立即数传送至CPU的内部通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI),给这些寄存器赋值。
MOV CL, 4;8位数据传送(1个字节)
MOV AX,03FFH;16位数据传送
MOV S1,057BH; 16位数据传送(1个字)
(3)CPU内部寄存器(除了CS和IP以外)与存贮器(所有寻址方式)之间的数据传送,与前述一样可以传送一个字节也可以传送一个字。
·在CPU的通用寄存器与存贮器之间传送数据:
MOV AL, BUFFER
MOV AX,[SI]
MOV,[DI] CX
MOV SI, BLOCK[BP]
·在CPU寄存器与存贮器之间传送数据:
MOV DS,DATA[SI+BX]
MOV DEST[BP+DI],ES
例如,为了将在同一个段内的偏移地址为AREA1的数据传送到偏移地址为AREA2单元中去,就需要执行以下两条传送指令:
MOV AL,AREA1
MOV AREA2,AL
如果要求将内存中一个数据块搬移到另一个内存数据区中时,例如要将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中去,可以
用有循环控制的数据传送程序来实现。为此采用间接寻址方法,用SI存放源数据地址,DI存放目的数据地址,用CX作为循环计数控制单元。
其程序如下:
MOV SI,OFFSETAREA1
MOV DI,OFFSETAREA2
MOV CX,100
AGAIN: MOV AL,[SI]
MOV,[DI] AL
INC SI
INC DI
DEC CX
JNZ AGAIN
2. 交换指令
XCHG OPRD1,OPRD2
目的 源
交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之间进行,
但是段寄存器不能作为一个操作数,例如:
XCHG AL,CL
XCHG AX,DI
XCHG BX,SI
XCHG AX,BUFFER
XCHG BX,DATA[SI]
3. 地址传送指令
8088有3条地址传送指令。
(1)LEA指令
例如:
LEA OPRD1,OPRD2
该指令把源操作数OPRD2的地址偏移量传送至目的操作 数OPRD1中。源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。
这条指令通常用来建立串指令操作所需的寄存器指针。
例如:LEA BX,BUFR是把变量BUFR的地址偏移量送到BX中。
(2) LDS指令
该指令完成一个地址指针的传送。地址指针包括段地址和地址偏移量。指令执行时,将段地址送入DS,地址偏移量送入一个16位的指针寄存器或变址寄存器。
例如:LDS SI,[BX]是把BX所指的32位地址指针的段地址送入DS,偏移地址送入SI。
(3) LES指令
这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。
例如:LES DI,[BX+CONT]是把BX+CONT所指的32位地址指针的段地址送入ES,偏移地址送入DI4.堆栈操作指令
堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定。对堆栈的操作具有先入后出的特点。用于堆栈操作的指令主要是:
PUSH OPRD(压入堆栈指令) POP OPRD(弹出堆栈指令)
堆栈操作指令中的操作数可以是段寄存器(除CS)的内容、16位的通用寄存器(标志寄存器有专门的出入栈指令)以及内存的16位字,例如,
MOV AX,8000H
MOV SS,AX
MOV SP,2000H
MOV DX,3E4AH
PUSH DX
PUSH AX
当执行完两条压入堆栈的指令时,堆栈中的内容如图3.14所示。
由图3.14可以解释压入堆栈的过程:
①SP-1→SP
②DH→(SP)
③SP-1→SP
④DL→(SP)
这就是把DX压入堆栈的过程。AX的压栈过程是一样的。
出堆栈的过程与此刚好相反,例如POPAX:
①(SP)→AL
②SP+1→SP
③(SP)→AH
④SP+1→SP
可见,SP的内容总是指向堆栈的顶。
4. 字节、字转换指令
有一条指令能将AL的符号位(bit7)扩展到整个AH中,它就是CBW,即将字节转换成一个字。
例如,
MOV AL,4FH
CBW
在执行完CBW之后,AX=004FH。另一条指令是将AX的符号位(bit15)扩展到整个DX,它就是CWD,即将字转换成双字。
例如,
MOV AX,834EH
CWD
执行完CWD之后,DX=FFFFH,DXAX=FFFF834EH