第一章 计算机硬件基础(寻址方式)

2024-03-15 21:04

本文主要是介绍第一章 计算机硬件基础(寻址方式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序运行时用到的数据绝大部分存放在内存中,如何寻找内存中的数据就是存储器寻址方式。操作数在存储器中,操作数的有效地址EA在指令中,段地址在默认的或段超越前缀指定的段寄存器中。
例如:内存好比一栋大学宿舍楼,每个宿舍都住着人。
寻址的目的是找到数据,(通俗理解为你需要你去宿舍楼喊人)

1、立即寻址方式

指令中在操作码字段后面的部分不是通常意义上的操作数地址,而是操作数本身。地址码就是操作数,这样的寻址方式不必再次访问主存去取操作数,当然也无须改动操作数。立即寻址是获取操作数最快的方式。

操作数包含在指令中,紧跟着操作码并与操作码一起存放在代码段中,与代码一起被取入CPU的指令队列,指令执行时不需要再访问存储器。
立即寻址中的操作数可以是计算机有效数制下的数值,也可以是带单引号的字符。
例如: MOV      AX,3102H ;
            MOV       AL,‘A’ ;

 形式地址A就是操作数

指令执行阶段不访存

A的位数限制了立即数的范围

2、直接寻址方式

指令的地址码就是操作数在主存内的地址,也就是说地址码就是主存内数据的绝对地址,不必做不论什么换算,只要按照地址码去主存中找,但这样的地址方式的不足之处在于寻址范围有限(只在一个存储器中)。

在指令中直接给出操作数所在单元的位移地址,具体有两种形式。
(1) MOV   AX,[2050H] ;解释:默认的段寄存器为DS,AX←[DS×16+2050H]
位移地址通常以变量的形式出现,在指令中就直接写变量的名字
(2) MOV   SI , BUF; 解释:BUF为一变量,AX←[DS×16+BUF]
默认的段寄存器为DS,但也可以显式地指定其他段寄存器。称为“段超越”前缀。
例如:
MOV    DX,ES:[2050H];使用段超越;DX←[ES×16+2050H]

EA=A(有效地址由形式地址直接给出)

A 的位数决定了该指令操作数的寻址范围

操作数的地址不易修改(必须修改A)

3、间接寻址方式

在指令的地址码部分直接给出的既不是操作数(直接给出操作数的是立即寻址),也不是操作数的地址(直接给出操作数地址的是直接寻址),而是操作数的地址的地址

这样的方式提高了寻址的灵活性。扩大了寻址的范围。可是因为多次访问主存。速度大为减少。

EA=(A)

执行指令阶段2次访存

可扩大寻址范围

便于编制程序

4、寄存器(直接)寻址方式

地址码的地址不是操作数或地址,而是通用寄存器的编号,操作数在指定编号的寄存器里。(可以是8位也可以是16位(AX,BX,CX,DX)),寄存器中存着操作数,如:MOV DS,AX。访问寄存器的速度是很快的,所以使用寄存器寻址有很快的速度。(不足之处在于寄存器的数量有限)

EA=Ri,有效地址即为寄存器编号

执行阶段不访存,之访问寄存器,执行速度快

寄存器个数有限,可缩短指令字长

5、寄存器间接寻址方式

寄存器间接寻址也是指定寄存器编号,但是寄存器内存放的并不是操作数,而是操作数的有效地址。有效地址在寄存器中,操作数在存储器中,执行阶段访存,但访存比间接寻址少一次,便于编制循环程序(这是与寄存器寻址的区别)。这样既快又有灵活性,是一种广泛使用的寻址方式。

EA=(Ri)

有效地址在寄存器中,操作数在存储器中,执行阶段访存。

便于编制循环程序。

6、相对寻址方式

相对寻址和变址寻址类似,这里变址寄存器变成了程序计数器,也就是在相对寻址中是将地址码和程序计数器内容相加后形成的数据地址。

相对寻址最大的特点就是转移地址不固定,他随PC值的变化而变化,因此,无论主程序在哪段区域,都可正常运行,对编写浮动程序特别有利。

 A的位数决定操作数的寻址范围

程序浮动

广泛用于转移指令

7、基址寻址方式

基址寻址需要有基址寄存器BR,操作数的有效地址等于形式地址加上基址寄存器中的内容(基地址)。基址寻址中的BR由系统或者管理程序根据主存的使用情况分配初始值,便可将用户程序的逻辑地址转化为主存的物理地址(实际地址)。

基址寄存器分为隐式和显式。隐式是指计算机内设有一个专门的,用户不必明显指出该基址寄存器,只需由寻址特征位反应基址寻址就可以。而显式是在一组通用寄存器内由用户指定一个基址寄存器存放基地址。

基址寻址的优点是可以扩大寻址能力,因为与形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。

(1)采用专用寄存器作基址寄存器    

  EA=(BR)+A  ,BR为基址存储器

可扩大寻址范围

有利于多道程序

BR内容由操作系统或管理程序确定

在程序的执行过程中BR内容不变,形式地址A可变

(2)采用通用寄存器作基址寄存器

 由用户指定哪个通用寄存器作为基址寄存器

基址寄存器的内容由操作系统确定

在程序的执行过程中R0内容不变,形式地址A可变

8、变址寻址方式

是将地址码和变址寄存器内容相加后形成的操作数有效地址,对数组运算、字符串操作等批量数据的处理很有效。

基址寻址主要用于为程序或数据分配内存空间,故基址寄存器的内容通常由操作系统或管理程序确定,在程序的执行过程中其值是不可变的,而指令字中的形式地址A是可变的,在变址寻址中,变址寄存器的内容是用户设定的,在程序执行过程中其值可变,而指令字中的A是不可变的。

变址寻址主要用于处理数组问题,在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器的IX内的内容,便可以得到数组中任一数据中的地址,特别适合编制循环程序。

 EA=(IX)+A,IX为变址寄存器(专用),通用寄存器也可以作为变址寄存器

可扩大寻址范围

IX的内容由用户给定

在程序的执行过程中IX内容可变,形式地址A不变

便于处理数组问题

这篇关于第一章 计算机硬件基础(寻址方式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813257

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程