如何将全局数据初始化为引用标签的指针?

How to initialize global data as pointer referring to a label?

MARIE 严重依赖数据中的(全局)指针:它唯一的间接能力是通过 AddI、JumpI、LoadI 和 StoreI 引用内存位置。

例如,常见顺序是 LoadI pointer 取消引用,然后 Load pointer; Add One; Store pointer 为下一次使用推进指针。

但它没有直接机制来初始化指针变量以通过 assembler 标签引用内存位置。所以,很多要么 assemble 两次,第一次计算一些数据的十六进制地址(然后调整源代码),或者将数据放在靠近开头的地方(很容易预先计算其地址)然后跳转围绕开始时的数据。

有没有办法使用标签来初始化指针?例如,我希望将带有标签 pointer 的数据位置初始化为 hold/refer-to array 的地址:

pointer, DEC array
/ ...
array, DEC 1000
       DEC 1001
       DEC 1002

但是,这是 MARIE 程序集中的语法错误。

可以做到吗:初始化一个数据字来引用一个标签?

仅供参考,我正在使用 https://marie.js.org/ 进行模拟。

Can it be done: initializing a data word to refer to a label?

是的,可以做到。

虽然 DEC 和 HEX 通常用于声明 global/initialized 数据,但它们不接受标签作为参数,分别只接受十进制和十六进制常量。

然而:MARIE指令和数据都是16位宽,但是地址space只有12位宽。指令格式是 4 位操作码后跟 12 位地址(这些地址是绝对地址,而不是相对于 pc 的地址)。所以,我们可以用操作码为0的指令JnS来组成一个数据值,它是一个指向标签的指针。

pointer, JnS array  / this is intended as data, not code
                    / despite the use of an instruction opcode
/ ...
array, DEC 1000
       DEC 1001
       DEC 1002

(MAR 寄存器只有 12 位,所以当地址从 16 位 MBR 移动到 12 位 MAR 时,高 4 位被丢弃。因此,我们可以使用任何操作码来引用到标签,但使用值为 0 的操作码可能是最佳选择,因为那样的话,指针在 16 位中的值与在 12 位中的值相同。)