灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2918回复:0

汇编指令系统

楼主#
更多 发布于:2012-09-10 18:58

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

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

数据传送指令

标志位操作指令

算术运算指令

逻辑运算指令

移位操作指令

位操作指令

比较运算指令

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

转移指令

条件设置字节指令

字符串操作指令

ASCII-BCD码运算调整指令

处理器指令

5.2.1 数据传送指令

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

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

1、传送指令MOV(Move Instruction)

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

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的值传送给ESMOV ES, DSMOV AX, DS

MOV ES, AX

把100H传给DSMOV DS, 100HMOV AX, 100H

MOV DS, AX

把字变量VARB的值传送给字变量VARAMOV VARA, VARBMOV AX, VARB

MOV VARA, AX

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

喜欢0 评分0
游客

返回顶部