LC3汇编代码报错:第28行.END前出现未识别标签或语法错误
错误原因
你遇到的报错是两个规则冲突导致的:
.END是LC3汇编的汇编器伪指令,仅用来告诉汇编器「源代码到这里结束」,本身不会被翻译成任何CPU可执行的机器指令,不能出现在程序的运行时代码逻辑中。- 你把
.END直接放在EOP标签的下一行,而代码中多处用JSR EOP试图跳转到EOP位置执行指令,汇编器扫描到EOP指向的位置没有合法的可执行指令,只有伪指令.END,就会抛出对应语法错误。
另外你代码里还有一个隐性逻辑问题:JSR是跳转子程序指令,会自动把返回地址存入R7寄存器,而你的EOP是程序结束的入口,不需要返回,用JSR属于不必要的操作,后续也没有对应的RET返回指令,运行时会出现不可预期的异常。
修复方案
- 在
EOP标签下方添加LC3的合法停机指令HALT(等价于TRAP x25),作为程序执行到结束位置的实际运行指令。 - 将
.END伪指令单独放在整个源代码的最后一行,和运行时代码逻辑分隔开。 - 可选优化:把所有的
JSR EOP替换为JMP EOP,直接跳转不需要存储返回地址,更符合程序结束的逻辑。
修复后的完整代码
.ORIG 0x300 NUMBER: .FILL x0006 NUMBER2: .FILL x0003 R1MAGG: .FILL x0999 UGUALI: .FILL 0x500 R1MIN: .FILL x0001 LD R1, NUMBER LD R2, NUMBER2 ;I stored in R1 and R2 2 numbers ;Now I compare them NOT R2, R2 ADD R2, R2, #1 ADD R3, R1, R2 BRp R1MAGGIORE BRn R1MINORE LD R4, UGUALI JMP EOP R1MAGGIORE: LD R4, R1MAGG JMP EOP R1MINORE: LD R4, R1MIN JMP EOP EOP: HALT .END
内容的提问来源于stack exchange,提问作者Shark44
相关产品推荐
相关产品推荐

