博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微机原理之 80X86指令系统
阅读量:5057 次
发布时间:2019-06-12

本文共 3058 字,大约阅读时间需要 10 分钟。

计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用,这组指令集就称为计算机的指令系统。

主要内容:

1、8086/8088指令格式
2、8086/8088指令系统的寻址方式
3、8086/8088指令系统

重点:

- 8086指令格式和寻址方式(也是考点)
- 数据传送、算术运算、位操作、串操作、控制转移以及处理器控制等六大类指令

1. 8086指令格式

  计算机是通过执行指令来处理各种数据的,因此,一条指令即要指出如何处理数据,同时还应指出数据的来源、操作结果的去向。一般来说指令是由操作码、寻址方,操作数组成。

1.1操作数的分类:

  • 1.源操作数:只能读取的操作数。
  • 2.目的操作数:即可读取又可写入(存放操作结果)的操作数。

    ADD          AX   ,               BX操作码      目的操作数            源操作数

    还可以分为:

  • 1.数据操作数
  • 2.地址操作数

1.1.1 数据操作数

  这类操作数是与数据有关的操作数,即指令中要操作的对象是数据。数据操作数又可分为立即数操作数、寄存器操作数、存储器操作数和I/O操作数。

立即数操作数: 指令中要操作的数据在指令中     寄存器操作数: 指令中要操作的数据存放在指定的寄存器中。    存储器操作数: 指令中要操作的数据存放在指定的存储器中。    I/O操作数  : 指令中要操作的数据来自或送到I/O端口。

1.1.2 地址操作数

  这类操作数是与程序转移地址有关的操作数,即指令中要操作的对象不是数据,而是要转移的目的地址。

  地址操作数也可分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目的地址包含在指令中,或存放在寄存器中,或存放在存储器单元之中

2. 8086/8088的寻址方式(重点)

  所谓寻址方式就是寻找操作数存放地址(位置)的方法。在8086/8088系统中,操作数又可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。

2.1 数据寻址方式

1)立即数寻址方式

例如:MOV AL, 80H MOV AX, 1234H

  这里写图片描述

2)寄存器寻址方式

例如:MOV AX, CX

3)存储器寻址方式

  存储器寻址方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。

  指令中给出的地址只是操作数的有效地址(EA),若要从存储器中存取操作数还须得到实际的地址(物理地址)。物理地址=段基址左移四位+有效地址
   这里写图片描述
有效地址可以由以下三种地址分量组成:
● 位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。
● 基址(Base Address):它是存放在基址寄存器BX或BP中的内容。
● 变址(Index Addess):它是存放在变址寄存器SI或DI中的内容。
1. 直接寻址方式 : MOV AL, [1064] ( 段超越 ES:[1064H] )
2. 寄存器间接寻址 :MOV AX, [SI]
3. 寄存器相对寻址:MOV CL, [BX+1064H]
4. 基址加变址寻址方式
这里写图片描述
5. 基址加变址相对寻址:MOV [BX+DI+1234H], AH
这里写图片描述

I/O端口寻址方式

  1. 直接端口寻址方式:IN AL, 21H
  2. 间接端口寻址方式:OUT DX, AL

2.2 地址的寻址方式

  地址的寻址方式其实是程序转移地址的寻址方式,也就是找出程序转移的地址号,而不是操作数。

  转移地址可以在段内,也可以跨段转移(称段间转移)。寻求转移地址的方法有以下四种:
1. 段内直接寻址:
2. 段内间接寻址方式:
3. 段间直接寻址方式:
4. 段间间接寻址方式:

练习题:

指出下列指令中源操作数的寻址方式,若为储存器寻址方式,写出其逻辑地址:
1. mov bx,2000h 立即数寻址
2. mov bx,[si] 寄存器间接寻址
2. add ax, [bx+si+10h] 基址加变址相对寻址
3. mov ax, data 段内直接寻址(有疑问??)
3. in al,dx io端口间接寻址
4. mov bx, offset var

3.8086/8088指令系统

1.数据传送类指令

  实现CPU中的寄存器与存储器或I/O端口之间原始数据、中间结果、最终结果以及其他有关信息的传送。它可分为以下四组:

  • 通用数据传送指令:MOV PUSH POP XCHG XLAT
  • 输入输出指令:IN OUT
  • 地址传送指令:LEA LDS LES
  • 标志传送指令:LAHF SAHF PUSHF POPF

(一)通用数据传送指令

mov 指令push/pop  src  ; sp-2 ,16位操作数,但不能是立即数XCHG opr1,opr2 ; 可实现寄存器与寄存器之间,寄存器与存储器之间进行数据交换;                 注意段寄存器的内容不能参加交换!

(二) 输入/输出指令IN / OUT(直接与间接)

(三)目标地址传送指令

LEA  reg16,  mem

  此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数

2.算术运算类指令

  8086/8088的算术运算指令共20条,除符号扩展指令(CBW,CWD)外,其余指令都影响状态标志位。

CMP dst, src    (dst) - (src)  ;前减后
指令类型 指令格式 操作功能
AAA 非压缩型BCD码加法调整指令
十进制调整指令 DAA 压缩型BCD码加法调整指令
AAS 非压缩型BCD码减法调整指令
DAS 压缩型BCD码减法调整指令
AAM 非压缩型BCD码乘法调整指令
AAD 非压缩型BCD码除法调整指令

3.位操作指令

  1. 逻辑运算指令:

    AND  OR  NOT    XOR TEST
  2. 移位指令:

    SHL  SAL SHR SAR
  3. 循环移位指令:

    ROL ROR RCL RCR

    需要用到时查询该指令即可 !!!

4.字符串指令(略)

5.控制转移类指令(重点指令)

能够使程序的执行流程发生改变的指令。共有以下四类指令:

  1. 无条件转移 —JMP 转移地址
  2. 条件转移 —JCC 转移地址
  3. 循环—loop,loope,loopne等
  4. 子程序调用—call, ret

1. JMP 不用讲

2. 条件转移

⑴ 判断单个标志

ZF: JZ(JE), JNZ(JNE)        SF: JS, JNS        OF: JO, JNO        PF: JP, JNP        CF: JC, JNC

(2) 判断CX寄存器

JCXZ :  CX=0

3.循环

LOOP 循环

判断CX是否等于零,不等于零则循环

4. 子程序调用

  • CALL 子程序调用指令
    用法:CALL dst
    说明:由编译程序自动匹配为某种寻址方式
  • RET 子程序返回指令
    用法:RET

6. 处理器控制类指令(略)

转载于:https://www.cnblogs.com/Tattoo-Welkin/p/10335280.html

你可能感兴趣的文章
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
Kubernetes 运维学习笔记
查看>>
spring security 11种过滤器介绍
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>
一个样例看清楚JQuery子元素选择器children()和find()的差别
查看>>
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>