LC3汇编程序无输出问题求助:报错禁止使用LEA指令
解决LC3汇编的LEA报错与字符串无输出问题
首先说那个报错:"expected label or 9 bit signed pc offset but found lea instead"——这个错误十有八九是你把LEA指令放错地方了!LC3里的分支类指令(比如BR、BRn、BRz这些跳转指令)要求操作数是标签(汇编器会把它转换成9位PC偏移量),但你可能在本该写分支标签的位置写了LEA,导致汇编器直接懵圈了。
替代LEA的方案
如果你的环境真的限制使用LEA(标准LC3其实是支持的,但万一遇到特殊情况),要实现「把标签的地址加载到寄存器」的功能,可以用LD指令配合一个存储地址的内存单元:
比如你原本写的是:
LEA R0, MY_STRING
改成这样就能达到同样效果:
; 先在数据段定义一个单元,专门存储MY_STRING的地址 MY_STRING_ADDR .FILL MY_STRING ; 再用LD把这个地址加载到寄存器里 LD R0, MY_STRING_ADDR
解决字符串无输出的问题
你的程序没输出,大概率是字符串读取/存储的逻辑有漏洞,或者输出时没满足PUTS指令的要求。这里给你一个经过验证的「读字符串+输出」完整示例,你可以对比自己的代码找问题:
.ORIG x3000 ; 初始化:让R1指向字符串缓冲区的起始位置 LEA R1, STRING_BUF READ_LOOP TRAP x20 ; 调用GETC,读取一个字符到R0 ADD R2, R0, #-10 ; 判断是不是回车(ASCII码x0A) BRz END_READ ; 如果是回车,停止读取 STR R0, R1, #0 ; 把当前字符存入缓冲区 ADD R1, R1, #1 ; 缓冲区指针向后移动一位 BR READ_LOOP ; 继续读取下一个字符 END_READ AND R0, R0, #0 ; 清零R0,准备存储结束符 STR R0, R1, #0 ; 在字符串末尾添加x00结束符(PUTS必须遇到这个才会停止输出) ; 开始输出字符串 LEA R0, STRING_BUF ; 让R0指向字符串的起始地址 TRAP x22 ; 调用PUTS输出字符串 HALT ; 程序结束 ; 数据段:定义100字节的缓冲区,用来存放输入的字符串 STRING_BUF .BLKW 100 .END
你可以重点检查自己代码里的这几个常见问题:
- 读取字符串后有没有添加
x00结束符?PUTS会从R0指向的地址开始输出,直到遇到x00才停止,没加的话可能输出乱码或者直接无输出 - 输出时R0有没有正确指向字符串的起始地址?如果地址错了,
PUTS根本找不到要输出的内容 - 是不是之前的
LEA语法错误导致程序执行流程混乱?先把语法问题修好,再排查逻辑问题
内容的提问来源于stack exchange,提问作者wissam hammoud
相关产品推荐
相关产品推荐

