我正在尝试学习装配,我正在使用NASM。现在我陷入困境,我想从协处理器堆栈(使用FISTP
)弹出一个内存位置,该地址是用LEA
计算的。所以基本上有这两个指令:
lea eax, [ebp - 4] ; EAX = The address where I want to write to
fistp dword [eax] ; (?)
我所看到的是ST0
的内容写入EAX
,但不会写入EAX
中包含的地址。
怎么能实现这一目标?
一个例子非常有用,我一直在研究手册和参考文献,但到目前为止,对我来说这一切似乎都非常神秘。汇编程序,架构,注册......低级别的所有内容仍然难以阅读和理解。
答案 0 :(得分:1)
你有些困惑。 FISTP dword [eax]将值存储在eax寄存器中指定的地址。在汇编程序中编写一个小程序,并使用调试器逐步执行它,直接看到它。特别是,实际上很难将FP寄存器值放入GP寄存器,而无需通过存储器位置。
您可以一步计算一个地址,然后如您所示在另一个步骤中使用它。但是x86寻址模式可以在单个指令中完成很多工作。这条单指令可以完成你们两个人的工作:
fistp dword [ebp -4 ]
仔细阅读英特尔参考手册中的寻址模式是值得的。
坦率地说,值得花一天时间浏览Combined Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals(几卷)以了解其中的内容,以便了解您可以了解更多信息以及在哪里查看。他们甚至包含非常好的概述。不要被吓倒;坚持下去,它将带来丰厚的回报。