【微机原理】8088/8086的寻址方式

news2024/11/16 21:44:54

目录

一.指令的组成

二.操作数的寻址方式

 1.立即数寻址

2.寄存器寻址方式

3.存储器寻址方式

(1)直接寻址

(2)寄存器间接寻址

(3)寄存器相对寻址方式

(4)基址变址寻址方式(根据基址寄存器判断使用DS还是SS)

(5)相对基址变址寻址方式(根据基址寄存器判断使用DS还是SS)

四、I/O端口寻址

直接端口寻址:

间接端口寻址:


一.指令的组成

  汇编语言指令操作码和操作数两部分组成

  操作码说明指令的功能。即计算机要执行的具体操作,如传送、运算、移位等,它是指令中不可缺少的组成部分。

  操作数是指令执行的参与者。即各种操作的对象,有些指令不需要操作数(零地址),有些指令有一个(单地址)或两个操作数(双地址),只有一个操作数的为单操作数,有两个操作数的为双操作数,中间用逗号隔开逗号左侧的操作数为目的操作数,逗号右侧的操作数为源操作数

 

指令格式:

操作码

目的操作数(dst)

源操作数(src)

 

二.操作数的寻址方式

  要执行指令,就要找到指令中的操作数,有的操作数直接出现在指令中,有的操作数存放在CPU的寄存器中,用寄存器的名称指示,有的操作数存放在主存中,用主存的地址指示,所以,要找到指令中的操作数,就要找到存放操作数的地址,寻找指令中的操作地址的方式叫寻址方式

寻址方式的种类:立即数寻址方式、寄存器寻址方式、存储器寻址方式

 1.立即数寻址

(1)概述

  操作数是以字节(或字)的形式紧跟在指令操作码之后,作为指令的一部分,与操作码一起存放在存储器的代码段(CS中。执行时和指令一起被取出到指令队列中,必须执行寻找操作数的总线周期,所以这种寻址执行速度较快。立即寻址方式常用与CPU中的CPU中的寄存器或存储单元赋值。立即数只能用作源操作数(逗号的后面),不能作为目的操作数

立即数可以是无符号或带符号数,其数值应在可取值范围内

操作数作为指令的一部分存放在操作码之后的主存单元中

(2)占用内存

MOV AL,5  

MOV占用一个字节,AL是CPU中的寄存器,在内存空间不占单元,后面的5占用一个空间,这条指令占了2个字节(16位=1个字)

(3)举例:

立即数的类型(字节、字)由前面寄存器(8位、16位)的长度来决定

字符用的是它的ASCII码值带H是16进制

MOV AL,50

AL = 50 字节= 32H

 将立即数32H送8位寄存器AL

MOV AX,50

AX = 50字

MOV BX,1234H

BX = 1234H

将16位立即数1234H送16位寄存器AX

MOV DL,'A'

DL = 41H

MOV DX,'A'

DX = 41H

MOV DX,'AB'

DX = 4142H

2.寄存器寻址方式

  操作数存放在CPU的寄存器中,寄存器可以是16位,也可以是8位寄存器。这种寻址方式的操作数就存放在CPU的内部的寄存器中,不用执行寻找操作数的总线周期,执行速度最快

3.存储器寻址方式

EA:有效地址(就是前面说的偏移地址)

PA:物理地址

  存储器的寻址的操作数存放在存储器中,是除代码段之外的数据段、附加段和堆栈段中的数据(内存数据),在这种寻址方式中,指令给出的是存放该操作数的存储单元的地址或产生该存储单元地址的表达式。CPU执行指令时,首先根据操作数字段提供的地址信息由执行单元(EU)计算出有效地址(EA),有效地址是一个无符号的16位二进制数,再由总线接口单元(BIU)根据物理地址公式:

“PA = 段首地址 * 10H + 有效地址”计算出物理地址,然后到物理地址对应的内存单元取出操作数,执行对该数的操作。                                                                                                                                                                              

 存储器寻址方式根据计算有效地址EA方法的不同分为以下5种:

都要用到【】,里面的内容就是有效地址。

(1)直接寻址

  这种寻址方式是从存储器种寻找操作数最简单的一种,指令中直接给出的是该操作数在存储器中的有效地址(EA)。默认的段地址DS,可用段超越前缀改变。

其物理地址为:

  PA = 段首地址 * 10H + EA(段首地址默认使用DS段寄存器)

例如:

  MOV AX,[2000H]

指令中有效地址EA为2000H,设存储单元的内容为1234H,则指令将1234H传送到AX中。

若操作数默认在数据段,若操作数没在数据段,则应在指令中使用段超越前缀,指明使用的数据在哪一个段。

  MOV AX,ES:【2000H】

将该指令的物理地址为 PA = ES * 10H + 2000H的存储单元的值送AX。

(2)寄存器间接寻址

  操作数的有效地址由指令中指定的寄存器BXBPSIDI的内容确定,这种寻址方式可分为下面两种情况,也可以使用段超越前缀改变。

只有SIDIBXBP可作为间址寄存器

例:MOV AX,【BX】

设DS = 2000H,EA = BX = 1000H,则源操作数的物理地址为:
  PA =  2000H * 10H + 1000H = 21000H

这条指令执行的结果是把内存单元21000H中的数据传送AX寄存器中

(3)寄存器相对寻址方式

  这种寻址方式的操作数存放在存储器的内存单元中,是以基址寄存器(BXBP)变址寄存器(SIDI)的内容为基地址,然后在这个地址的基础上加上8位或16位的位移量Disp,形成真正操作数的有效地址EA可用段超越前缀改变

当寄存器为BXSIDI时,用段寄存器DS的内容作为段基地址,则

有效地址EA = BX/SI/DI + Disp8/Disp16

物理地址PA = DS * 10H + EA

 

当寄存器为BP,则段寄存器SS的内容作为段首地址,则

有效地址EA = BP + Disp8/Disp16

物理地址PA = SS * 10H + EA

例: MOV DI,【BX + 2】;或写成 MOV DI,2【BX】

例如:已知DS = 1000H,SS = 1000H,SI = 3000H,BP = 2000H,(12006H) = 9678H,(13006H) = 1234H,执行指令后,求AX = ?

MOV AX,【BP + 6】

  • EA = BP + 6 =  2000H + 6 = 2006H
  • PA = SS * 16 + EA = 12006H
  • AX = 9768H

MOV AX,06H【SI】

  • EA = SI + 06 = 3000H + 6 = 3006H
  • PA = DS * 16 + EA = 13006H
  • AX = 1234H

(4)基址变址寻址方式(根据基址寄存器判断使用DS还是SS)

  操作数存放在内存单元中,偏移地址是基址寄存器的内容加上变址寄存器的内容之和,若基址寄存器为BX,则断寄存器为DS,若基址寄存器为BP,则段寄存器为SS如果两个基址或者两个变址相加则错误,基址变址寄存器分别只能用一个

有效地址:EA = BX/BP + SI/DI

物理地址:PA = DS * 10H + EA 或 SS * 10H + EA

例:MOV DS,【BP】【SI】

例如:已知DS = 1000H,SS = 2000H,SI = 6,BX = 2000H,BP = 1000H,(12006H) = 9678H,(21006H) = 1234H,(11006H) = 89ABH,执行指令后,求AX = ?

MOV AX,【BX + SI】

  • EA = BX + SI = 2006H
  • PA = DS * 16 + EA = 12006H
  • AX = (12006H) = 9678H

MOV AX,【BP + SI】

  • EA = BP + SI = 1006H
  • PA = SS * 16H + EA = 21006H
  • AX = (21006H) = 1234H

(5)相对基址变址寻址方式(根据基址寄存器判断使用DS还是SS)

  操作数存放在内存单元中,其有效地址由指令指定的基址寄存器加变址寄存器的内容在加上指令的8位或者16位偏移量Disp得到。(BX默认是DS,BP默认是SS)

物理地址 PA = DS * 10H + EA(BX + SI/DI + Disp)

      或 PA = SS * 10H + EA(BP+ SI/DI + Disp)

例如:已知DS = 1000H,DI = 1000H,BX = 1000H,(12006H) = 5678H,执行指令后,AX = ?

MOV AX,【BX + DI + 6】 == MOV AX,6【BX + DI】 == MOV AX,6【BX】【DI】

四、I/O端口寻址

寻找输入输出设备的端口地址,可分为直接端口寻址和间接端口寻址。

直接端口寻址:

由指令直接给出I/O设备的端口地址。它规定的端口地址为8位,能寻址256个端口。

例如:IN AL,20H   ;将地址为20H的外设内容读入AL中

间接端口寻址:

由DX给出I/O设备的端口地址。由于DX是16位,因此间接端口寻址能寻址多达64K个端口。

例如:OUT DX,AL  ;AL中的内容输出给以DX的内容为地址的外设

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于zookeeper实现分布式锁

目录 zookeeper知识点复习 相关概念 java客户端操作 实现思路分析 基本实现 初始化链接 代码落地 优化:性能优化 实现阻塞锁 监听实现阻塞锁 优化:可重入锁 zk分布式锁小结 zookeeper知识点复习 Zookeeper(业界简称zk&#xff…

【Linux】多路转接--select、poll、epoll,非阻塞等待

1.IO的概念 IO等拷贝数据 等&#xff1a;发送缓冲区满了或者接受缓冲区没有数据&#xff0c;就需要等待 高效IO就是&#xff1a;减少单位时间内,"等"的比重 2. 阻塞IO和非阻塞IO 2.1.阻塞IO 阻塞等待会在read的地方等待 #include <iostream> #include &l…

JavaScript实现输入数字,输出是几月份的代码

以下为实现输入数字&#xff0c;输出是几月份的代码和运行截图 目录 前言 一、实现输入数字&#xff0c;输出是几月份的 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本…

1699_simulink代码生成配置初级方案

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

数据库篇:初始化、建表、配置及调用

微信小程序云开发实战-答题积分赛小程序 数据库篇:初始化、建表、配置及调用 开通云开发服务 点击【云开发】,开通云开发服务; 开通服务完成后,方可继续往下操作; 题库数据表初始化 创建数据表 点击【数据库】,然后点击【+】创建数据表;

彻底告别手动配置任务,魔改xxl-job!

分析 改造 1、接口调用 2、创建新注解 3、自动注册核心 4、自动装配 测试 测试后 XXL-Job是一款非常优秀的任务调度中间件&#xff0c;其轻量级、使用简单、支持分布式等优点&#xff0c;被广泛应用在我们的项目中&#xff0c;解决了不少定时任务的调度问题。不仅如此&a…

RabbitMQ 简单模型

MQ引言 1.1 什么是MQ ​ MQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c;没有业务逻辑的侵…

chatGPT+Midjourney制作绘画本

chatGPTMidjourney制作绘画本 灵感来源&#xff1a;https://www.bilibili.com/video/BV1N24y1F7ga/?spm_id_from888.80997.embed_other.whitelist&vd_source6dd97671c42eb7cf111063714216bd0b 最终效果&#xff1a; 绘本故事 故事塑造能力弱的人可以使用chatGPT来帮助编…

wait/waitpid函数等待子进程状态发生改变

&#x1f38a;【进程通信与并发】专题正在持续更新中&#xff0c;进程&#xff0c;线程&#xff0c;IPC&#xff0c;线程池等的创建原理与运用✨&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列…

【自看】2023前端面试上岸手册——VUE部分

目录 Vue 的基本原理双向数据绑定的原理MVVM、MVC、MVP 的区别slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f;\$nextTick 原理及作用Vue 单页应用与多页应用的区别Vue 中封装的数组方法有哪些&#xff0c;其如何实现页面更新Vue data 中某一个属性的值发…

商品管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87738976 更多系统资源库地…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-匝道跟车基础功能

书接上回 2.3.3匝道辅助驾驶 匝道辅助驾驶功能根据导航引导在ODD范围内辅助驾驶车辆进出匝道,主动变道并入或开出主路,并可根据导航路线引导车辆通过跨高速连接路。 前置条件: 1)驾驶员设置导航目的地及导航路线 2)开启辅助驾驶功能,系统进入NOA功能 2.3.3.1.上下匝道…

如何设计一个可扩展的优惠券功能

本文主要分享了如何设计一个可扩展的优惠券功能。 一、功能特性介绍 1.每个条件的代码独立&#xff0c;相当于单独的实现类实现接口&#xff0c;就能通过配置添加到优惠券条件校验当中&#xff0c;支持多种条件灵活组合 2.新增一种使用条件可以不修改核心流程代码&#xff0…

Angular 与PDF之二:打印预览的实现

如何在angular中实现打印和预览pdf的功能, 使用print.js这个包就可实现这个功能 Print.js介绍 Print.js可以打印pdf文件&#xff0c;html元素&#xff0c;图片。官网 https://printjs.crabbly.com/ Print.js使用 首先新建一个angular项目&#xff0c;在项目里下载print.js n…

[JS每M日N练] [格物] - 你所不知道的toString

文章目录 导读Object.prototype.toString常见类型转换结果Object.toString ! Object.prototype.toString对Object.prototype.toString.call(obj)的理解 .toString.toString TypeError误区tostring被改写了定义在原型链的什么位置上方法重写 文章小结参考资料 导读 开发过程中经…

同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战

文章目录 一、现象二、问题排查三、结论四、解决方案 一、现象 使用 nacos 作注册中心的线上 dubbo 消费端应用每隔 1 分钟就会抛出以下异常&#xff08;为使描述简单化&#xff0c;文章中使用本地 demo 来复现&#xff09;&#xff0c;该异常表示无法连接到 172.17.0.1:20881…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符&#xff0c;也叫 URL地址 。是用于标识和定位Web上资源的地址&#xff0c;通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成&#xff0c;scheme:// host : port / path 例如&#xff1a; htt…

Contest3111 - 计科2101~2104算法设计与分析上机作业07

问题 A: 有重复元素的排列问题 题目描述 设R{ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法&#xff0c; 列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。 输入 第1 行是元素个…

android四大组件之一-Activity实现原理分析

前言&#xff1a; 这篇文章是我花费时间最久的一篇文章&#xff0c;整整的两个月。整个流程繁琐是一个方面的原因&#xff0c;另外一个原因是我想尽可能的把整个流程的逻辑尽可能详细的一一描述出来&#xff0c;以及结合到我们项目中遇到的一些问题来进行解释&#xff0c;毕竟…

【五一创作】VS+Qt主界面内嵌自定义控件的四种方法以及不同自定义控件数据交互

前言 在Qt界面开发过程中&#xff0c;一个主界面或者主窗口看成是各个控件排列组合后的集合&#xff0c;对于一些项目而言&#xff0c;有些常用的控件可以封装成自己想要的控件样式并且复用&#xff0c;比如说&#xff0c;log显示控件&#xff0c;图像/视频显示控件等&#xf…