【问题标题】:Manage float arrays on x86 assembly管理 x86 程序集上的浮点数组
【发布时间】:2014-03-19 18:35:47
【问题描述】:

我试图在 x86 中找到一个浮点数数组的两个少的数字,但我不知道如何存储数组的元素

要访问我使用的整数:

mov eax, 0            ; eax is a counter

mov ecx, vector       ; This store the vector on the register ecx
mov esi, [ecx+4*eax]  ; Stores the position eax of the vecor on esi

这适用于整数数组,但不适用于浮点数,我不知道该怎么做。我检查了 8 而不是 4 但它不起作用

编辑:当我说它不起作用时,我的意思是没有正确读取值,存储在上的数字

ESI is 1099956224 that is not correct

谢谢!

【问题讨论】:

  • 您必须详细说明“它不起作用”。他们来自哪里,你在用他们做什么?请注意,在 x86 中,浮点值通常不存储在通用寄存器中,而是存储在 FPU 寄存器/堆栈中。
  • 看看 SSE 指令/寄存器...
  • 1099956224 是 18.0f 的 IEEE-754 编码。对我来说,这看起来是一个非常好的浮点数。也许你应该将它加载到 FPU 中,也许你应该使用更好的调试器 watch 表达式,目前还不是很清楚你打算用它做什么。

标签: c++ arrays assembly x86


【解决方案1】:

您只能比较浮点数是否在浮点寄存器中。试图将内存中的浮点数解释为整数是完全没有意义的。

阅读 x86 中的浮点支持。这是一个完全不同的指令集;从历史上看,它曾经由一个单独的芯片处理,一个型号为 87 的芯片。特别是从内存中加载浮点数,使用 FLD 命令,比较 - FCOM*,有条件地分配 - FCMOV。另外,请记住浮点子系统的堆栈性质。

编辑:或者,您可以使用 SSE 标量指令。在现代 CPU 上,它可能比传统的 x87 指令执行得更好。使用 MOVSS 从内存中加载浮点数并在 XMM 寄存器之间复制,使用 COMISS 比较和设置 EFLAGS。

最后,正如 Aki 指出的,浮点数以 IEEE-754 格式按字典顺序排序;在两个有效浮点数中,较大的一个位模式也代表一个较大的整数。在现实生活中,这是您可以利用的东西。

【讨论】:

  • 除符号位和NaN外,浮点数可以有效地作为整数进行比较。
  • 没错,但我认为这次作业的重点是让他们学习FPU命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2019-09-19
相关资源
最近更新 更多