x87相关内容
为什么使用如此“奇怪”的寄存器大小?是否有任何文档说明为什么不建议对这些寄存器使用64位或128位? 推荐答案 Wikipedia page on the IEEE 754-1985 standard关于80位扩展格式有一个很好的解释: 该标准还建议使用扩展格式来执行 内部计算的精度高于 最终结果,以最大限度地减少舍入误差“ 双精度浮点数以64位表示。您可能需要更多的位以获得更
..
x87 FPU 以使用内部 80 位精度模式而著称,这通常会导致跨编译器和机器产生意外且不可重现的结果.在我的搜索中在 .NET 上可重现的浮点数学,我发现 .NET(Microsoft 和 Mono)的两个主要实现都发出 SSE 指令,而不是 64 位模式下的 x87. SSE(2) 对 32 位浮点数使用严格的 32 位寄存器,对 64 位浮点数使用严格的 64 位寄存器.通过设置适当的
..
我最近阅读了很多关于 IEEE 754 和 x87 架构的书.我正在考虑在我正在处理的一些数字计算代码中使用 NaN 作为“缺失值",我希望使用 signaling NaN 可以让我在这种情况下捕获浮点异常我不想继续处理“缺失值".相反,我会使用 quiet NaN 来允许“缺失值"通过计算传播.但是,根据现有的(非常有限的)文档,信号 NaN 并不像我认为的那样工作. 这是我所知道的总结(
..
我需要一些资源来了解有关浮点数的更多信息,我需要在 emu8086 环境 .... 非常感谢任何帮助 解决方案 据我所知,emu8086不模拟带有 8087 FPU 的机器. 您所做的任何浮点运算都必须是纯软件,不能使用 fld/fadd/fstp 或任何通常的遗留物1 x87 说明. 如果你想在实模式下使用 FP 指令,你最好的选择是像 DOSBox 或 BOCHS 这
..
我用 NASM 写了这段代码: section .datafvar:dd 123.456fsig:dq 0.0fexp:dq 0.0节.textfld dword[fVar]提取物;将有效数放入 ST(0),将指数放入 ST(1)fstp qword[fsig] ;fsig = 1.929fstp qword[fexp] ;fexp = 6 我正在等待找到:fsig = 123456 和 fe
..
我写了一些代码来测试 fsqrt 函数,结果对我来说并不完全有意义.这是代码(在delphi中): 使用毫米系统;无功兰特:longint=123456789;函数 rng:longint;汇编imul eax,[兰特],$08088405公司mov [rand],eax结尾;函数 int_sqrt(adata:longint):longint;汇编fnstcw 字([esp-2])//mov
..
下午好!在此示例中,我仅用逗号添加两个数字,将变量保存在 tbyte 中,并在屏幕上连续两次显示相同的变量,但这是我第一次获得 11.1 ,并且第二次 4.667261E-062 .为什么会这样? 还有一个问题,是否可以在 tbyte 中以某种方式按数组类型保存和访问数字?例如,将数字存储在 dd 中,我只能以4的增量进行保存和读取,例如,结果[0] ,结果[4] 等.是否可以将其与 tby
..
我有一个作业将计算PCB的走线宽度.如何在emu8086中计算此公式?(对不起,我的英语不好) k是一个浮点数,temp_rise是一个整数,b是一个浮点数,c是一个浮点数
..
有什么方法可以通过i387 fsqrt指令获得正确的舍入吗?... ... 除了更改x87控制字中的精确度模式-我知道这是可能的,但是这不是一个合理的解决方案,因为它存在令人讨厌的重入类型问题,其中精确度模式将是如果sqrt操作被中断,则错误. 我要处理的问题如下:x87 fsqrt 操作码以fpu寄存器的精度执行正确取整(根据IEEE 754)的平方根运算.假设扩展了(80位)精度.
..
我想知道为什么x86体系结构上的指令 FYL2XP1 能够精确计算数学公式 y ·log 2 ( x +1). 此公式有什么特别之处? 解决方案 y 操作数通常是一个编译时间常数,此刻请忽略 x +1 . 由于 log_b(x)= log_b(2)* log_2(x),因此该指令允许以 x + 1 的任何底数计算对数. 请注意, log_b(2)是一个常数,因为它几乎不需要以
..
如果我有2个具有不同位模式的非正规浮点数并比较它们是否相等,结果是否会受到Denormals-Are-Zero标志,Flush-to-Zero标志或常用处理器上的其他标志的影响? 还是这些标志仅影响计算而不影响相等性检查? 解决方案 DAZ(异常 Are 零)会影响读取输入,因此 DAZ会影响比较.根据其符号,所有异常值都按字面意义被视为 -0.0 或 +0.0 . FTZ(刷
..
我正在尝试在C语言的嵌入式汇编中使用指定的舍入模式舍入一个输入双精度数.为此,我需要使用"fstcw"抓取FPU控制字,然后更改该字中的位.不幸的是,我在第一行遇到错误: double roundD(double n, RoundingMode roundingMode) { asm("fstcw %%ax \n" ::: "ax");
..
根据Intel文档,这是FPTAN的作用: 用近似切线替换ST(0)并将1推到FPU堆栈上. 这是我在NASM中编写的代码: section .data fVal: dd 4 fSt0: dq 0.0 fSt1: dq 0.0 section .text fldpi fdiv dword[fVal] ; divide pi by 4
..
当我尝试编写Heron算法来计算ECX寄存器中的sqrt时,它不起作用.看起来问题在于除以浮点数,因为结果是整数. 我的算法: sqrtecx: MOV EDX, 10 ; loop count MOV EAX, 5 ; x_0 in heron algorythm MOV DWORD[EBP-100], ECX ; save INPUT (ecx is input)
..
Hullo,我正在学习x86 FPU组装,并且我有 有一个简单的问题,我找不到答案: 如何从 ST(0) (FPU的顶部)转移价值 堆栈)到 EAX 吗? 还: 此代码正确吗: ; multiply (dot) two vectors of 3 floats passed by pointers as arg 1 arg 2 ; passings are ok I think,
..
我刚刚开始使用32位汇编,我很困惑.我有以下代码: .586 .MODEL FLAT .STACK 4096 .DATA .CODE main PROC finit fldpi fld1 fcom fstsw ax sahf JL jumper nop jumper: nop nop main ENDP END 现在,据我所知,我将pi推入堆栈,然后将1推入堆栈,它应该将p
..
此示例是用NASM编写的: section .bss var28: resb 28 section .text _main: ; Initialize finit fldpi ; Read Tag Word fstenv [var28] mo
..
《英特尔指令参考》中为COMISD指令提供了以下文档: 比较低位的双精度浮点值 操作数1(第一个操作数)和操作数2(第二个操作数)的四元, 并根据以下内容在EFLAGS寄存器中设置ZF,PF和CF标志 结果(无序,大于,小于或等于). CF的标志点在这里并不清楚,因为它与对无符号整数的算术运算有关.相反,文档关注的是按定义签名的浮点.我进行了一些实验,例如 mov rax, 0x
..
我知道x87具有更高的内部精度,这可能是人们所看到的与SSE操作之间的最大差异.但是我想知道,使用x87还有其他好处吗?我有在任何项目中自动键入-mfpmath=sse的习惯,我想知道我是否还缺少x87 FPU提供的其他功能. 解决方案 对于手写asm,x87的某些指令在SSE指令集中不存在. 所有这些都是三角函数,例如fsin,fcos,fatan,fatan2和一些指数/对数.
..
我要将Quake 2的嵌入式Win32程序集移植到GAS.我首先采用了内联程序集,然后将其放入自己的ASM文件中.解决了所有问题,然后开始移植到GAS.我确实知道AT& T与Intel语法(包括用于某些数学运算的浮点寄存器)和其他一些小陷阱的src/dst是相反的,但是当我进行这种编译时,我注意到代码无法正常工作故意的.我使用比较实用工具仔细阅读了数小时,并阅读了组装手册,最后尝试在GAS和MAS
..