LC-3汇编程序逻辑OR运算模块故障求助(附完整代码)
LC-3汇编逻辑OR运算模块问题修复
核心问题分析
你的OR运算模块存在几个关键错误,导致无法生成正确结果:
- 未执行OR运算:代码中直接覆盖了第一个数的位,没有将两个数的位进行OR操作,反而错误使用了AND指令。
- 错误的寄存器操作:在LOOP3中,第二个
LDR R4, R4, #0是非法操作,它试图将R4的值作为内存地址读取内容,而不是读取第二个数的对应位。 - 结果输出逻辑错误:当前输出部分直接将RESULT数组的结束地址传入R0执行OUT,这只会输出一个随机字符,而非4位二进制结果。
- 语法错误:
INPUT2段中的LEA, R0, PROMPT2多了逗号,违反LC-3语法。
修正后的完整代码
.ORIG x3000 LEA R5 , SECOND_NUMBER LEA R6, FIRST_NUMBER LEA R0, PROMPT1 ; Load address of prompt1 into R0. PUTS ; Print prompt1. LD R3, MAX_DIGITS ; Load the maximum number of digits allowed. LD R4, MAX_DIGITS2 LOOP: GETC ; Read in a single character to R0. OUT ; Echo the character. ; Check for 'q' to quit LD R1, ASCII_q NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz THANKS1 ; Check for '1' LD R1, ASCII_1 NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz LOAD1 ; Check for '0' LD R1, ASCII_0 NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz LOAD2 ; Invalid input, loop again BRnp LOOP LOAD1: LD R0, ONE ; Load the value ONE into R0 BRnzp STORE LOAD2: LD R0 , ZERO BRnzp STORE STORE: STR R0, R6, #0 ADD R6, R6, #1 ADD R3, R3, #-1 ; Decrement count BRz INPUT2 ; If count reaches zero, move to second input BRp LOOP INPUT2: LEA R0, PROMPT2 ; Fixed: removed extra comma PUTS LOOP2: GETC ; Read in a single character to R0. OUT ; Echo the character. ; Check for 'q' to quit LD R1, ASCII_q NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz THANKS1 ; Check for '1' LD R1, ASCII_1 NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz LOAD3 ; Check for '0' LD R1, ASCII_0 NOT R1, R1 ADD R1, R1, #1 ADD R2, R0, R1 BRz LOAD4 ; Invalid input, loop again BRnp LOOP2 THANKS1: ; Label for thanks message LEA R0, THANKS ; Load the address of the thanks message into R0. PUTS ; Display the thanks message. HALT LOAD3: LD R0, ONE ; Load the value ONE into R0 BRnzp STORE1 LOAD4: LD R0 , ZERO BRnzp STORE1 STORE1: STR R0, R5, #0 ADD R5, R5, #1 ADD R4, R4, #-1 ; Decrement count BRz ORFUNCTION ; If count reaches zero, perform OR BRp LOOP2 ORFUNCTION: LEA R1, FIRST_NUMBER ; Load address of FIRST_NUMBER into R1 LEA R2, SECOND_NUMBER ; Load address of SECOND_NUMBER into R2 LEA R3, RESULT ; Load address of RESULT into R3 LD R5, FOUR ; Counter for looping through each bit LOOP3: LDR R4, R1, #0 ; Load a bit from FIRST_NUMBER LDR R7, R2, #0 ; Load corresponding bit from SECOND_NUMBER OR R4, R4, R7 ; Perform logical OR on the two bits STR R4, R3, #0 ; Store the OR result in RESULT ADD R1, R1, #1 ; Move to the next bit in FIRST_NUMBER ADD R2, R2, #1 ; Move to the next bit in SECOND_NUMBER ADD R3, R3, #1 ; Move to the next bit in RESULT ADD R5, R5, #-1 ; Decrement counter BRp LOOP3 ; Repeat the loop while counter is positive ; Display the result in the console LEA R0, RESULT_PROMPT ; Load address of the result string into R0 PUTS ; Print the result string ; Convert each result bit to ASCII and output LEA R3, RESULT LD R5, FOUR PRINT_LOOP: LDR R0, R3, #0 ADD R0, R0, ASCII_0 ; Convert binary 0/1 to ASCII '0'/'1' OUT ADD R3, R3, #1 ADD R5, R5, #-1 BRp PRINT_LOOP ; Print final newline LD R0, NEWLINE OUT HALT ; Data section MASK .FILL x0001 FOUR .FILL #4 ONE .FILL x0001 ZERO .FILL x0000 NEWLINE .FILL x000A ; ASCII newline character RESULT .BLKW #4 MAX_DIGITS .FILL #4 MAX_DIGITS2 .FILL #4 FIRST_NUMBER .BLKW 4 ; Array to store the first number digits SECOND_NUMBER .BLKW 4 ; Array to store the second number digits THANKS: .STRINGZ "\nThank you for playing!" ; Updated to match requirement PROMPT1: .STRINGZ "\nEnter First Number (4 binary digits): " ; Formatted as per requirement PROMPT2: .STRINGZ "\nEnter Second Number (4 binary digits): " ; Formatted as per requirement RESULT_PROMPT .STRINGZ "\nThe OR function of the two numbers is: " ; Formatted as per requirement ASCII_0 .FILL x0030 ASCII_1 .FILL x0031 ASCII_q .FILL #113 .END
关键修改说明
修复OR运算逻辑:
- 在LOOP3中,用
LDR R7, R2, #0读取第二个数的对应位,然后通过OR R4, R4, R7执行逻辑OR操作,正确计算每一位的结果。 - 移除了多余的
AND R4, R4, R6指令,因为我们存储的已经是单个0/1位,无需掩码。
- 在LOOP3中,用
修复结果输出:
- 添加了
PRINT_LOOP循环,遍历RESULT数组中的每一位,将二进制0/1转换为ASCII码(加上ASCII_0的值),然后逐个输出,确保显示4位二进制结果。 - 添加了
NEWLINE常量,在结果输出后打印换行符,符合需求。
- 添加了
语法与文本修正:
- 修正了
INPUT2段中LEA, R0, PROMPT2的语法错误,移除了逗号。 - 更新了提示语和感谢语的文本格式,与需求完全匹配。
- 修正了
代码结构优化:
- 给LOOP和LOOP2添加了冒号,符合LC-3标签语法规范。
内容的提问来源于stack exchange,提问作者Christian Mihalik
相关产品推荐
相关产品推荐

