标签: x87

转换unsigned int时,GCC如何使用fildll?

英特尔指令集参考声明(强调我的):

将有符号整数源操作数转换为双扩展精度浮点格式,并将该值压入FPU寄存器堆栈.源操作数可以是字,双字或四字整数.加载时没有舍入错误.源操作数的符号被保留.该指令的操作在非64位模式和64位模式下是相同的.

在这里你可以看到我的测试用例:

% cat stackoverflow.c       
float uint2float(unsigned int a) {
    return a;
}
% gcc -c stackoverflow.c    
% objdump -d stackoverflow.o

stackoverflow.o:     file format elf32-i386


Disassembly of section .text:

00000000 <uint2float>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 08                sub    $0x8,%esp
   6:   8b 45 08                mov    0x8(%ebp),%eax
   9:   ba 00 00 00 00          mov    $0x0,%edx
   e:   89 45 f8                mov    %eax,-0x8(%ebp)
  11:   89 55 fc                mov    %edx,-0x4(%ebp)
  14:   df 6d f8                fildll …
Run Code Online (Sandbox Code Playgroud)

floating-point x86 assembly unsigned x87

2
推荐指数
1
解决办法
457
查看次数

SSE FPU并行

我想知道是否可以与x87并行使用SSE.所以考虑下面的伪代码,

1:sse_insn 2:x87_insn

管道是否会并行执行1和2,假设它们可以并行执行?

c c++ assembly sse x87

2
推荐指数
1
解决办法
408
查看次数

FILD和FSTP指令

正在做一个破解,试图写一个keygen,我对一些FPU指令感到困惑.

fild    qword ptr ss:[esp] ; loads 4275451536.0000000000 into ST0. ESP has FED63690
lea     esp, dword ptr ss:[esp+8]
fstp    qword ptr ss:[ebp-410] ; loads D2000000 into ebp - 410
fld     qword ptr ss:[ebp-410] ; loads 4275451536.0000000000 into ST0
fstp    qword ptr ss:[esp+8] ; loads D2000000 into esp+8
Run Code Online (Sandbox Code Playgroud)

我想知道它弹出时如何将4275451536.0000000000转换为D2000000?

floating-point x86 assembly reverse-engineering x87

2
推荐指数
1
解决办法
3502
查看次数

斯威夫特的Double vs Float80速度

我听说x87 FPU可以使用80位浮点数,所以即使我想用64位数进行计算,它也会用80位计算它然后转换它.但是在x86-64上的Swift中最快,Double或者Float80(计算算术时)?

floating-point x86 x86-64 x87 swift

2
推荐指数
2
解决办法
1029
查看次数

如果我在程序中使用fsin查找值的sin,我会发现表达式语法错误

如果我使用fsin查找实数的sin值。我发现和表达语法错误。我在Dos上使用Turbo C ++ 3.0。

我一直在寻找x87 fpu中的指令列表。我试图谷歌一些信息。并将我在编译器设置上的指令集参考从8087更改为80287。

 #include<stdio.h>
    #include<math.h>

void main(){
    double a = 1.98,val;
    asm{
    fld a
    fsin
    fstp val
    }
    printf("%f", val);
}
Run Code Online (Sandbox Code Playgroud)

表达式sntax错误:fsin

assembly inline turbo-c++ x87 x86-16

2
推荐指数
1
解决办法
66
查看次数

解码特定 x87 FPU 指令时的歧义

在解码 x87 FPU 指令方面,我面临着一个模棱两可的情况。看看下面的指令取自第 2A 卷英特尔指令集手册 [1] 的第 3-380 页。

D9 /0    --> FLD m32fp --> Push m32fp onto the FPU register stack.
D9 C0+i  --> FLD ST(i) --> Push ST(i) onto the FPU register stack.
Run Code Online (Sandbox Code Playgroud)

这两条指令都具有相同的单字节基本操作码0xD9。第一条指令的扩展操作码为0x00. 扩展操作码将在 ModR/M 字节的“reg”字段中指定。但第二条指令是一个 2 字节的操作码,具有“添加到获取寄存器”功能。这意味着:

D9 C0  --> FLD ST0  
D9 C1  --> FLD ST1  
(and so on)
Run Code Online (Sandbox Code Playgroud)

关于区分这两个指令,我有一个小问题。一个小例子是:

现在,假设我得到操作码序列"D9 C1"。如果我需要检查它是否是指令"FLD m32fp",那么我必须检查 ModR/M 字节的“reg”字段是否为 0x00。如果是这样,那么它确实是"FLD m32fp"正在使用的指令。

的二进制表示C1"1100 0001"。假设bit0是LSB,那么bit3-bit5(含)构成ModR/M字节的'reg'字段"C1" …

fpu opcode x87

1
推荐指数
1
解决办法
914
查看次数

FMUL不清除STATUS寄存器中的溢出

我有这个Win32代码:

fld x
fmul y
fstsw ax
Run Code Online (Sandbox Code Playgroud)

似乎fmul没有清除FPU状态寄存器位,即如果已经设置了溢出(ax&8),那么它将保持设置fmul.这是正确的行为吗?是否需要在FPU操作之后或之前清除状态?

即我想fmul设置这个位,但它应该重置它吗?我在网上找不到答案.

floating-point x86 assembly x87

1
推荐指数
1
解决办法
201
查看次数

FCOM浮点比较失败

我刚刚开始使用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
Run Code Online (Sandbox Code Playgroud)

现在,据我了解,我将pi压入堆栈,然后将1压入堆栈,它应该比较pi和1并看到1较小,然后执行跳转。但是,比较似乎不起作用。有人可以帮忙吗?

x86 assembly x87

1
推荐指数
1
解决办法
665
查看次数

在eax/ecx寄存器中添加32位浮点数?

我有一对存储在eax和ecx中的32位浮点数.我可以直接将它们加载到FPU中对它们进行操作,而无需先存储到内存中吗?这将显着简化一些编译器代码,但fld似乎只能在内存上运行.

floating-point x86 assembly fpu x87

1
推荐指数
1
解决办法
400
查看次数

英特尔的asm文档中的“未定义”是什么意思?FST对C0,C2,C3的影响

英特尔®64和IA-32体系结构软件开发人员手册(第2卷)表示,对于FST / FSTP FPU指令F 受影响的标志

  • 如果发生堆栈下溢,则C1设置为0。指示是否生成浮点不精确异常(#P)的舍入方向:0?不综述 1个 围捕。
  • C0,C2,C3未定义。

简单的测试(几乎没有任何价值)告诉我,C0,C2,C3不会受到影响:

#include <iostream>
#include <bitset>

#include <cstdlib>
#include <cstdint>

int main()
{
    double x = -1.0;
    std::uint16_t a = 0, b = 0;
    asm volatile ("fld %[x] ; ftst ; fnstsw %%ax ; mov %%ax, %[a] ; fstp %%st ; fnstsw %%ax ; mov %%ax, %[b] ;"
       : [a]"=m"(a), [b]"=m"(b)
       : [x]"t"(x)
       : "cc", "memory");
    std::cout << std::bitset< 16 >(a) << std::endl;
    std::cout << std::bitset< 16 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly fpu x87

1
推荐指数
1
解决办法
40
查看次数

标签 统计

x87 ×10

assembly ×8

x86 ×7

floating-point ×5

fpu ×3

c ×1

c++ ×1

inline ×1

opcode ×1

reverse-engineering ×1

sse ×1

swift ×1

turbo-c++ ×1

unsigned ×1

x86-16 ×1

x86-64 ×1