assembly LC-3汇编代码未正确处理用户输入

woobm2wo  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(55)

我必须为这个问题做一个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.

sbdsn5lh

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的条件,而其他方面是无害的)。
如果你以你建议的方式测试每一个可能的命令,你会得到很多几乎是纯重复的代码。有更好的方法,你只有一个比较循环,但是给它不同的起点来检查各种不同的字符串。但是你的方法应该工作,尽管有重复,可能更容易。

相关问题