当前位置: 首页 > 文档资料 > 汇编语言教程 >

5.2 指令系统

优质
小牛编辑
142浏览
2023-12-01

5.2、指令系统

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

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

  • 数据传送指令

  • 标志位操作指令

  • 算术运算指令

  • 逻辑运算指令

  • 移位操作指令

  • 位操作指令

  • 比较运算指令

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

  • 循环指令
  • 转移指令
  • 条件设置字节指令
  • 字符串操作指令
  • ASCII-BCD码运算调整指令
  • 处理器指令

5.2.1 数据传送指令

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

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

1、传送指令MOV(MoveInstruction)

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

MOV Reg/Mem, Reg/Mem/Imm

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

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

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

源操作数是寄存器

MOV CH, ALMOV BP, SPMOV ECX, EBX
MOV DS, AXMOV [BX], CHMOV [BX+SI], AX

源操作数是存储单元

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

源操作数是立即数

MOV AL, 89HMOV BX, -100HMOV EDX, 12345678H
MOV VARW, 200HMOV [BX], 2345HMOV [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是同数据类型的内存变量。

对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。表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中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。