【问题标题】:How to get all variables an put it on FPU stack?如何获取所有变量并将其放在 FPU 堆栈上?
【发布时间】:2020-05-21 08:18:05
【问题描述】:

我有以下代码(这是我的讲师编写的代码),它计算数字 (a) 的根。

    [bits 32]

    call getaddr ; get the runtime addres of format

    format db "delta = %lf", 0xA, 0
    offset equ $ - format
    a      dq 6.0 ;
    b      dq 10.0
    c      dq 16.0

    getaddr:

        finit

        mov eax, [esp]
        lea eax,[eax+offset]

        fld qword[eax]
        fsqrt

        lea eax, [esp+4]
        fstp qword[eax]

        call[ebx+3*4]; start screen print instuctions 
        add esp, 3*4

        push 0
        call[ebx+0*4]

现在,我需要修改此代码以对给定的三个数字执行几个操作,这是我的问题,因为我不知道如何将它们放在 FPU 堆栈上。谁能告诉我我该怎么办?我尝试执行与上面相同的操作,但参考堆栈的下一个元素(在我的尝试之下),但不幸的是它无法正常工作(程序不显示任何内容)。我将非常感谢任何帮助。几天前我添加了一个类似的问题,我得到了一些关于如何改进代码以使其更具可读性和更好的建议,但是我的讲师不接受他提出的解决方案。 我尝试获取 b 变量而不是 a:

    mov eax, [esp+4]
    lea eax,[eax+offset]

    fld qword[eax]
    fsqrt

    lea eax, [esp+4]
    fstp qword[eax]

    call[ebx+3*4]; start screen print instructions
    add esp, 3*4

    push 0
    call[ebx+0*4]

标签: assembly x86 fpu x87


【解决方案1】:

您似乎将+4 用于访问下一个变量(即b)放到了错误的位置。您从mov eax, [esp+4] 开始,而不是mov eax, [esp]。但是,您应该将lea eax, [eax+offset] 改为lea, eax, [eax+offset+8]

请注意,您需要 +8,因为 qword 值是 64 位的,因此每个占用 8 个字节。

原因如下:

第一条指令是call getattr,这实际上只是一个肮脏的伎俩来做push ADRESS_OF_FORMAT。因此,在堆栈上(位置[esp]),您在代码的最开始就拥有数据结构的地址。然而,就代码而言,[esp+4] 处没有任何内容——堆栈上实际上只有这个地址。

使用mov eax, [esp],然后将此地址加载到eax。所以,eax 现在是指向字符串"delta = ..." 的指针。通过将offset 添加到它(lea eax, [eax+offset]add eax, offset 的一种奇特方式),您可以获得变量a 的地址。在这里,你现在需要再添加 8 个才能得到b 的地址。

【讨论】:

  • 非常感谢您的帮助,它终于奏效了,最重要的是我明白错误在哪里以及为什么它现在很好。我很感激你:)
猜你喜欢
  • 2013-11-22
  • 2012-02-20
  • 2018-10-26
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多