我正在使用的Forth版本(Mecrisp)缺少PAD字样。但是,它在这里。现在,我想我可以使用类似的东西来定义PAD:
hex deadbeef constant offset
: pad here offset + ;
我的问题是如何找到偏移量的安全值?实际上,偏移量是零字节是否安全 - 我猜PAD相当于HERE?
答案 0 :(得分:0)
一种安全的方法是在字典中为PAD分配专用缓冲区(通过ALLOT
)或在内存中动态分配(通过ALLOCATE
)。
一个例子:
1024 constant pad-size
create pad pad-size allocate
该标准仅保证PAD
尺寸的84个字符,请参阅3.3.3.6 Other transient regions部分:
PAD返回地址的临时区域的大小应为 至少84个字符。
一个好的Forth系统当然应该提供PAD
的可用大小(参见environmental queries),一个好的程序应该受到84个字符的限制或确定可用的大小。使用长度不确定的缓冲区是一种不好的做法,可能导致内存损坏错误,甚至是一般情况下的漏洞。
字典中的可用空间可以通过UNUSED
字来确定。但是这个空间在没有分配的情况下不能安全使用 - 因为许多Forth实现自己使用这个空间。例如,3.3.3.6部分中提到的所有缓冲区都可以位于字典可用空间区域中。但是,根据标准,PAD
缓冲区不得与内存中的其他缓冲区重叠。因此,需要知道特定的Forth系统实现细节,以确定安全offset
值并定义将使用字典可用空间的PAD
。了解这些细节的最可靠方法 - 阅读特定的Forth系统源代码。
即使在这种情况下,也可以定义如下内容:
: pad-size ( -- u ) unused offset - ; \ assuming that no other buffers after PAD
: pad-buf ( -- addr u ) pad pad-size ;