5.2、指令系统

指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有实现其它功能的指令,也有为某种特殊的应用而增设的指令。

通常,把指令按其功能分成以下几大类:

下面,我们逐一介绍每类指令中的指令。

5.2.1 数据传送指令

数据传送指令又分为:传送指令、交换指令地址传送指令堆栈操作指令转换指令I/O指令等。

除了标志位操作指令SAHFPOPF指令外,本类的其它指令都不影响标志位。

1、传送指令MOV(Move Instruction)

传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:

MOV  Reg/Mem, Reg/Mem/Imm

其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。在本网络课件的网页中,都将采用上述缩写,此后不再说明。

指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。

下面列举几组正确的指令例子:

源操作数是寄存器

MOV  CH, AL MOV  BP, SP MOV  ECX, EBX
MOV  DS, AX MOV  [BX], CH MOV  [BX+SI], AX

源操作数是存储单元

MOV  AL, [100H] MOV  BX, ES:[DI] MOV  EDX, [BX]
MOV  BX, VARW MOV  AX, [BX+SI] MOV  CH, [BX+DI+100H]
其中:VARW是字类型内存变量(下同)。

源操作数是立即数

MOV  AL, 89H MOV  BX, -100H MOV  EDX, 12345678H
MOV  VARW, 200H MOV  [BX], 2345H MOV  [BX+DI], 1234H

在汇编语言中,主要的数据传送方式如图5.1所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。

图5.1 MOV指令数据传送示意图

对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。

1)、两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV  BL, AX等是不正确的;
2)、两个操作数不能同时为段寄存器,如:MOV  ES, DS等;

3)、代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV  CS, AX等不正确,但指令MOV  AX, CS等是正确的;

4)、立即数不能直接传给段寄存器,如:MOV  DS, 100H等;
5)、立即数不能作为目的操作数,如:MOV  100H, AX等;
6)、指令指针IP,不能作为MOV指令的操作数;
7)、两个操作数不能同时为存储单元,如:MOV  VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。

对于规定247,我们可以用通用寄存器作为中转来达到最终目的。表5.1列举一个可行的解决方案,尽供参考。读者可考虑用其它办法来完成同样的功能。

表5.1 MOV指令的变通方法

功能描述

不正确的指令

可选的解决方法

把DS的值传送给ES

MOV  ES, DS

MOV  AX, DS
MOV  ES, AX

把100H传给DS

MOV  DS, 100H

MOV  AX, 100H
MOV  DS, AX

把字变量VARB的值传送给字变量VARA

MOV  VARA, VARB

MOV  AX, VARB
MOV  VARA, AX

对于情况1:不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。