我无法找出为什么循环没有停止-LC3

时间:2018-05-18 14:04:48

标签: 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

1 个答案:

答案 0 :(得分:0)

我只是浏览了这段代码。

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

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

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

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