指令系统和数据传送(三)


指令系统和数据传送(三)

指令系统

指令:控制计算机完成某种操作的命令。
指令系统:指机器所具有的全部指令的集合。
指令的兼容性:同一系列机的指令都是兼容的

指令格式

操作码 操作数,操作数

:操作数可有可无。
操作码:执行什么操作
操作数
参加操作的数据或者数据存放的地址,第一个操作数是目标操作数。目标操作数一定是个地址,第二个操作数是源操作数

进一步划分指令格式

零操作数

操作码

:零操作数不是没有操作数,而是操作数被隐含掉了
单操作数

操作码 操作数

双操作数

操作码 操作数 操作数

操作数

  • 立即数:就是数据本身
  • 寄存器:数据存放的地址
  • 存储器:数据存放的地址

:8088/8086都是16位CPU,所以指令操作数可以是8位和16位,但不能更长

立即数操作数

立即数由指令直接给出,是常数性质,只能作为源操作数。
立即数不能作为目标操作数
立即数可以是无符号数或有符号数,数值需要符合其取值范围
例:

MOV AX,1234H

就是把常数1234H送给目标寄存器AX

寄存器操作数

参加运算的数据存放在指令给出的寄存器
多数情况下,寄存器操作数指通用寄存器
例:

MOV AX,BX

将BX中的内容送给AX

存储器操作数

参加运算的数据存放在存储器的某个或者两个单元中。
表现形式:[偏移地址]
指令的操作数出现[ ],表示要寻址的数在内存中
例:

MOV AL,[1200H]

这里的1200H指的是地址,就是内存中偏移地址为1200H单元的内容送到寄存器AL中。

MOV AX,[1200H]

这里是将内存中偏移地址为1200H单元和1201H单元的内容送到寄存器AX中。

寻址方式

寻址方式表示指令运算对象的来源和运算结果的去向

  • 立即寻址
  • 寄存器寻址
  • 存储器寻址
  • 隐含给出方式

立即寻址

由指令直接给出运算的数据(操作数是立即数)。
立即寻址仅适合于源操作数。
立即寻址通常用于给寄存器或某个内存单元赋初值。
例:

MOV AX,1200H

寄存器寻址

运算的数据存放在CPU中的某个通用寄存器
例:

MOV AX,BX

存储器寻址

运算的数据存放在内存中,指令中给出运算对象在内存某个逻辑段中的偏移地址

[偏移地址]

逻辑段的段基地址可以通过默认或者重设的方法给出。
存储器操作数的字长并不确定,其字长取决于指令中的另一个寄存器操作数,或通过其他方式确定字长

直接寻址

指令中直接给出操作数的偏移方式
例:

MOV AX,[1200H]

操作数默认在数据段DS,但可以进行段重设
例:

MOV AX,ES:[1200H]

其中ES: 表示段重设,将数据段改为附加段ES

间接寻址

数据在内存的偏移地址存放在某个通用寄存器中。
仅有4个通用寄存器可以用来存放数据的偏移地址,这种寄存器又叫做间址寄存器
这四个寄存器分别是:BX,BP,SI,DI
一般格式

[间址寄存器]

例:

1
2
3
4
MOV BX,1200H
MOV AX,[AX]

将1200H和1201H单元的内容放入AX

操作数的段地址取决于选择哪个间址寄存器
BX,SI,DI默认在数据段DSBP默认在堆栈段SS

相对寻址

操作数的编译地址为寄存器的内容加上一个位移量
相对寻址主要用于一维数组操作
例:

MOV AX,[BX+DATA]

1
2
3
4
MOV BX,1200H
MOV AL,[BX]5

[BX]5相当于[BX+5],就是将1205H单元的内容送给AL

基址、变址寻址

操作数的偏移地址为:一个基址寄存器的内容+一个变址寄存器的内容
基址寄存器有两个:BX,BP
变址寄存器也有两个:SI,DI
操作数的段地址由基址寄存器决定,BX为数据段,BP为堆栈段。
基址变址寻址与相对寻址一样主要用于一维数组操作。
例:

1
2
3
4
5
6
MOV SI,1100H
MOV BX,SI
MOV AX,[SI+BX]

因为基址寄存器是BX,所以源操作数默认为数据段。
最终结果是将2200和2201两个单元的内容送给AX

基址、变址、相对寻址

操作数的偏移地址为:一个基址寄存器的内容+一个变址寄存器的内容+位移量
操作数的段地址同样由基址寄存器决定。
基址变址相对寻址主要用于二维数组操作。
例:

1
2
3
4
5
6
MOV DI,1100H
MOV BP,DI
MOV AL,[BP][DI]5

偏移地址由BP+DI+5构成,因为寄存器选的BP,所以操作数默认在堆栈段
最终结果是将2205单元的内容送给AL

隐含寻址

指令隐含了一个或两个操作数的地址,操作数在一个默认的地址中。
例:

MUL BL

指令默认为AL*BL,最终将结果放在AX中

指令集

8086指令系统一共有96条指令
从功能上分为六大类

  1. 数据传送
  2. 算数运算
  3. 逻辑运算和移位
  4. 串操作
  5. 程序控制
  6. 处理器控制

数据传送指令又可以分为

  1. 通用数据传送指令
  2. 输入输出指令
  3. 地址传送指令
  4. 标志传送指令

标志传送指令外,其它指令不对标志产生影响

通用数据传送指令

其中通用数据传送又可以分为:

  1. 一般数据传送指令
  2. 堆栈操作指令
  3. 交换指令
  4. 查表转换指令
  5. 字位扩展指令

一般数据传送指令

格式

MOV dest,src

MOV AL,BL

  • 两个操作数字节必须相同
  • 两个操作数不允许同时为存储器操作数
  • 两个操作数不允许同时为段寄存器
  • 源操作数为立即数时,目标操作数不能是段寄存器
  • IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现

堆栈操作指令

堆栈操作原则

  • 先进后出
  • 以字为单位

压栈指令
格式

PUSH OPRD

过程

  1. SP-2 → SP
  2. 操作数高字节放入SP+1
  3. 操作数低字节放入SP

出栈指令
格式

POP OPRD

过程

  1. SP → 操作数低字节
  2. SP+1 → 操作数高字节
  3. SP ← SP+2

  • 操作数必须是16位
  • 操作说可以是寄存器或存储器两单元,但不能是立即数

交换指令

格式:XCHG REG,MEM/REG

  • 两操作数必须有一个是寄存器操作数
  • 不能使用段寄存器

1
2
XCHG AX,BX  
XCHG [2000],CL

查表指令

用来查找一维数组,一维表格中的元素
BX内容格首地址,AL内容为偏移量,BX+AL得到要查找元素的偏移量
BX+AL所指单元的内容送给AL
格式

XLAT

字位扩展指令

将有符号数的符号位扩展到最高位,无符号数前面直接补0,零操作数
格式

CBW

将AL扩展到AX
格式

CWD

将AX扩展到DXAX

输入输出指令

面向I/O端口操作的指令,端口地址在指令中的表示方式为寻址方式
功能:从端口地址读入数据到累加器/将累加器的值输出到端口中
格式
输入指令:

IN acc,PORT

输出指令:

OUT PORT,acc

地址传送指令

LEA指令

变量:内存单元的符号地址,属于存储器操作数
LEA指令将变量的16位偏移地址写入到目标寄存器
格式

LEA REG,MEM

指令要求
源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器

LDS、LES指令

将一个32位的远地址指针写入到目标寄存器中。
格式
LDS 通用寄存器,存储器操作数
LES 通用寄存器,存储器操作数

标志传送指令

隐含操作数AH

  • LAHF
  • SAHF

隐含操作数FLAGS

  • PUSHF
  • POPF

LAHF和SAHF

LAHF是将FLAGS的低8位装入AH
格式:LAHF
SAHF与LAHF相反


Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC