分支预测会使我的程序崩溃吗?

2023-12-30

浏览这本书的第 3 章,称为计算机系统架构:程序员的视角 https://rads.stackoverflow.com/amzn/click/com/0136108040,据说像这样的实现

testl %eax, %eax
cmovne (%eax), %edx

是无效的,因为如果预测失败,那么我们将取消引用 NULL。它还指出我们应该使用分支代码。

不过,使用条件跳转不会导致相同的结果吗?例如:

.L1:
jmp *%eax

testl %eax, %eax
jne .L1

是否有可能欺骗 gcc 为 x86-32 输出类似的内容?假设我有一个指向函数的指针数组,其中有些是有效的,有些是无效的,并且我调用每个不为 NULL 的指针。


不。您不应该能够检测到乱序操作数获取jmp指令,如果它是推测执行的一部分,并且由于测试和跳转而被证明是无效的。

The cmove__指令是如果内存访问操作数会导致故障,则精确记录以导致故障 http://www.rcollins.org/p6/opcodes/CMOV.html,即使条件不满足。换句话说,这不是推测执行。它是指令语义的一部分。这是move到有条件的目的地,而不是获取。

The jmp指令没有如此记录。

我不明白你的示例代码的意义,因为内存操作没有条件*%eax. If %eax包含零,当然是无条件执行中的获取jmp *%eax会引起故障。这是正确的行为。如果你测试%eax并跳过错误的参考。

testl %eax, %eax
je .L1
jmp *%eax
.L1:

不可能有问题。推测执行*%eax除非推测被证明是有效的,即真正的控制路径,否则不会导致故障。这类似于错误操作码、除以零等的行为:正常的程序语义不受推测执行的影响。

真正无序获取和存储的地方do导致各种有趣问题的原因在于多处理。本文及其上一期的第一部分 http://www.linuxjournal.com/article/8212?page=0,0关于这个话题的讨论很精彩。

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

分支预测会使我的程序崩溃吗? 的相关文章

  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何在程序中将自己缝合到自己的尾部,无限循环地封装 64KB 代码段?

    如果指令的顺序执行经过偏移量 65535 则8086将从同一代码段中的偏移量 0 处获取下一个指令字节 接下来的 COM 程序利用这一事实 不断将其整个代码 总共 32 个字节 缝合到自己的尾部 环绕在 64KB 代码段中 你可以称之为二元
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 缓存一致性是否始终可以防止读取过时的值?失效队列允许吗?

    在 MESI 协议中 仅当将缓存行保持在独占 修改状态时才写入缓存行 要获取独占状态 您可以向持有同一高速缓存行的所有核心发送无效请求 但是是否存在一种微架构 其中某些内核会在实际使缓存线无效之前做出确认响应 如果确实如此 那不是违反了缓存
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 我们可以拥有一台只用寄存器作为内存的计算机吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 寄存器是计算机中最快的存储器 那么如果我们想构建一台只有寄存器甚至没有缓存的计算机 可能吗 我什至考虑用寄存器代替磁盘 尽管它们本质上是易
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 分支预测器和分支目标缓冲区如何共存?

    我的问题是它们如何在现代 CPU 架构中共存并协同工作 你把它稍微颠倒了 每次获取时 您都会索引到分支预测器 它会告诉您刚刚收到的指令是否will be解码为已采取的分支 如果没有 则获取下一个连续地址 但是 如果您的分支预测器说它将是一个
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v

随机推荐

  • 将 gitlab wiki 镜像到 github

    我们正在私有 GitLab 服务器上开发一个软件 外部没有人可以访问此服务器 现在我们必须以某种方式让我们的软件可供所有人使用 我们的想法是将存储库镜像到 GitHub 根据我们所做的一些研究 这应该是可能的 我们还在 GitLab 中维护
  • 如何将多维数组分配给临时变量?

    我想将静态分配的多维数组分配给临时变量 考虑以下示例 void foo int b 3 2 b 1 1 1 no segmentation fault int main int a 3 2 1 2 11 12 21 22 foo a int
  • Rails 应用程序在 Heroku 上失败:(没有路线匹配 [GET]“/”)

    Rails 和 Heroku 的新手 我正在尝试按照以下中的分步说明部署一个简单的应用程序导轨教程 http ruby railstutorial org ruby on rails tutorial book sec heroku ste
  • 使用 jQuery Deferred 进行错误处理和恢复

    我正在使用 jQuery 并且知道这个问题是因为 jQuery Deferred 实现不符合 Promises A 标准 我不想使用任何其他库来解决这个问题 有了这个 有没有办法从 Deferred fail 回调使我返回到成功链 这可以通
  • QWebInspector 无法正常工作

    我已将 QWebInspector 包含在我的 QT 项目中 并尝试在我的代码中使用它 不完全确定如何使用 因为我对 QT 还很陌生 我得到一个空白的 Web Inspector 屏幕 所以我认为 page 返回 null 我哪里出错了还是
  • 替换特殊字符(破折号)

    我试图用以下方法替换我认为的标准破折号gsub 我正在测试的代码是 gsub ABC reported estimate 但这没有任何作用 我将破折号复制并粘贴到http unicodelookup com 1 http unicodelo
  • Express:提供预压缩的静态资源

    我想预压缩我的静态资产 不包括图像 并为它们提供服务 服务于public文件夹 我有 app use express static path to public 我相信express compress 动态压缩 这似乎对静态资源的服务器 C
  • 数据表列中的逗号和 $

    我有一个包含 4 列的数据表 其中包含货币 目前 我将它们视为普通列 并手动将 附加到每个值 现在我需要将列格式化为包含逗号 有没有插件可以做到这一点 我还想删除手动添加 值 我检查了几个网站 但我真的不明白它们是如何工作的 更新答案以使用
  • 如何向 R 中的 data.frame 添加文档?

    我已经使用 R 一段时间了 我意识到如果您可以附加 data frame 中包含的描述数据 将会有很大帮助 因为您可以在 Rdata 文件中收集所有有用的研究信息 我想添加到我的数据帧信息 就像 iris 显示的信息 描述 iris 数据帧
  • 如何使用 OpenAPI-3.0 表达 JSON-API 稀疏字段集

    我正在为我的 API 实现 OpenAPI 3 0 规范 并且我计划使用稀疏字段集 https jsonapi org format fetching sparse fieldsets作为 GET 的参数 的例子参数 https githu
  • 如何在 Android 中更改 ProgressDialog Spinner 颜色? [复制]

    这个问题在这里已经有答案了 我正在尝试添加自定义的ProgressDialog to my Activity 我成功更改了ProgressDialog字体和背景颜色 但我不知道如何在不使用小部件的情况下更改微调器颜色 谁能帮我 这是我的Ac
  • 是否可以让 Ingress 指向另一个命名空间中的服务?

    我想做的是在default我的其他命名空间中的命名空间和入口指向该服务 我尝试实现如下所示的服务和 Ingress 但没有成功 kind Service apiVersion v1 metadata name serviceX namesp
  • deviceready 处理程序未被调用 ios PhoneGap 3.3.3

    索引 html Phonegap 3 3 3 设备就绪处理程序未被调用 确保您已在 html 中包含phonegap js 或co
  • 为什么类成员的名称不能与其嵌套类之一相同?

    或者为什么以下是不可能的 class Material class Keys Material Keys Keys get set Illegal 我没有看到任何可能的歧义 当被实例访问时 返回该属性 静态访问时 返回类 或者我错过了什么
  • 红宝石中的位敲击

    我想创建一个位 其中包含给定用户的安全权限 在 C 中 我会通过创建一个枚举来完成此操作 然后我会对二进制值进行一些操作 通过与 来查看它是否会产生 TRUE 值 我怎样才能在 Ruby 中做到最好 如果底层值很重要 那么您可以创建一个像枚
  • 作业:使用指针创建数组

    我有一个家庭作业问题正在解决 我和其他一些学生很确定我们的老师说错了 但也许没有 我已经检查了这里的一些问题 并且无法真正找到一种使用指针来创建本质上是数组的方法 说明如下 重写以下程序以使用指针而不是数组 代码是这样的 int main
  • macOS 文档图标模板? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 下面最初的问题已经被时间所取代 现在 您不再需要为文档提供图标或图标集 因为 macOS 将从您的应用
  • 如何使 WordPress 永久链接忽略自定义 url 重写

    我目前正在开发一个 WordPress 网站 该网站需要提供法语版本 当我添加查询字符串变量时 我找到了一种使主题与 fr FR po 和 mo 文件一起使用的方法l i e site tld将产生普通的英语网站 而site tld l f
  • .NET 4 无法安装,因为 SECUREREPAIR 无法 CreateContentHash 文件 SetupResources.dll:用于计算哈希错误:997

    我在 Windows 7 x64 计算机上安装任何 NET Framework 时遇到问题 我不断收到以下日志文 件 这可能是什么原因造成的 OS Version 6 1 7601 Platform 2 Service Pack 1 OS
  • 分支预测会使我的程序崩溃吗?

    浏览这本书的第 3 章 称为计算机系统架构 程序员的视角 https rads stackoverflow com amzn click com 0136108040 据说像这样的实现 testl eax eax cmovne eax ed