如何在LMC中实现动态大小表格并向不同地址存入数据?
LMC动态表格存储实现方案
你的核心问题是未利用间接寻址模拟数组的动态存储,原代码始终将数据写入同一固定地址,无法实现多位置存储。LMC没有原生数组语法,但可以通过「指针+间接寻址」实现动态表格,具体实现如下:
实现思路
- 先输入表格大小N,存入变量
SIZE; - 用
PTR变量存储表格的起始内存地址,每存入一个数据就将PTR加1,指向下一个存储位置; - 用计数器
COUNT记录已存入数据的数量,当COUNT等于SIZE时停止输入; - 可选添加验证环节:遍历表格输出所有数据,确认存储结果。
修正后的LMC代码
LDA TAB ; 加载表格起始地址到累加器(需根据模拟器内存分配调整,此处假设TAB地址为16) STA PTR ; 初始化写入指针为表格起始地址 INP ; 输入表格大小N STA SIZE LDA ZERO STA COUNT ; 初始化计数器为0 LOOP LDA COUNT SUB SIZE BRZ INIT_PRINT ; 计数器等于表格大小,结束输入准备打印 INP ; 输入要存入的数据 STA [PTR] ; 间接寻址:将数据写入指针指向的内存地址 LDA PTR ADD ONE STA PTR ; 指针+1,指向表格下一个位置 LDA COUNT ADD ONE STA COUNT ; 计数器+1 BRA LOOP INIT_PRINT LDA PTR SUB ONE STA PTR_PRINT ; 初始化打印指针为最后一个数据的地址 BRA PRINT_LOOP PRINT_LOOP LDA COUNT BRZ HALT ; 计数器归0,打印完成 LDA [PTR_PRINT] ; 间接寻址加载当前指针指向的数据 OUT ; 输出数据 LDA PTR_PRINT SUB ONE STA PTR_PRINT ; 指针-1,指向前一个数据位置 LDA COUNT SUB ONE STA COUNT ; 计数器-1 BRA PRINT_LOOP HALT HLT SIZE DAT ; 存储表格大小 PTR DAT ; 写入用的地址指针 COUNT DAT ; 计数变量 PTR_PRINT DAT ; 打印用的地址指针 ZERO DAT 0 ONE DAT 1 TAB DAT ; 表格起始位置,后续内存自动分配用于存储数据
关键说明
- 间接寻址:
STA [PTR]是核心逻辑,它会将累加器的值存入PTR变量所指向的内存地址,通过修改PTR的值就能动态切换存储位置; - 模拟器兼容性:部分LMC模拟器对间接寻址的语法支持不同,如果
[PTR]不生效,可替换为STA PTR,I(I表示间接寻址); - 打印逻辑:示例中从最后一个数据往前输出,若需要从第一个开始输出,只需调整打印指针的初始值和增减方向即可。
内容的提问来源于stack exchange,提问作者Dereck
相关产品推荐
相关产品推荐

