FLD浮点指令加载常数

2023-12-09

根据装配艺术 CH14(死链接,在 archive.org 上找不到)

14.4.4.1 FLD 指令

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 位与 32 位、分段与扁平)。我怀疑所提供的示例是针对 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]
     }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FLD浮点指令加载常数 的相关文章

  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 没有布局模板或 JSON 视图的 Meteor Iron-Router

    使用 Meteor Iron Router 我怎样才能either将数据呈现为 JSON 或只是将其显示为 原始 没有布局模板 本质上我希望能够做类似的事情 this route rawdata path raw collection la
  • Microsoft Face API 中“解码错误,图像格式不受支持”

    我正在尝试使用 Microsoft Face API 为此 我有 Microsoft 提供的以下代码作为示例 在本页末尾 https dev projectoxford ai docs services 563879b61984550e40
  • 如何使用preg_match提取数据?

    我对 preg match 的使用还很陌生 在发布这个问题之前搜索了很多答案 找到了很多帖子来根据 youtube ID 等获取数据 但没有任何符合我的需要 如果这是一个愚蠢的问题 请原谅我 我需要使用 preg match 从字符串中获取
  • 如何从 QLineEdit() 获取 int?

    所以这是我的代码 我尝试了很多方法来更改 QLineEdit 的输入 但没有任何效果 我唯一得到的是 类型错误 QLineEdit 和 QLineEdit 实例之间不支持 gt from matplotlib import pyplot i
  • 对 MYSQL 标签表进行排序

    只是想知道是否可以获得前 10 COUNT 个结果并按 COUNT 和字母顺序排序 我有以下表格 tags id title tagged tag id post id 以及以下 SQL 查询 SELECT tag COUNT td tag
  • Android 媒体播放器和搜索栏同步问题

    我正在开发一个媒体播放器应用程序 我正在尝试将其同步到搜索栏 以便在播放媒体时搜索栏自动前进 这是我的源代码 public class MusicDroid extends ListActivity implements SeekBar O
  • 使用 powershell 登录 azure 帐户而不弹出窗口

    我正在尝试使用 powershell 创建 Azure VM 我还有创建它的脚本 首先我需要登录 Azure 帐户 Login AzureRMAccount 这会弹出一个窗口来输入凭据 其次我需要运行以下脚本 UserName userna
  • 电子邮件发送后电子邮件地址发生变化(GMail postfix 中继)[关闭]

    Closed 这个问题是无关 目前不接受答案 我已经达到了 SMTP postfix 知识的极限 我正在使用 javamail 1 4 发送邮件 javamail 库正在连接到本地 postfix 进程 postfix 进程配置为通过 gm
  • iOS 应用程序在模拟器上运行但在设备上运行?

    我的应用程序没有错误 警告或内存泄漏 在模拟器上运行完美 但在运行 iOS 5 的 iPhone 4 上出现黑屏 SIGABRT发生在这一行的 main 中 int retVal UIApplicationMain argc argv ni
  • 使用 中的 regex_replace 函数时出错

    include
  • 如何从属性文件初始化 ORB?

    我想从属性文件初始化我的 ORB 通常我在运行示例时像这样初始化它 app ORBInitRef NameService corbaloc localhost 2809 NameService 我写了一个简单的代码 private stat
  • 使用Gson或嵌套内部类反序列化内部类中的任意对象json数组

    当我尝试使用 Gson 反序列化一个 Json 字符串时 我遇到了麻烦 字符串是这样的 注意 我只是简化了它 但留下了我遇到麻烦的部分 因此 可能存在 Json 语法错误 但我已经使用在线验证器检查了我正在使用的字符串是否正常 let s
  • 合并两个带有替代字符的字符串作为输出

    我的任务是交替组合两个长度相同的字符串的字母 例如 Inputstring 1 acegi Inputstring 2 bdfhj Outputstring abcdefghij 当我运行我的代码时 我遇到了以下问题 Traceback m
  • 我可以将标准输出重定向到某种字符串缓冲区吗?

    我正在使用 python 的ftplib编写一个小型FTP客户端 但包中的某些函数不返回字符串输出 而是打印到stdout 我想重定向stdout到一个我能够读取输出的对象 I know stdout可以使用以下命令重定向到任何常规文件 s
  • 使用与先前轴相同的参数添加轴

    我想在两个不同的子图中绘制数据 绘图后 我想返回第一个子图并在其中绘制附加数据集 但是 当我这样做时 我收到以下警告 MatplotlibDeprecationWarning 使用与先前轴相同的参数添加轴当前会重用先前的实例 在未来的版本中
  • 回文检查的递归方法

    是否可以使用以下参数列表定义回文检查的递归方法 int testPalindromeRecursive char str int len 注意 不必使用外部子函数或全局变量 我认为这是不可能的 因为你必须以某种方式记住最后一个 前面 索引位
  • 键“数据源”的值长度超出了“128”的限制

    我知道有人问过一个非常相似的问题here 但答案对我没有帮助 我将 Entity Framework 6 与 Oracle ManagerDataAccess Client 结合使用 如果我在 app config 中定义连接字符串 则连接
  • 如何获取隐藏图像的高度?

    当 div 被隐藏时 display none 浏览器将不会加载其中的图像 有没有办法告诉浏览器加载图像 我需要图像的高度和宽度来进行一些预处理 注意 由于一些其他代码 我无法使 div 可见 检查这里的例子 另外 延迟加载 示例对我来说不
  • 调试控制台应用程序时,Visual Studio 陷入异常报告循环。为什么?

    考虑这个简单的控制台应用程序 using System namespace Demo class Program static void Main string args throw new Exception 我在 Visual Stud
  • FLD浮点指令加载常数

    根据装配艺术 CH14 死链接 在 archive org 上找不到 14 4 4 1 FLD 指令 fld mem 32 fld mem 64 bx 我的目标是将常数 10 加载到我的 FPU 堆栈中 为什么我不能这样做 asm move