如何获取所有变量并将其放入 FPU 堆栈?

How to get all variables an put it on FPU stack?

我有以下代码(这是我的讲师编写的代码)计算数字 (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]

您似乎将 +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 = ..." 的指针。通过向其添加 offsetlea eax, [eax+offset]add eax, offset 的奇特方式),您可以获得变量 a 的地址。在这里,您现在需要再添加 8 个才能获得 b.

的地址