【问题标题】:How to initialize global data as pointer referring to a label?如何将全局数据初始化为引用标签的指针?
【发布时间】:2021-12-01 23:38:00
【问题描述】:

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/ 进行模拟。

【问题讨论】:

    标签: assembly marie


    【解决方案1】:

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

    是的,可以做到。

    虽然 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 位中具有相同的值。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多