PAD偏离此处

时间:2018-02-21 11:09:53

标签: forth

我正在使用的Forth版本(Mecrisp)缺少PAD字样。但是,它在这里。现在,我想我可以使用类似的东西来定义PAD:

hex deadbeef constant offset
: pad here offset + ;

我的问题是如何找到偏移量的安全值?实际上,偏移量是零字节是否安全 - 我猜PAD相当于HERE?

1 个答案:

答案 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 ;