为什么条件移动不能正常工作

2023-12-31

在我编译下面的代码后,该功能似乎没有按预期工作。

int cread(int *xp){

     return (xp?*xp:0);

}

我提取了汇编版本中的对应部分,如下所示。

xp在寄存器中%edx

movl $0, %eax
testl  %edx, %edx
cmovne (%edx), %eax

谁能告诉我为什么指针xp仍然被取消引用cmovne即使测试失败?不是ZF set to 1 by testl指令时%edx is 0?


英特尔指令集手册似乎表明,如果不满足条件,则不会读取 CMOV 操作数。 (我怀疑手册中给出的说明的“算法”不太正确。)

显然,其他人不同意;请参阅明确的警告here http://www.rcollins.org/p6/opcodes/CMOV.html:

如果源操作数是内存操作数,则始终读取它,无论是否满足条件。这意味着无论内存读取产生什么异常,都将生成。如果内存读取会导致#GP 或#PG,那就这样吧。

我怀疑原因是这样的:指令解码器读取指令,计算有效地址,并在指令完全解码并准备好执行之前尽早发出内存读取。因此,对内存的读取会提前计划/执行并导致陷阱。直到执行单元实际到达 CMOV 时,它才知道不需要内存读取,那么晚启动它会使指令非常慢,并使指令预取逻辑复杂化。

我只使用它的寄存器-寄存器形式,它不能捕获。

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

为什么条件移动不能正常工作 的相关文章

  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 如何阅读英特尔操作码符号

    我正在阅读一些引用的材料Intel vol 2 SDM x86 手册 https www intel com content www us en developer articles technical intel sdm html关于汇编
  • 寻找有效的移位/加法/LEA 指令序列来乘以给定常量(避免 MUL/IMUL)

    我正在尝试编写一个 C 程序 mult c 它有一个接收 1 个 int 参数的 main 函数 用atoi argv 1 这是一些常数k我们想要乘以 该程序将生成一个汇编文件mult s实现 int mult int x return x
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 英特尔 JCC 勘误表 - 用于缓解的前缀有什么影响?

    Intel 推荐 https www intel com content dam support us en documents processors mitigations jump conditional code erratum pd
  • 将 2 个数字与汇编进行比较[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有以下代码 我想完成汇编代码 如下
  • GCC 内联 asm NOP 循环在编译时未展开

    走出我通常的 VC 领域 进入 GCC 的世界 通过 MINGW32 尝试创建一个主要由 NOP 组成的 Windows PE ala for i 0 i lt 1000 i asm nop 但要么我使用了错误的语法 要么编译器正在通过它们
  • MIPS 汇编不支持“.set noat”吗?

    目前 我正在学习GNU as 并在 info as 中找到了很多有用的信息 我发现 set noat 在MIPS指定的代码中使用 但是当在 info as 中搜索该指令时 我在节点 alpha指令 中找到了它的解释 但在 MIPS Depe
  • 如何在 Linux 中制作一个将文件转换为大写的 x86 汇编程序?

    我找到了一个名为 ProgrammingGroundUp 1 0 booksize pdf 的 pdf 文件 其中一个项目是制作一个汇编程序 该程序接收文件并将其转换为大写 section data CONSTANTS system cal
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • 0 和双字 0 有什么区别?

    正如问题所述 有什么区别 例如 mov eax 0 and mov eax dword 0 我一直在使用 cmp 语句 但我无法理解其中的区别 一个是地址 另一个是数值 如前所述 MOV 指令没有区别 对于 CMP 您将有以下区别 qwor
  • 如何创建一个扩展为“(x+y*240)*2”这样的表达式的 GNU GAS 宏?

    我正在使用 GAS 为 ARM Linux 构建一个程序 但我想做一些宏以使我的开发更加智能 然后我想知道 我怎样才能为此做一个宏 x y 240 2 were x and y are int 将像这样使用 mov r0 MACRO SHO
  • 汇编:使用数据段寄存器(DS)

    目前我正在学习 x86 汇编 因为我喜欢微控制器编程 所以我熟悉汇编 目前我一直在到处寻找这个问题的答案 但似乎找不到它 DS寄存器 我知道它应该指向我程序中的全局数据 但我不知道知道它到底是如何工作的 我正在使用 NASM 在大多数简单的
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 为什么 x86-64 上的 GCC 在函数内插入 NOP?

    给定以下 C 函数 void go char data char name 64 strcpy name data x86 64 上的 GCC 5 和 6 编译 普通gcc c g o其次是objdump 这到 00000000000000
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考

随机推荐

  • Curl:传输已关闭,剩余未完成的读取数据

    我遇到了大卷曲调用的问题 I get nread 传输已关闭 剩余未完成的读取数据 并且内容已部分交付 GET stats stats breakdown track track campaign search criteria 2 per
  • 无法生成用于构建和调试的资产。 OmniSharp 服务器未运行

    在 Visual Studio VS Code 上 使用 C 进行编码 我正在尝试生成要构建和调试的资产 但收到以下错误消息 无法生成用于构建和调试的资产 OmniSharp 服务器未运行 我在跑 NET版本3 1 301 视窗8 1 Vi
  • 从小表中删除重复行

    我在 PostgreSQL 8 3 8 数据库中有一个表 该表没有键 约束 并且有多行具有完全相同的值 我想删除所有重复项并仅保留每行的 1 个副本 特别有一列 名为 key 可用于识别重复项 即每个不同的 key 应该只存在一个条目 我怎
  • 需要在ggplot2中绘制条形图(以百分位方式)

    嗨 我有一个这样的数据集 ALL Critical Error Warning Review 2016 1412 475 4 125 154 45 49 2 58 116 86 12 1 17 我想使用 ggplot2 绘制堆叠条形图 其中
  • 混合构造函数并在 Javascript 代理对象上应用陷阱

    我有一个类 我想对其应用代理 观察方法调用和构造函数调用 计算器 js class Calc constructor add a b return a b minus a b return a b module exports Calc i
  • 仅查看 Mercurial 中的目录?

    如何仅从 Mercurial 存储库中查看子目录 看来我只能查看整个存储库 你不能 请参阅此处的讨论 https www mercurial scm org wiki PartialClone https www mercurial scm
  • SparkSQL CSV 的引用不明确

    我正在尝试在 SparkSQL 2 10 中读取一堆 CSV 文件 其自定义架构部分是 Double 部分是 String 如下所示 Build the schema val schemaStringS col1 col2 val sche
  • MatPlotLib 修改自定义线性分段颜色图

    关于已接受的答复这个问题 https stackoverflow com questions 38882233 geopandas matplotlib plot custom colors 38885389 38885389 如果我想使用
  • Java 期货管道

    我正在努力优化我的Future的管理技术 假设我们有这种典型的处理场景 我运行一个查询以从数据库中获取一些记录 SELECT FROM mytable WHERE mycondition 该查询返回很多我需要处理的行 例如 while re
  • 清除 TList 或 TObjectList

    我对使用什么来存储列表中的对象有点困惑 到目前为止我已经使用过TList并释放循环中的每个项目 然后我发现TObjectList自动执行此操作Free 然后我从文档中看到了这个TList Clear Call Clear清空 Items 数
  • C Unix 管道示例

    尝试实现一个shell 主要是管道 我已经编写了这个测试用例 我希望将 ls 简单地通过管道传输到 wc 它肯定不会按预期工作 它将 ls 打印到终端 然后打印内存耗尽 我非常不知道如何解决这个问题并让它发挥作用 find path 在我的
  • 从多个 SQL 文件恢复 SQL

    我有一个包含 400 多个 sql 文件的数据库备份 foreach表有一个单独的sql文件 是否可以将所有这些文件一起导入数据库 如果可以的话你能告诉我该怎么做吗 备份也是一个 gzip 压缩的 tar 文件 有没有办法从压缩文件中恢复
  • 动态xpath表达式

    美好的一天 同事们 请告诉我如何进行动态 xpath 解析 例如 而不是写 domXPath gt query id article id 18 gt 写类似的东西 domXPath gt query id article id 因为在我的
  • 现代和旧的编译器是用什么编写的?

    作为编译器 而不是解释器 只需要翻译输入而不运行它 其本身的性能应该不会像解释器那样有问题 因此 您不会用 Ruby 或 PHP 编写解释器 因为它太慢了 但是 编译器呢 如果您用脚本语言编写一个编译器 甚至可能具有快速开发的特点 您可能会
  • 使用通用接口约束时的协变/逆变难题

    public interface IShape public class Rectangle IShape public class Base public class Derived Base public interface IFoo
  • 如何让 ASP.NET AJAX 通过 GZip 压缩发送其 JSON 响应?

    我在 IIS7 中启用了压缩 并且它对除 ASP NET AJAX 构建的响应之外的所有响应都按预期工作 我有一个向客户端提供数据的网络服务 当直接调用Web服务时 它被正确压缩 但是 当通过 ASP NET AJAX 调用时 JSON 响
  • 同步和异步活动

    谁能帮助我理解同步 and 异步Android 中的活动 Android 中的同步和异步活动到底意味着什么 StartActivity StartSubActivity and StartAcivityForResult同步或异步启动活动
  • 多语言安装

    我正在尝试使用以下命令安装 多语言 pip install polyglot 但我收到以下错误 Command python setup py egg info failed with error code 1 in C Users K 1
  • Realm:比较原始类型的 List,例如:List

    比较 Realm 字符串列表的预期方法是什么 我正在尝试比较 Realm 中的两个字符串列表 如下所示 func testRealmListOfStrings let strings a b c let list1 List
  • 为什么条件移动不能正常工作

    在我编译下面的代码后 该功能似乎没有按预期工作 int cread int xp return xp xp 0 我提取了汇编版本中的对应部分 如下所示 xp在寄存器中 edx movl 0 eax testl edx edx cmovne