如何在MARIE汇编中初始化指向标签地址的全局指针数据
结论
标准MARIE汇编(含你使用的marie.js模拟器)原生不支持直接在DEC/HEX伪指令中传入标签作为初始化值,你写的pointer, DEC array确实会报语法错误,但可以通过运行时动态赋值的方案实现同等需求,不需要手动计算地址、也不需要两次汇编。
具体实现方案
核心逻辑是利用MARIE指令的地址字段本身会自动解析标签的特性,把标签地址通过指令运算写入指针变量:
- 编写一条加载目标标签的指令,这条指令在汇编时会自动把标签对应的内存地址填入指令的地址位
- MARIE指令为16位格式,高4位是操作码,低12位是地址,把上述指令的低12位提取出来就是目标标签的内存地址
- 把提取出的地址写入指针变量即可完成初始化
可运行示例代码
/ 主程序入口,跳过数据区 ORG 0 JUMP Start / 指针变量 pointer, DEC 0 / 常量:提取地址用的掩码,对应二进制0000111111111111 AddrMask, HEX 0FFF / 目标数组 array, DEC 1000 DEC 1001 DEC 1002 One, DEC 1 Start, / -------------------------- / 初始化pointer为array的地址 / -------------------------- Load GetArrayAddr / 把下方的Load array指令本身加载到累加器AC AND AddrMask / 抹除高4位操作码,剩余低12位就是array的内存地址 Store pointer / 写入指针变量,初始化完成 / -------------------------- / 测试1:读取array[0] / -------------------------- LoadI pointer / 此时AC值为1000,验证初始化有效 / -------------------------- / 测试2:前移指针读取array[1] / -------------------------- Load pointer Add One Store pointer LoadI pointer / 此时AC值为1001,验证指针操作正常 HALT / 注意:这条指令仅用于存储array的地址,永远不会被执行 GetArrayAddr, Load array
方案说明
该方案完全兼容标准MARIE汇编规则,不需要手动计算地址、也不需要两次汇编,在marie.js模拟器中可直接运行通过。
内容的提问来源于stack exchange,提问作者Erik Eidt
相关产品推荐
相关产品推荐

