我找不到循环不停止的原因-LC3

I can't find out why the loop isn't stopping-LC3

我只是一个超级新手,就像我只学习了 12 小时的方法一样,我想知道为什么我的循环没有停止。你能帮我找出问题所在吗?我知道这段代码很垃圾,请多多包涵

所以我们的任务是让用户要求用户输入一个最多80个字符的字符串,并且应该以句点结尾,因为这是我们判断它是否是字符串结尾的基础。该程序将对字符和单词进行计数并显示出来,但在我的情况下,该程序不会停止。请帮忙。

.ORIG X3000

LEA R0, PROMPT_ENTER ;Message for entering number.
PUTS
LEA R2, SENTENCE ;allocated memory
AND R3, R3, #0 ;setting R3 to zero for word counter.
ADD R3, R3, #1
AND R1, R1, #0 ;setting R4 to zero for char counter.

;---------ASKING USER TO INPUT A SENTENCE------
GET_USER_INPUT: ;loop for getting characters.               
GETC                                     
OUT                                  
STR R0, R2, #0   ;r0 -> ( memory address stored in r2 + 0 )
PUT                             
ADD R2, R2, #1    ;increments the memory pointer                  
ADD R0, R0, #-10    ;decrements loop to proceed when pressed enter.
BRz COUNT_LENGTH
BRnp GET_USER_INPUT 



;--------Element counter----
COUNT_LENGTH:
AND R0, R0, #0
LEA R4, SENTENCE
LDR R0, R4, #0
ADD R0, R0, #-10
BRz EMPTY
BRnp COUNT_ELEMENTS

EMPTY:
AND R0, R0, #0
LEA R0, PROMPT_NULL
PUTS
HALT


COUNT_ELEMENTS:
AND R0, R0, #0
LEA R4, SENTENCE
LDR R0, R4, #0
LD R6, TMNT
ADD R0, R0, R6
BRz END_OF_SENTENCE
LDR R0, R4, #0
LD R6, SPACE
ADD R0, R0, R6
BRz WORD_COUNT
ADD R4, R4, #1
ADD R1, R1, #1
BRnp COUNT_ELEMENTS

WORD_COUNT:
ADD R4, R4, #1
ADD R3, R3, #1
JSR COUNT_ELEMENTS

END_OF_SENTENCE:
AND R0, R0, #0
LDR R3, R3, #0
LD R5, ASCII
ADD R0, R0, R5
OUT
AND R0, R0, #0
LDR R1, R1, #0
ADD R0, R0, R1
OUT

HALT

SENTENCE .BLKW #80 ;initialize the array named sentence with length 80
TMNT .fill #-89
SPACE .fill #-32
ASCII .fill #48
;----MESSAGES------
PROMPT_ENTER .stringz "Enter the word(maximum 80 characters): \n"
PROMPT_AGAIN .stringz "Do you want to try again? Y/N: \n"
PROMPT_NULL .stringz "Error: Please enter a sentence!"
PROMPT_NOTMNT .stringz "Error: No terminating symbol (.) is expected at the end!"
PROMPT_DSPACE .stringz "Error: Multiple white space is not allowed!"
.END

我只是浏览了这段代码。

这是一个无限循环,因为您在 COUNT_ELEMENTS 的每次迭代中都将 R4 重置为指向 SENTENCE 的开头。

我可以在你的代码中看到你在返回 COUNT_ELEMENTS 之前递增 R4(顺便说一句,如果你想无条件地使用 BR 分支,JSR 仅用于调用子例程)。

您希望将 R4 设置为仅指向 SENTENCE 一次。我相信您可以简单地删除 COUNT_ELEMENTS 中的 LEA R4, SENTENCE,因为它之前被设置为 COUNT_LENGTH.

的一部分

将来我会建议在 lc3 模拟器中提取您的代码,并逐步检查寄存器的值。