我必须为这个问题做一个LC-3代码,因为我是LC-3的新手,所以我遇到了一些麻烦:
编写一个LC-3汇编语言程序,执行以下操作:
1.向屏幕输出一条消息,提示用户输入LC-3汇编语言指令(如ADD)。用户按Enter/Return结束输入。
1.如果用户输入的指令是一条法律的LC-3汇编语言指令,程序将显示相应的4位操作码。例如,如果用户输入“ADD”,程序将打印出“0001”。
1.如果用户键入的指令不是法律的LC-3汇编语言指令(例如,“ADDD”),则程序将显示相应的错误消息。
1.显示输出后,程序循环回到顶部,重新初始化所有需要重新初始化的内容,然后再次执行。
1.当用户键入字符串“QUIT”并按Enter/Return键时,程序将退出。
下面是我的代码:
.ORIG x3000
; Constants for comparison
ADD_STR .STRINGZ "ADD"
AND_STR .STRINGZ "AND"
JMP_STR .STRINGZ "JMP"
BR_STR .STRINGZ "BR"
QUIT_STR .STRINGZ "QUIT"
; Memory locations
MESSAGE .STRINGZ "Enter an LC-3 assembly language instruction (type QUIT to exit): "
USER_INPUT .BLKW #20
MAIN
LEA R0, MESSAGE ; Display the prompt message
PUTS
; Read user input
LEA R0, USER_INPUT ; Store user input here
GETC ; Read the first character
OUT ; Echo the character
; Loop to read input until Enter/Return is pressed
LOOP
GETC ; Read the next character
OUT ; Echo the character
BRZ END_LOOP ; Exit loop if Enter/Return is pressed
STR R0, R1, #0 ; Store the character in memory
ADD R1, R1, #1 ; Move to the next memory location
BRNZP LOOP ; Repeat the loop
END_LOOP
; Compare user input to known instructions
LEA R1, USER_INPUT ; Load the input string pointer
LEA R2, ADD_STR ; Load ADD instruction pointer
LEA R3, AND_STR ; Load AND instruction pointer
LEA R4, JMP_STR ; Load JMP instruction pointer
LEA R5, BR_STR ; Load BR instruction pointer
LEA R6, QUIT_STR ; Load QUIT instruction pointer
; Compare input with ADD
CMP_ADD
LDR R7, R1, #0 ; Load a character from input
LDR R0, R2, #0 ; Load a character from ADD string
NOT R0, R0 ; Get the 2's complement of ADD character
ADD R0, R0, #1 ; Add 1 to compare with input character
ADD R7, R7, #1 ; Prepare to compare next character
BRnp ADD_CHECK ; Check condition
ADD_CHECK
BRz IS_ADD ; If both characters match, it's ADD instruction
BRnzp CMP_AND ; Else, check for AND instruction
IS_ADD
; Display the opcode for ADD
LEA R0, ADD_STR ; Load ADD instruction string
PUTS ; Display it
BRnzp MAIN ; Go back to the main loop
CMP_AND
; Similar comparison process for AND
; ... (Repeat the above process for AND, JMP, BR, QUIT)
; Handling for other instructions and errors can be written similarly
; Handle QUIT instruction
QUIT_CHECK
; ...
; Other instruction checks and error messages go here
; Loop back to the beginning
BRnzp MAIN
.END
字符串
问题是程序没有正确处理用户的输入,“Enter an LC-3 assembly language instruction(type QUIT to exit):is printed but when I try put(e.g. ADD)nothing is returned,以及不工作的QUIT指令. Also I'm not sure how to finish up with my code for this project. I hope someone can help me out. Thanks.
1条答案
按热度按时间sbdsn5lh1#
首先,提高你的调试技能,如果你还不知道调试,现在是学习的好时机。调试汇编代码很像调试其他语言:单步执行每一行,以确保它正在做什么,在这一点上需要的。一个丢失或错误的指令将破坏整个程序-任何给定的指令都取决于前面的指令是有用的和正确的。
第二,不要等到你写了几十行代码之后才第一次运行调试器。更好的做法是写几行代码,然后在调试器中一步一步地运行它们。观察新指令对CPU寄存器和数据内存的影响。你从中学到的东西将有助于指导项目其余部分的开发。
如果你在这段代码上启动调试器,你可能会感到困惑,为什么在你的代码之前有数百条
NOP
指令,这是因为你把你的数据放在了入口点。由于.ORIG
语句,模拟器将在x3000启动程序,然而,这正是你的数据所在的地方。补救很简单,有两个选择,或者(1)将数据移动到代码之后,因此main
是第一个实际的指令,-或者-(2)不移动数据,但将BR main
放在数据之前,因此模拟器/程序跳过数据并继续执行真实的代码。Jester是正确的,
BRZ
正在测试空字符,在这里不起作用,因为GETC
永远不会给予空字符。GETC
是一个控制台输入功能,键盘上没有空键供用户输入。一个更好的选择是测试换行符,因为这是GETC
可以给予的真实的字符。Jester也是正确的,你有一些重复的代码re:GETC
看起来很奇怪/不需要-没有理由将用户输入的第一个字符视为特殊/与其他字符不同。输入循环使用
R1
作为指针存储字符,但没有将任何特定值放入R1
,因此将存储到内存中的位置0和/或R1
中先前使用的剩余值,而不是缓冲区。您的代码稍后使用缓冲区,但这不是字符去的地方。这在单步调试中也可以观察到- R1没有与缓冲区地址匹配的值,而且,更进一步,store并没有把字符放入缓冲区。你可以识别你的缓冲区的地址,我称之为了解你的数据-你可以在调试器中在步进程序指令之前这样做,当你知道你的数据的地址时,可以帮助你识别错误的指针你正确地做了2的补码求反来比较字符,但是两个字符串中的字符没有相加,所以实际上,减法没有发生。
一旦减法运算成功(通过将两个字符相加,一个字符来自一个字符串,另一个字符来自另一个字符串),这将设置条件码,因此您应该执行
add
和条件分支(例如BRZ
)作为一个序列。如果你把其他指令放在中间,(比如指针递增1,就像你做的那样),这将用一个新值擦除条件码-而指针算术并没有有效地设置条件码。所以,你需要将最后的add
(执行减法/比较),或者重新测试结果以恢复条件代码(例如,使用ADD R4, R4, #0
,这将重新测试R4
的条件,而其他方面是无害的)。如果你以你建议的方式测试每一个可能的命令,你会得到很多几乎是纯重复的代码。有更好的方法,你只有一个比较循环,但是给它不同的起点来检查各种不同的字符串。但是你的方法应该工作,尽管有重复,可能更容易。