我正在尝试移植_controlfp(_CW_DEFAULT,0xffffffff); 从WIN32到Mac OS X/Intel.我完全不知道如何移植这条指令......你呢?谢谢!
fpu以基于堆栈的方式实现寄存器的动机是什么?据我所知,其他指令集如x86/sse使用命名寄存器.我可以想象基于堆栈的属性通常与我们的函数思想相对应,从而为汇编程序员提供了更直观的设计.
然而,我很好奇是否有一些更有形的动机,即技术优势.
嗯,这根本不是一个优化问题.
我正在写一个(现在)简单的Linux内核模块,我需要找到一些位置的平均值.这些位置存储为浮点(即float)变量.(我是整个事情的作者,所以我可以改变它,但我宁愿保持漂浮的准确性,如果我可以避免它,也不参与其中).
现在,这些位置值仅存储(或至少用于)内核中的存储空间.一个用户应用程序写入这些数据(通过共享内存(我正在使用RTAI,所以我在内核和用户空间之间共享内存))和其他人从中读取数据.我假设浮点变量的读写不会使用FPU,所以这是安全的.
安全的,我的意思是避免在内核中使用FPU,更不用说某些系统甚至可能没有FPU.我不会使用kernel_fpu_begin/end,因为这可能会破坏我的任务的实时性.
现在在我的内核模块中,我真的不需要太多的精度(因为无论如何平均位置),但我需要它说0.001.我的问题是,如何在不使用FPU的情况下将浮点数转换为整数(原始数字的1000倍)?
我想过从float的位模式中手动提取数字,但我不确定这是不是一个好主意,因为我不确定endian-ness如何影响它,或者即使所有架构中的浮点都是标准的.
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, but not sure if multiplies-adds are ok
push ebp
mov ebp, esp
mov eax, dword [ebp+8H]
mov edx, dword [ebp+0CH]
fld qword [eax]
fmul qword [edx]
fld qword [eax+4H]
fmul qword [edx+4H]
fld qword [eax+8H]
fmul qword [edx+8H]
faddp st1, st(0)
faddp st1, st(0)
fstp qword [ebp+10H] ; here …Run Code Online (Sandbox Code Playgroud) 当编译为支持AVX扩展的处理器(比如-m64 -march=corei7-avx -mtune=corei7-avx适用)时,同时使用-mfpmath=both -mavx密钥是否有意义?没有这么多,它会导致编译器使用三套指令(i87,SSE,AVX在同一时间)?或者只是i87为了标量(在某种意义上)和AVX仅用于向量?
section .data
qVar1: dq 1
section .bss
var28: resb 28
section .text
_main:
; Use an MMX instruction
movq mm0, [qVar1] ; Move quadword from r/m64 to mm.
; Read Tag Word
fstenv [var28]
mov ax, [var28 + 8] ; move the Tag Word to ax
Run Code Online (Sandbox Code Playgroud)
这一刻ax是0101 0101 0101 0110
但是从英特尔手册,第9.5.1节MMX指令和x87 FPU标签字,我引用:
在每个MMX指令之后,整个x87 FPU标记字被设置为有效(00B).
那么为什么ax不是全零呢?
我目前正在大学开展一个小型的Assembler项目.现在我的问题是,是否有可能得到一个乘法器(int)的skalar,这是由用户给出的,从我的EAX/RAX寄存器到我的FPU寄存器之一,如st0?我正在使用NASM语法.
谢谢
我目前正在开发一个同时使用 CPU 和 FPU 寄存器的程序集。我的问题涉及如何将寄存器值加载到 FPU 堆栈(即 ecx)。
mov ecx, 10d ; Load 10 into ECX
fldpi ; Load Pi
fild ecx ; This does not work, it does however for .data variables
fmul ; Multiply
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。我正在使用 Visual Studio 2015/MASM 进行开发,使用 .386 和 .model flat、STDCALL。
最好的问候,Z
我最近正在研究 FP 和 AVX,在维基百科(https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#Applications)上我读到 AVX 用于 FP 计算。我不明白为什么并行环境 FP 是进程。另外https://forums.aida64.com/topic/1629-real-world-benefit-of-fpu-test/以这种形式AIDA管理员告诉FPU使用AVX等。
我最近开始学习汇编,现在正在学习FPU x86体系结构和FPU堆栈。我有两个简单的函数,可在摄氏温度和华氏温度之间转换,反之亦然。
我研究了各种不同的指令,尝试了FPU指令的变体,包括自动执行POP操作的指令,并尝试通过调试器了解我所看到的内容。迄今无济于事。
.386
.model flat, c
.const
r8_ftoc real8 0.5555555556 ;5/9
r8_ctof real8 1.8 ;9/5
i4_32 dword 32
.code
fahrentocel PROC
push ebp
mov ebp, esp
fld[r8_ftoc]
fld real8 ptr [ebp+8] ; load f
fild[i4_32] ; load 32
fsubp
fmulp
pop ebp
ret
fahrentocel ENDP
celtofahren PROC
push ebp
mov ebp, esp
fild real8 ptr [ebp+8] ; load c
fmul[r8_ctof]
fiadd[i4_32]
pop ebp
ret
celtofahren endp
END
Run Code Online (Sandbox Code Playgroud)
C代码:
extern "C" double fahrentocel(double temp);
extern "C" double celtofahren(double …Run Code Online (Sandbox Code Playgroud)