问题标签 [x87]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2403 浏览

assembly - NASM x87 FILD 指令

我正在阅读这篇文章,我注意到他们的示例显示 fld 将值加载到不同的位置(st0、st1,然后返回到 st0),而没有指定加载到的位置。我假设 fild 以类似的方式工作,因为它只是加载整数的方法(或者这是我的理解),但我可能是错的。所以我的问题是:fld,更具体地说,将值加载到哪里?是否有一个参数来指定要使用哪个 fpu 寄存器,或者它只是循环通过 8,还是我缺少一些完全不同的方式?

我专门使用的代码是尝试将 3 个数字相乘。我假设一种方法是加载到 st0,然后加载到 st1,然后加载到 st2,然后是 fmul st0 和 st1(导致 st0),然后是 fmul st0 和 st2。代码如下:

ecx = 5 和 [ebp-4] = 5

此代码崩溃,使用 OllyDbg 我看到在 00000069 处存在访问冲突,但当前未包含在任何寄存器中。

所以是的,有没有办法指定 fild 加载值的位置,有没有一种很好的方法来确定它们应该去哪里,如果我在循环中运行它会改变什么吗?

--EDIT 3-- 大部分是固定的,排序。一件大事是它fmul不会将值推送到st0,它只会覆盖 中的任何内容st0。新代码:

这个循环和递减直到ecx== 2 然后尝试fild2 和 1 给出与bad -NAN FFFF C0000000 00000000之前相同的结果。我不确定 3 与 2 或 1 有何不同(除了更小),但那是它开始给出错误值的时候。我应该注意到 ERROR_MOD_NOT_FOUND 被抛出了,虽然我不确定这意味着什么,因为所有的 cpu 和 fpu 寄存器都应该是可访问的。

--EDIT 2--修复了 Parham Alvani 与文档内容一起显示的流行内容:

这将推动 5,然后推动bad -NAN FFFF C0000000 00000000两次。 fmul似乎什么也没做(可能是因为价值观不好)。有没有更好的方法来加载值?似乎我做错了什么fild,但根据第一个链接中提供的示例,并且定义为herefild无论你给它什么,都只是将它推到 st0 上。

--EDIT 1-- 正如 Jester 所建议的,我现在每个循环都从 fpu 堆栈中弹出:

此代码仍然崩溃。00000009 处的访问冲突,st0-4 为 0,st5 = 100,st6 = 4,st7 = 4

0 投票
0 回答
185 浏览

x86 - 80386/80287 组合在 32 位模式下的表现如何?

我对旧计算机的逆向计算和仿真感兴趣,并且对 80287 有疑问:

使用现代 FPU,FNSAVE 指令在 CPU 执行 16 位代码时写入 94 字节数据,在 CPU 执行 32 位代码时写入 108 字节数据。FSTENV 指令的行为类似(14 或 28 字节,具体取决于代码类型)。

然而,为 16 位 80286 CPU 设计的 80287 FPU 也可以与 32 位 80386 CPU 一起使用。

从 32 位代码调用 FNSAVE 和 FSTENV 并启用 386/287 组合的分页时,FNSAVE 和 FSTENV 的行为如何?

80287 手册明确提到了 80386,但它只描述了 94 字节的数据格式。然而另一本手册指出,负责保存 108 字节而不是 94 字节的是 80386 而不是 80387。

据称Linux在使用80287时崩溃的原因是什么?

94字节格式与Linux问题有关吗?

谢谢

0 投票
0 回答
300 浏览

assembly - 使用 x87 指令 FPTAN 和 FDIVR 计算正切

我想tan(pi)用 X87 FPTAN 和 FDIVR 计算:

但我得到一个编译错误

我怎样才能摆脱错误?似乎需要一个大小后缀,但我看不到如何构建指令。

有关信息,我的“gcc -v”返回

0 投票
2 回答
196 浏览

c - x87双重加法不起作用

我定义了一个汇编函数,它接受三个参数(int、double、double),它应该添加两个 putted double 值并返回这个加法的结果。而且我不知道为什么下面的代码不起作用:

以及组装功能:

终端上打印的结果是13.45。看起来处理器不执行加法。我不知道为什么。

0 投票
1 回答
2109 浏览

c - 在汇编 x86 x87 中调用带有浮点数的函数

我是汇编编程的新手,作为更大程序的一部分,我需要将浮点值传递给另一个 C 函数。我的测试程序调用了我的汇编函数,它只将参数推送到正确的堆栈上,并调用第二个 C 函数。

我的 C 测试功能:

x86,海湾合作委员会-m32:

我认为我在ext_funct期待双倍时只推 32 位有问题。但我尝试了 fldl、fld1、fildl、fldl 12 和 16(%ebp),以及其他一些“乐趣”。

  • 我的第一个问题是,ext_func 是否缺少浮点堆栈(ST)上的一些数据,因此无法生成浮点值?(我知道你没有被调用函数,但函数的作用无关紧要?)
  • 其次,如果编译器需要浮点值,编译器是否总是去 f 堆栈获取浮点值,或者是否可以从内存堆栈中读取它们?
  • 第三,这里还有什么我想念的吗?如果我

但另一种方式a给出了以 000000 结尾的大负数(100 位左右)。

0 投票
1 回答
87 浏览

c - 程序集 - 堆栈中的编号

这是我的代码的一部分:

我从 C 调用这个函数。因为 8 字节应该有我调用的值,对吗?但我在 gdb 中看到的是:

这是在 fldl 8(%ebp) 之后。我的朋友做了同样的程序,它工作。我做错了什么?

在我的完整 C 函数下方:

0 投票
1 回答
147 浏览

c++ - 如何重现浮点 cos(x)!=cos(x)

如何重现这种行为? https://isocpp.org/wiki/faq/newbie#floating-point-arith2

准确地说,在下面的代码中,参数xy是相等的;它们可以等于 1.0 或任何其他值。

一些编译器选项?环形?任何想法?

0 投票
2 回答
362 浏览

c++ - SSE 没有为 C++ 数字运算提供加速

我有一个执行图像处理的繁重的数字运算程序。它主要是卷积。它是用 C++ 编写的,并使用 Mingw GCC 4.8.1 编译。我在配备 Intel Core i7 4900MQ(SSE 最高 SSE4.2 和 AVX2)的笔记本电脑上运行它。

当我告诉 GCC 使用 SSE 优化(使用 -march=native -mfpmath=sse -msse2 )时,与使用默认的 x87 FPU 相比,我没有看到任何加速。

当我使用双打而不是浮点数时,没有减速。

我的理解是,当使用浮点数而不是双精度数时,SSE 应该给我 2 倍的加速。我弄错了吗?

0 投票
1 回答
72 浏览

assembly - fxam 应该适用于单精度浮点值吗?

这个问题来自为什么 isnormal() 说一个值是正常的而不是正常的?

AC 编译器生成以下代码,用于检测传入的 32 位float是否正常:

(完整代码可以在这里查看)。

这段代码正确吗?该程序似乎表现不正确,说一个数字是正常的,但不是。我们认为这里可能正在检查该数字的双精度正态性。

0 投票
1 回答
2425 浏览

assembly - 汇编: fld st(0) 如何复制以下代码中的顶部堆栈值?

在下面的代码中,我想知道fld ST(0). 我听说它复制了堆栈中的顶部值,但我不知道它在下面的代码中将那个值带到了哪里?

我的解释是上面的代码以符号方式表示:

我对么?

我想知道为什么fstp不弹出加载的值所以fld复制value[L1000F140]了它?