3

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

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

但它没有直接的机制来初始化指针变量以通过汇编程序标签引用内存位置。因此,许多人要么组装两次,第一次计算某些数据的十六进制地址(然后调整源代码),要么将数据放在靠近开头(易于预先计算其地址)并在数据周围跳转开始。

有没有办法使用标签初始化指针?例如,我希望将带有标签的数据位置pointer初始化为保存/引用的地址array

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

但是,这是 MARIE 汇编中的语法错误。

能不能做到:初始化一个数据字来引用一个标签?

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

4

1 回答 1

4

能不能做到:初始化一个数据字来引用一个标签?

是的,这是可以做到的。

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

但是:MARIE 指令和数据都是 16 位宽的,但地址空间只有 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 位中相同的值。)

于 2021-12-01T23:38:00.290 回答