寄存器寻址模式与直接寻址模式

2024-05-09

我在试卷中遇到过这个问题。它指出, 哪种给定的寻址模式更快?为什么?

  1. 寄存器寻址方式
  2. 直接寻址方式

现在根据我的说法,寄存器寻址模式应该更快,因为寄存器是计算机中最快的存储位置。这是正确答案吗?

请帮忙。谢谢


两种寻址模式之间的区别是...地址的来源...对于直接寻址模式,要访问的项目的地址是指令中编码的立即数,因此指令更大,在某些情况下更大因此它需要更多的时钟周期来访问,理想情况下它位于高速缓存中,因为它是紧随操作码之后的字节,并且操作码的获取通常会导致至少在其后面的高速缓存行被获取,除了最旧的 x86 平台之外的任何平台我不知道如果没有指令的其余部分以及已经提取并在管道中的接下来的几个/许多指令,您将如何到达正在执行指令的位置。即使是旧的 x86 处理器也有一定大小的预取队列。

寄存器寻址意味着正在访问的项目的地址位于寄存器中。假设地址已经存在,那么这会更快,因为您不会产生更大的指令、额外的周期、为指令烧毁更多的高速缓存行。必须小心这个参数的地方是,例如之前的指令将立即地址加载到寄存器中。

mov ax,[1000h]


mov ax,[bx]

由于指令大小以及额外的缓存烧毁和周期占用,第二个比第一个更快(对于可以在这个级别进行比较的东西)。

BUT

mov ax,[1000h]


mov bx,1000h    
mov ax,[bx]

直接寻址速度更快,因为总体而言,获取和执行所需的周期更少(对于可以比较的事物)。

我所说的可比较的事物是什么意思?寻址模式与地址的来源有关。一旦你开始执行该指令并执行一个内存周期,那么两者就相等,它是总线上的地址,要比较两条指令,数据大小是相同的。很可能的情况是,对于某些测试程序来说,直接寻址更快,仅仅是因为对于该测试程序来说,数据总是在数据高速缓存中,而对于该测试程序来说,寄存器寻址版本不是或有时不是。因此,两条指令之间可以比较的是指令的大小,这导致了它烧毁的周期和缓存行。一个高速缓存行可以容纳许多基于寄存器的指令,但只能容纳一些基于直接/立即的指令,因此通过使用直接/立即,您会产生机会成本,并在执行程序时总体上产生更多的内存周期。是的,许多这样的周期在任何遥远现代的事物上都是并行的。

因此,这些类型的问题与您是否理解指令集有关,​​并且取决于您返回的详细程度,以及您是否了解超出实际成本的内容。同样,如果没有经验,简单地尝试实验可能会失败或没有显示出任何差异,因为您必须围绕缓存精心设计实验。

我强烈推荐 Michael Abrash 的《The Zen of Assembly Language》一书

不是一本不完整的黑色大图形编程书附带的免费书。你可以买一本状态良好的二手书(买了第二本,它比我在商店买的原版好,一直放在书架上)。关于8088和8086的细节在本书印刷时已经过时了,这不是这本书的重要性,重要的是了解如何解决问题,如何思考问题并初步了解什么是问题正在幕后进行。今天它要复杂得多,仍然可以理解,但我建议先从这样的基础开始,然后再进入您今天看到的内容。特别是 x86(当您开始研究总线和缓存等时,我强烈建议先学习一些东西,除了 x86 之外的任何东西)。http://github.com/dwelch67/amber_samples http://github.com/dwelch67/amber_samples。我已经使用开源工具清理并提供了 amber 处理器(arm2 克隆),以便您可以看到处理器内运行的内容。琥珀的一种版本有缓存。再次强调,添加 mmus 和多核等只会增加复杂性。

超简短的答案,当仅将两条指令相互比较时,直接寻址使用比寄存器寻址更长的指令和更多的周期进行编码。内存副作用、缓存等可能会混淆或抵消差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寄存器寻址模式与直接寻址模式 的相关文章

随机推荐

  • 你能克隆一个闭包吗?

    A FnMut由于显而易见的原因 闭包无法被克隆 但是Fn闭包具有不可变的范围 有没有办法创建一个 重复 Fn关闭 尝试克隆它会导致 error E0599 no method named clone found for type std
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 找不到 RecyclerView 类 android.support.v7.recyclerview.R$styleable

    我在我的应用程序上使用 RecyclerView 但在运行时应用程序崩溃并且我的 logcat 读取 java lang RuntimeException Unable to start activity ComponentInfo com
  • 使用 Javascript 获取 Mobile Safari 中选定的文本

    因此 我正在开发一个小书签 对于我来说 使用 循环 获取用户选择的内容是理想的选择 window getSelection 和 document getSelection 都是我可以调用的函数 但是它们始终返回空字符串 我相信问题在于 当您
  • 为什么C++标准库中没有线程池? [复制]

    这个问题在这里已经有答案了 自 C 11 以来 C 中并行 并发编程工具的数量激增 线程 异步函数 并行算法 协程 但是流行的并行编程模式又如何呢 线程池 https en wikipedia org wiki Thread pool 据我
  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • 以编程方式启用/禁用广播接收器

    我们有一个可以扫描蓝牙设备的应用程序 负责扫描的代码应仅在启用蓝牙时运行 此外 我们希望随时禁用 启用此功能 我们选择实现一个注册BluetoothAdapter ACTION STATE CHANGED广播的BroadcastReceiv
  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • socket.io 服务器的 Node.js 客户端

    我有一个正在运行的 socket io 服务器和一个带有 socket io js 客户端的匹配网页 一切正常 但是 我想知道是否可以在另一台机器上运行一个单独的 node js 应用程序 该应用程序将充当客户端并连接到提到的 socket
  • Python Tornado 中的异常处理

    我正在尝试处理发生的异常AsyncClient fetch这样 from tornado httpclient import AsyncHTTPClient from tornado httpclient import HTTPReques
  • 如何将 Angular 材质拖放与虚拟滚动集成?

    我正在尝试将 Angular 材质的虚拟滚动与拖放集成在一起 但由于某种原因 当我尝试实现此功能时 它会恢复项目 而当我尝试拖放元素时 它不起作用 这是代码摘要
  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • 如何使用纯 CSS 始终使灵活的正方形在视口中居中?

    我知道这个问题 高度等于动态宽度 CSS 流体布局 https stackoverflow com questions 5445491 height equal to dynamic width css fluid layout 但我想要更
  • BOOST:递归shared_mutex?

    似乎Boost的shared mutex是非递归的 有没有解决这个问题的方法 无需重新实现整个内容 看一下这个线程 https stackoverflow com questions 4659295 why c0x standard com
  • Sqlite 删除速度极其慢 - 如何加快速度?

    我读到删除操作很慢 我想知道如何改进此检查 我有一个每天填充 10 15k 行的表 每次启动时我都需要清理所有超过 6 个月的记录 但是当数据库增长时 我开始遇到速度问题 当我运行此命令时 有接近 100 万条记录 即使我没有任何内容要删除
  • 卡片视图工具栏

    我有一个包含 CardView 的 RecyclerView 我想向每个 CardView 添加一个工具栏 其外观和行为类似于主工具栏 图标 标题 按钮 按钮 菜单 我从这里看到了 http blog grafixartist com cr
  • iPhone 6 隐藏在键盘下方的自动校正

    自动修正UITextview在 Iphone5s 中工作正常 但在 iPhone 6 中它被隐藏在键盘后面 在 iPhone 5s 中按预期工作 但不适用于 iphone 6 有什么办法可以解决 iPhone 6 上的这个问题吗 不 去物业
  • 如何使用 Scala 在 Spark 中漂亮地打印 JSON 数据帧?

    我有一个数据帧 我想将其作为有效的 json 写入 json 文件 我当前的代码如下所示 val df DataFrame myFun df toJSON saveAsTextFile myFile json 输出的格式为 如何将文件内容组
  • 网站首次访问时启动时间异常长(总共长达 68 秒)

    我有一个 ASP Net 应用程序 第一次访问时启动时间异常长 我做了一些跟踪 发现这个函数花费了 57 秒 Boolean System Web Compilation WebDirectoryBatchCompiler CompileN
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源