指令系统概述

计算机的指令系统是指其处理器所能执行的各种指令的集合。指令有机器指令和汇编指令两种形式,机器指令用二进制代码表示,便于机器识别;汇编指令则是用助记符来表示机器指令。

机器指令格式:

机器指令通常由操作码字段和操作数字段两部分组成。

操作码字段指示计算机所要执行的操作类似。操作数字段指出指令执行操作所需的数据和操作结果存放的位置。

根据一条指令操作数字段提供的操作数个数,可将指令分为以下3种:

双操作数指令:

双操作数中的操作数字段提供两个操作数,中间用逗号分隔,逗号前面的数称为目的操作数,逗号后面的数称为源操作数。

eg:MOV AL,05H ; 将8位立即数 05H 存入寄存器 AL中

eg:MOV AL,BL ;将寄存器 AL 和 BL 中的数相加,结果放入 AL 中

单操作数指令:

操作数字段只提供一个操作数。这类指令有两种情况,一是只需要一个操作数;二是指令中只需给出一个指令,另一个操作数是隐含指出的。

eg:INC AX ;加1指令,将 寄存器AX的内容加1

eg:PUSH BX ;进栈指令,只需给出源操作数,目的操作数是栈顶单元

零操作数指令:

这类指令只有操作码字段,没有操作数字段。

eg:HLT ;停机指令

eg:CBW ;符号扩展指令,隐含的操作数在 AL 和 AX 中

单操作数指令和零操作数指令格式如下:

寻址技术

指令中操作数字段可能直接给出操作数,也可能给出操作数的存放地址,若指令中给出的是操作数的存放地址,则在执行指令前要根据指令中的地址信息来寻找操作数,这个过程叫做寻址。

立即寻址:

立即寻址方式是指操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段中。立即寻址方式只能用于源操作数,不能用于目的操作数。

eg:MOV BL,20H ;将8位立即数 20H 存入寄存器 BL 中

eg:MOV AX,12BCH ;将16位立即数 12BCH 存入寄存器 AX 中

eg:MOV BX,"AB" ;将字符串 “AB” 存入寄存器 BX 中

寄存器寻址:

寄存器寻址方式是指操作数存放在寄存器中,指令中直接给出寄存器名,通过寄存器名找到操作数。寄存器寻址即可用于源操作数,又可用于目的操作数。

eg:MOV CX,1234H ;将16位立即数 1234H 放入寄存器 CX 中

eg:MOV BL,AL ;将寄存器 AL 中的内容存入寄存器 BL 中

eg:MOV DS,BX ;将通用寄存器 BX 中的内容存入段寄存器 DS

存储器寻址方式:

操作数在存储器单元中,存储器单元作为操作数时,CPU 必须通过指令提供的信息计算出该存储单元的物理地址,物理地址由段基址和偏移量组成。

在 80X86 中,根据对存储器单元地址偏移量的不同计算方式,可以分为以下5中不同的寻址方式。

直接寻址方式:

直接寻址方式是指指令所需的操作数存放在存储器单元中,其地址偏移量由指令代码中的偏移量直接给出。

操作数格式:[常数]|变量名

源操作数采用直接寻址方式:

eg:MOV BL,[100H] ;将当前数据段偏移量为 100H 的字节单元内容存入 BL 中

eg:MOV AX,DW_WORD ;将 DW_WORD 指向的字单元内容存入 AX

目的操作数采用直接寻址方式:

eg:DW_WORD,OFFH ;将立即数 0FFH 存入 DA_WORD 指向的字节单元

eg:ES:[100H],AX ;将 AX 中的内容存入附加段 ES 中偏移 100H 的字单元

寄存器间接寻址:

指指令所需的操作数存放在存储器单元中,其地址偏移量由基址寄存器 BX 、BP 或变址寄存器 SI、DI 给出。BP 默认段 SS;BX,SI,DI 默认段 DS。

操作数格式:[BX|BP|SI|DI]

目的操作数采用寄存器间接寻址:

eg:MOV [BX],1234H ;设 BX 的内容为 100H ,将 1234H 存入 DS 段偏移 100H 的字单元

eg:MOV [BP],BL ;设 BP 的内容为 100H ,将 BL 存入 SS 段偏移 100H 的字节单元

源操作数采用寄存器间接寻址:

eg:MOV AL,[SI] ;设 SI 的内容为 100H ,将 DS 段偏移 100H 的字节单元的内容存入 AL

eg:MOV AX,DS:[BP] ;设 BP 的内容为 1000H ,将 DS 段偏移 1000H 的字单元的内容存入 AX

注:当存入内容为16位时,存入字单元,8位时存入字节单元。

寄存器相对寻址方式:

指指令所需的操作数存放在存储器单元中,指令中给定的一个基址寄存器或变址寄存器名(BX,BP,SI,DI)和一个8位或16位的相对位移量,两者之和位操作数的地址偏移量。使用 BP ,默认段为 SS ;使用其他寄存器,默认段为 DS。

操作数格式:位移量 [Bx|BP|SI|DI]

eg:MOV AL,ES:VAR[SI] ;设 SI 的内容为 100H ,VAR 所指存储单元的偏移量为200H,

​ ;则源操作数偏移量为 300H ,将 ES 段偏移量为 300H 的字节单元内容存入 AL

eg:MOV 10H[BX],1234H ;设 BX 的内容为 100H ,则目的操作数偏移量为 110H,

​ ;将 1234H存入 DS 段偏移量为 110H 的字单元

基址变址寻址方式:

指指令所需的操作数存放在存储器单元中,指令中给定的一个基址寄存器名 (BX或BP)和一个变址寄存器名 (SI或DI),两者内容之和为操作数的地址偏移量。

操作数格式:[BX|BP+SI|DI

eg:AX,ES:[BX+SI] ;设 BX 的内容为 100H ,SI 的内容为 20H ,则源操作数偏移量为 120H

​ ;将 ES 段偏移为 120H 字单元内容存入 AX

eg:[BP+DI],AL ;设 BP 的内容为 1000H ,DI 的内容为 50H ,则目的操作数的偏移量为1050H

​ ;将 AL 的内容存入 SS 段偏移量为 1050H 的字节单元

相对基址变址寻址方式:

指指令所需的操作数存放在存储器单元中,指令中给定一个基址寄存器名(BX或BP)、一个变址寄存器名(SI或DI)和一个8位或16位的相对地址位移量,三者内容之和为操作数的偏移量。若基址寄存器使用BP ,默认段 SS,基址寄存器使用 BX ,默认段 DS。

操作数格式:位移量[BX|BP+SI|DI]

eg:MOV AL,[BX+DI-20H] ;设 BX 的内容为 100H, DI 的内容为 20H ,则源操作数的偏移量为 100H

​ ;将 DS 段偏移量为 100H 的字单元内容存入 AL

eg:MOV [BP+SI+100H],AX ;设 BP 的内容为 1000H, DI 的内容为 200H ,则目的操作数的偏移量为 1300H

​ ;将 AX 的内容存入 DS 段偏移量为 1300H 的字单元


[^]: 注:本篇中所有配图均来自《汇编语言程序设计实用教程》–任向民 ,如有侵权,请联系作者删除!