8086/8088指令系统详解-之(1)数据传送指令

指令系统

8086/8088的指令系统大致可分为以下六种类型:

1,数据传送指令
2,算术运算指令
3,位操作指令
4,串操作指令
5,程序控制指令
6,处理器控制指令

学习指令要掌握三个方面的内容:
1,指令的功能
2,指令的寻址方式
3,指令操作对标志寄存器中状态标志位的影响

汇编语言指令语句格式
由4部分组成:
标号:指令助记符 目的操作数,源操作数 ;注释

1,标号表示该指令在主存中的逻辑地址
2,每个指令助记符就代表一种指令
3,目的和源操作数表示参与操作的对象
4,注释是对该指令或程序段功能的说明

用到的符号意义如下:

  • DST:目的操作数
  • SRC:源操作数
  • OPR:操作数
  • MEM:存储器操作数
  • REG:寄存器操作数
    (16位的AX,BX,CX,DX,BP,SP,SI,DI或
    8位的AH,AL,BH,BL,CH,CL,DH,DL)
  • SEG:段寄存器(16位的CS,DS,ES,SS)
  • Data:立即数
  • port:8位的端口地址
  • DST_ADDR:转移的目标地址
  • COUNT:计数器

这里写图片描述

一,数据传送指令

数据传送类指令将数据、地址或立即数传送到寄存器或存储器单元中。它又可分为通用数据传送指令累加器专用传送指令地址传送指令标志传送指令等四组。

1,通用数据传送指令通用数据类指令都不影响标志位!!!

1)最基本的传送指令MOV

指令格式:

MOV dst,src ;(dst)←(src)

dst 是目的操作数
Src 是源操作数

指令功能:
将源操作数src送给目的操作数dst,本质上是数据的“复制”,源操作数本身不变。

这里写图片描述
需说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中的内容。但是CS可以作为源操作数。

寻址方式:
src可以是data/MEM/REG/SEG
dst可以是MEM/REG/SEG(不能为CS,IP)

说明:
*CS不能做目的操作数;IP不能作为目的寄存器,立即数不能作为目的操作数
*不能MEM<=>MEM,不能SEG<=>SEG,不能SEG<=data
**源操作数和目的操作数类型要一致。
这里写图片描述

对标志位的影响:
不影响

例:
MOV AL,80H
MOV word ptr [BX],1020H
MOV AX,BX
MOV DH,AL
MOV [BX+10H],DX
MOV DX,[BX+SI]
MOV SS,AX
MOV SS,[1000H]
MOV AX,DS
MOV [3020H],DS

2)堆栈操作指令

这里写图片描述

这里写图片描述

这里写图片描述

堆栈操作指令是用来完成压入和弹出堆栈操作的。

⑴ 压入堆栈指令PUSH(PUSH word onto stack)

指令格式:
PUSH src ;

指令功能:
先将栈顶指针SP减2// (SP) ←(SP)-2
再将源操作数src压入栈中// ((SP)+1:(SP)) ←(src)

⑵ 弹出堆栈指令POP(POP word off stack)

指令格式:
POP dst ;

指令功能:
先将栈顶存储单元内容弹出到操作数dst中// (dst) ←((SP)+1:(SP)),
再将堆栈指针SP加2// (SP) ←(SP)+2

寻址方式:
源操作数src可以是REG/MEM/SEG ,且必须是16位的操作数,但不能是立即数。

目的操作数dst,可以是REG/MEM/SEG(不能是CS) ,且必须是16位的操作数,但不能是立即数。

说明:
*堆栈按后进先出原则组织。
*堆栈操作以字为单位进行。
*目的操作数dst不可以是CS。
*指令中的操作数不能是立即数。
*堆栈指针为SS:SP,SP自动进行+2、-2操作、永远指向栈顶

对标志位的影响:
不影响

例:
PUSH [BX+DI]
PUSH AX
PUSH CS
POP [BX+SI+1020H]
POP BX
POP DS

例:已知(AX)=1020H,(BX)=3040H,分析下面程序段的执行过程。
1
PUSH AX
PUSH BX
POP AX
POP BX

2
PUSH AX
PUSH BX
POP BX
POP AX
这里写图片描述

3)交换指令XCHG (Exchange)

指令格式:XCHG dst , src

指令功能:
将源操作数和目的操作数进行交换 // dst <=> src

寻址方式:
src和dst均可为REG/MEM,

说明:
* 段寄存器的内容不能参加交换
*不能同时为存储器操作数
*至少有一个是寄存器操作数
*都不能是立即数

对状态位的影响:
不影响

例:

     XCHG BX,[BP+SI]
     XCHG DL,BL
     XCHG BX,CX
     XCHG [2000H],AH
     XCHG [2000H],BX

错误示例:

    XCHG AL,BX //操作数的类型要匹配
    XCHG [BX], [1000H] //不能同时为存储器操作数
    XCHG AX, SS //不能为段寄存器
    XCHG AL, 10H //不能为立即数
2,累加器专用指令

这类指令中的一个操作数必须是累加器。累加器操作数可以是8位的,也可以是16位的

1)输入/输出指令

输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令:一类是通过DX寄存器间接端口地址的输入/输出指令。

a, 输入指令
这里写图片描述
①直接寻址的输入指令

指令格式:
IN acc, port ; //port<=0FFH

指令功能:
从端口port中直接读取一个字节或一个字送到acc(AL或AX)中。//(acc) ←(port)

②间接寻址的输入指令

指令格式:
IN acc, DX ;

指令功能:
将DX中内容指定的端口地址中的一个字节或字送入acc(AL或AX)中 /
/(acc) ←( (DX) )

注:执行此指令前应将端口的16位地址放入DX中

b, 输出指令

这里写图片描述

①直接寻址的输出指令

指令格式:
OUT port, acc ; //port<=FFH

指令功能:
将acc(AL或AX)中的一个字节或字送到port指定的端口中,port<=FFH
//(port) ← (acc)

②间接寻址的输出指令

指令格式:
OUT DX, acc ;

指令功能:
将acc(AL或AX)中的一个字节或一个字送入DX中的内容指定的端口中
//((DX)) ← (acc)

2)字节转换指令XLAT(transLATe)

指令格式及操作:

XLAT src_table ;(AL) ←((BX)+(AL))

XLAT指令是用来将一种字节代码转换成另一种字节代码。常用该指令进行查表操作。
使用前先建立一个字节表格,表格的首址存入BX,要转换的代码(即相对于表格首址的位移量)放入AL,然后执行XLAT,在AL中得到转换以后的代码。

XLAT指令还可以有以下几种表示形式:
XLAT ;不写操作数
XLATB ;有B就不允许再写操作数。
XLAT ES:src_table ;重设段寄存器为ES

[例]在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,欲将十六进制

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值