如何获取所有变量并将其放入 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 = ..."
的指针。通过向其添加 offset
(lea eax, [eax+offset]
是 add eax, offset
的奇特方式),您可以获得变量 a
的地址。在这里,您现在需要再添加 8 个才能获得 b
.
的地址
我有以下代码(这是我的讲师编写的代码)计算数字 (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 = ..."
的指针。通过向其添加 offset
(lea eax, [eax+offset]
是 add eax, offset
的奇特方式),您可以获得变量 a
的地址。在这里,您现在需要再添加 8 个才能获得 b
.