gpt4 book ai didi

c++ - FLD 浮点指令加载常量

转载 作者:行者123 更新时间:2023-11-27 23:15:45 26 4
gpt4 key购买 nike

根据 The Art of Assembly CH14 (无效链接,未在 archive.org 上找到)

14.4.4.1 The FLD Instruction

fld     mem_32
fld mem_64[bx]

我的目标是将常量 10 加载到我的 FPU 堆栈中。为什么我不能这样做?

__asm
{
move bx, 0x0004;
fld dword ptr[bx] or fld bx;


//-------
fld 0x004; //Since it is 32 bits?
fild 0x004;
}

最佳答案

这里至少有三件事可能会出错。一种是汇编程序的语法。二是指令集架构。第三个是内存模型(16 位 vs 32 位,分段 vs 平面)。我怀疑提供的示例是针对 16 位分段架构的,因为 8087 是那个时代的,但 c++ 编译器主要是在 386+ 保护模式之后出现的。

8087 FPU 不支持在通用寄存器 (GPR) 和浮点堆栈之间移动数据的指令。基本原理是浮点寄存器使用 32、64 或 80 位,而 GPR 只有 16 位宽。取而代之的是间接地从内存中移动数据。

示例 fld myRealVar 假定已提供标签(具有宽度):

 .data
myRealVar: .real8 1.113134241241
myFloat: .real4 1.1131313
myBigVar: .real10 1.1234567890123456
myInt: .word 10
myInt2: .word 0
myBytes: .byte 10 dup (0) ;// initializes 10 bytes of memory with zeros

.text
fld myRealVar; // accesses 8 bytes of memory
fild myInt; // access the memory as 16 bits
fild myBytes; // ## ERROR ## can't load 8-bits of data
fild dword ptr myBytes; // Should work, as the proper width is provided

首先请注意,这些示例假设数据属于段 .data 并且已使用

初始化该段
 mov  ax, segment data;  //
mov ds, ax

只有在那之后,内存位置 0x0004 才可能包含常量 10。我强烈怀疑该模型不适用于您的内联 C++ 系统。同样在这里,汇编程序必须足够聪明,才能将每个标签与提供的宽度相关联,并在指令中对其进行编码。

将整数加载到 FPU 的一种方法是使用堆栈:

 push bp                 // save bp
mov ax, 10
push ax
mov bp, sp // use bp to point to stack
fild word ptr [bp]
pop ax // clean the stack and restore bp
pop bp
.. or ..
mov bx, 10
push bx
mov bx, sp
fild word ptr ss:[bx] // notice the segment override prefix ss
pop ax // clean the constant 10

在 32 位架构中,可以直接使用 esp 指向栈顶,这可能是您的 c++ 编译器的情况:

 sub  esp, 4
mov dword ptr [esp], 10 // store the integer 10 into stack
fild dword ptr [esp] // access the memory
add esp, 4 // undo the "push" operation

一些内联汇编器可能能够使用局部变量并自动用 ebp/esp 寄存器和正确的偏移量替换标签:

 int f1 = 10;
void myfunc(float f2) {
double f = 10.0;
__asm {
fild f1 // encoded as fild dword ptr [xxx]
fld f // encoded as fld qword ptr [esp + xxx]
fld f2 // encoded as fld dword ptr [esp + xxx]
}
}

关于c++ - FLD 浮点指令加载常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16503914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com