英特尔指令集参考声明(强调我的):
将有符号整数源操作数转换为双扩展精度浮点格式,并将该值压入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) 我想知道是否可以与x87并行使用SSE.所以考虑下面的伪代码,
1:sse_insn 2:x87_insn
管道是否会并行执行1和2,假设它们可以并行执行?
正在做一个破解,试图写一个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?
我听说x87 FPU可以使用80位浮点数,所以即使我想用64位数进行计算,它也会用80位计算它然后转换它.但是在x86-64上的Swift中最快,Double或者Float80(计算算术时)?
如果我使用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
在解码 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" …
我有这个Win32代码:
fld x
fmul y
fstsw ax
Run Code Online (Sandbox Code Playgroud)
似乎fmul没有清除FPU状态寄存器位,即如果已经设置了溢出(ax&8),那么它将保持设置fmul.这是正确的行为吗?是否需要在FPU操作之后或之前清除状态?
即我想fmul设置这个位,但它应该重置它吗?我在网上找不到答案.
我刚刚开始使用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较小,然后执行跳转。但是,比较似乎不起作用。有人可以帮忙吗?
我有一对存储在eax和ecx中的32位浮点数.我可以直接将它们加载到FPU中对它们进行操作,而无需先存储到内存中吗?这将显着简化一些编译器代码,但fld似乎只能在内存上运行.
英特尔®64和IA-32体系结构软件开发人员手册(第2卷)表示,对于FST / FSTP FPU指令F 受影响的标志:
简单的测试(几乎没有任何价值)告诉我,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)