gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:36:43 24 4
gpt4 key购买 nike

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

例如常见的序列,是对LoadI pointer进行解引用,然后是Load pointer;加一;存储指针 以推进指针以供下次使用。

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

有没有办法使用标签来初始化指针?例如,我希望将带有标签 pointer 的数据位置初始化为保存/引用 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 通常用于声明全局/初始化数据,但它们不接受标签作为参数,分别只接受十进制和十六进制常量。

然而: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 位中的值相同。)

关于assembly - 如何将全局数据初始化为引用标签的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70192600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com