兼容的方式是使用C@
和按位运算。为了在内存中使用与 Forth 系统相同的字节顺序,需要检测字节顺序并编译某些定义的合适版本。
\ These definitions use little-endian format in memory.
\ Assumption: char size and address unit size equal to 1 octet.
: MB! ( x addr u -- )
ROT >R OVER + SWAP
BEGIN 2DUP U> WHILE R> DUP 8 RSHIFT >R OVER C! 1+ REPEAT
2DROP RDROP
;
: MB@ ( addr u -- x )
0 >R OVER +
BEGIN 2DUP U< WHILE 1- DUP C@ R> 8 LSHIFT OR >R REPEAT
2DROP R>
;
为了获得更高的性能,最好使用实现特定的功能(包括W@
、T@
、Q@
、SP@
等)甚至内联 Forth 汇编程序。
请注意,通过DO
循环直接定义通常性能较差(取决于优化器;在 SP-Forth/4.21 中为 10%)。供参考的代码:
: MB! ( x addr u -- )
OVER + SWAP ?DO DUP I C! 8 RSHIFT LOOP DROP
;
: MB@ ( addr u -- x )
DUP 0= IF NIP EXIT THEN
0 -ROT
1- OVER + DO 8 LSHIFT I C@ OR -1 +LOOP
;
?DO
由于减少了循环索引和+LOOP
语义,我们不能在第二种情况下使用:当索引越过“循环限制减一和循环限制之间的边界”时,它会离开圆圈。