Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何获取所有变量并将其放在FPU堆栈上?_Assembly_X86_Fpu_X87 - Fatal编程技术网

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

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

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

现在,我需要修改这段代码,对给定的三个数字执行几个操作,这是我的问题,因为我不知道如何将它们放在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]
。但是,您应该将
leaeax[eax+offset]
改为
lea,eax[eax+offset+8]

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

原因如下:

第一条指令是一个
调用getattr
,这实际上只是一个肮脏的把戏。因此,在堆栈上(在
[esp]
位置),在代码的最开头有数据结构的地址。然而,就代码而言,在
[esp+4]
-堆栈上实际上只有这一个地址


使用
mov-eax,[esp]
将此地址加载到
eax
中。因此,
eax
现在是一个指向字符串
“delta=…”
的指针。通过向其添加
offset
leaeax,[eax+offset]
addeax,offset
的一种奇特方式),您可以获得变量
a
的地址。就是在这里,您现在需要再添加8个以获得
b

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

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

原因如下:

第一条指令是一个
调用getattr
,这实际上只是一个肮脏的把戏。因此,在堆栈上(在
[esp]
位置),在代码的最开头有数据结构的地址。然而,就代码而言,在
[esp+4]
-堆栈上实际上只有这一个地址


使用
mov-eax,[esp]
将此地址加载到
eax
中。因此,
eax
现在是一个指向字符串
“delta=…”
的指针。通过向其添加
offset
leaeax,[eax+offset]
addeax,offset
的一种奇特方式),您可以获得变量
a
的地址。在这里,您现在需要再添加8个以获取
b

FYI的地址,
mov eax,
加载(通常是什么)返回地址,这是一种奇怪的外壳代码风格的黑客攻击。您通常不希望这样混合数据和代码。通常,调用者会在寄存器中或堆栈中传递与返回地址不同的指针。为什么你会提出一个新问题而不是回答?@fuz因为在那个问题中,我描述我的问题太混乱了,我发现代码真的很糟糕,正如你和其他人所说的,我自己也纠结了。另一个问题是,我必须坚持我们从lecturer@nath425听起来不错!但再多说几句有助于让人更容易理解。例如,我不明白你为什么要
leaeax[esp+4];fstp-qword[eax]
而不是简单地
fstp-qword[esp+4]
。我认为以后可能需要将
eax
设置为该值,但如果没有注释,则完全不清楚。我也不明白打印例程的参数放在哪里,这对于理解哪里出了问题至关重要。再次:没有评论,所以我只能猜测。@fuz不幸的是,我们的教学方式如此奇怪,正如我之前所写的,讲师不接受任何其他方式,除了他向我们展示的方式(即我插入的方式)。谢谢你想要帮助我,下面我已经收到了解决这个问题的答案(虽然出现了另一个,但性质不同)。所以,我认为我们可以离开它,因为我知道在这个例子中,很多事情可以做得不同,更好,但为什么我没有做,我已经描述过了,这不取决于我;PFYI,
moveax,[esp]
加载(通常是什么)返回地址,是一种奇怪的外壳代码风格的黑客。您通常不希望这样混合数据和代码。通常,调用者会在寄存器中或堆栈中传递与返回地址不同的指针。为什么你会提出一个新问题而不是回答?@fuz因为在那个问题中,我描述我的问题太混乱了,我发现代码真的很糟糕,正如你和其他人所说的,我自己也纠结了。另一个问题是,我必须坚持我们从lecturer@nath425听起来不错!但再多说几句有助于让人更容易理解。例如,我不明白你为什么要
leaeax[esp+4];fstp-qword[eax]
而不是简单地
fstp-qword[esp+4]
。我想也许你需要
    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]