【问题标题】:LC-3 Assembly "Duplicate Label" ErrorLC-3 组件“重复标签”错误
【发布时间】:2018-02-09 05:00:05
【问题描述】:

编写一个汇编程序以从输入中打印两个字符,首先比较它们并首先打印具有较大 ASCII 代码的字符。我写了对我有意义的东西,但是汇编程序给了我错误“重复标签(R2)”。有谁知道为什么这不起作用?

.orig 3000 GETC LD R1,R0 GETC LD R2,R0 NOT R0,R2 ADD R0,R0,#1 ADD R0,R1,R0 BRN #3 OUT R1 OUT R2 BRNZP #2 OUT R2 OUT R1 HALT .end

还要补充一点,当我破坏代码并只用 R2 取出行时,它会为其他寄存器吐出错误。就像汇编器将寄存器识别为标签一样。

【问题讨论】:

  • 会不会是汇编器只接受小写的寄存器名?
  • 你在哪一行得到错误?

标签: assembly lc3


【解决方案1】:

LD R2,R0

你不要这样使用 LD。

语法为LD DR, LabelLD DR, PCOffset9

还有 OUT R1

OUT 是一个陷阱,打印出 R0 中的字符,并且只打印出 R0

也许汇编器有一个错误没有将这些错误标记为语法错误?

【讨论】:

  • R0 也是有效的标签/符号名称吗?这可以解释为什么它不是语法错误,而最终只是一个链接错误(如果其他错误没有首先停止汇编程序)。一些汇编程序(例如用于 x86 的 NASM)let you use $eax to refer to the label eax 在标签和寄存器之间不明确的情况下。
  • 顺便说一句,对于未来的读者:在寄存器中获取地址的 LC-3 加载指令是 LDI(间接加载)。
  • R0 不是有效的标签名称。我也相信你的意思是LDR。 LDI 仍然采用 Label 或 PCOffset。不同之处在于它将从内存中加载两次。 LDR 接受一个基址寄存器和一个偏移量,并将两者都视为要加载的地址。
  • 糟糕,是的,我的简短略读显然太简短了。但是,是的,如果即使在无法使用寄存器名称的上下文中也保留了寄存器名称,那么汇编程序应该会捕获该错误(除非它将ld 视为可以汇编为 LD 或 LDR 的伪操作)。
  • 是的,指令不区分大小写/ ld 将被解释为加载指令。 AFAIK 除了陷阱 OUT、PUTS、GETC、PUTSP、IN 和 HALT 之外,ISA 中没有正式的伪操作,是的,至少使用本书的工具,汇编程序报告以下错误“预期标签或 9 位签名 PC 偏移,但找到了‘R0’。”刚刚注意到我自己的 lc3 汇编器/模拟器会错误地报告未定义的符号 R0...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2013-06-22
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多