assembly 如何在汇编程序中访问Forth数据栈?

57hvy0tb  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(143)

我刚开始接触forth和assembler。
如果我创造了一个词如下:
: push5 5 ;
我创造了一个单词,它只是把5放在堆栈上。
如果我要求查看创建的汇编程序:
see push5
我得到:

( 0010D5C0    488D6DF8 )              LEA     RBP, [RBP+-08]
( 0010D5C4    48895D00 )              MOV     [RBP], RBX
( 0010D5C8    BB05000000 )            MOV     EBX, # 00000005
( 0010D5CD    C3 )                    RET/NEXT
( 14 bytes, 4 instructions )

我基本上理解了指令([RBP+-08]让我有点困惑),但我很难理解这段代码运行的上下文,以及它是如何向堆栈添加5的。
forth在哪里存储它的堆栈?它采用什么格式?这段代码如何通过将5移动到EBX来添加堆栈?
非常感谢任何人可以摆脱的任何光线或任何人可以指向我的文档(我一直在努力寻找相关的东西)。
谢谢大家!
编辑:我想知道是否是这样的:
在任何给定的时间,RBP包含堆栈顶部的地址(TOS),堆栈实际上只是内存的一部分。
因此,第一行加载到RBP中的地址比RBP中的当前地址大8个字节,因此RBP现在包含5将去往的地址。
第二行将RBX的内容复制到现在存储在RBP中的地址,该地址是堆栈顶部
然后第三行将5放入EBX,即RBX的低32位。
但是现在我很困惑。如果是这样的话,那么将5复制到EBX寄存器中如何影响RBP中包含的内存位置中的内容?将RBX复制到[RBP]并不意味着将来对RBX的任何更改(例如将5复制到EBX)都会反映在[RBP]中,是吗?
EDIT 2:对不起,错过了关于实现的细节。这是VfxForth,在x86_64上,linux版本。

mqkwyuun

mqkwyuun1#

VFX Forth(与许多其他现代Forth系统一样)将数据堆栈的顶部存储在寄存器中,其他堆栈元素存储在内存中。
参见“Inside the MPE VFX code generator”(pdf),第4页:

**堆栈 Shuffle **

在大多数处理器架构中,将项目保存在寄存器中是有益的。在大多数VFX实现中,存在由寄存器中的数据堆栈的顶部组成的规范堆栈表示,其他项目从数据堆栈指针索引。
在问题的例子中,数据堆栈的顶部存储在寄存器RBX中。因此,在将新值放入RBX之前,先前的值被移动到内存中。

相关问题