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