这个LC-3程序的目的是要求用户输入一个0-49之间的数字。然后程序打印出与输入的数字相关的星号。附加的细节包括,当用户输入“q”时,程序退出并打印出一条再见消息。此外,如果用户输入0-49之外的数字,它打印“无效输入”。请再试一次消息“。最后程序忽略了除了数字和字母q之外的所有内容。用户输入3fds 5,程序仅读取35。
话虽如此,该程序的主要问题是,当用户在控制台窗口输入一个数字时,它会回显一个未知符号。同样,当输入无效输入或输入“q”时,它也不会recgonize。
这是密码
.ORIG x3000
; constants
LD R5, m48
LD R6, m50
START LEA R0, newline
OUT
OUT
LOOP ; prompt user for input
LEA R0, prompt
PUTS
; read user input
GETC ; read first character
ADD R1, R0, #-10 ; check if first character is a number
BRn INVALID_INPUT
ADD R0, R0, R5 ; convert ASCII code to binary
ADD R2, R0, #0
LEA R0, star
OUT ; echo first digit to console
GETC ; read second character
ADD R1, R0, #-10 ; check if second character is a number
BRn INPUT_COMPLETE
ADD R0, R0, R5 ; convert ASCII code to binary (R5 set to -48)
ADD R2, R2, R0
LEA R0, star
OUT ; echo second digit to console
GETC ; read third character (linefeed)
BRnzp LOOP ; ignore any additional input and loop back to prompt
INPUT_COMPLETE
ADD R0, R2, #0
BRn INVALID_INPUT ; check if input is negative
; check if input is within range
ADD R1, R0, R6 ; R1 = R0 - 50 (R6 set to -50)
BRn PRINT_STARS ; branch if R0 <= 49
BR INVALID_INPUT ; otherwise, input is invalid
PRINT_STARS
; print stars
LD R0, num
ADD R1, R0, #0
PRINT_LOOP LEA R0, star
OUT
ADD R1, R1, #-1
BRnzp PRINT_LOOP
; print "All Done"
LEA R0, newline
OUT
LEA R0, done
PUTS
LEA R0, newline
OUT
BRnzp LOOP
INVALID_INPUT
; print "Invalid input, try again!"
LEA R0, newline
OUT
LEA R0, invalid
PUTS
BR LOOP
; handle 'q' input
QUIT LEA R0, goodbye
PUTS
LEA R0, newline
OUT
HALT
; variables
num .FILL x0000 ; user-entered number
count .FILL x0000 ; number of stars to print
m48 .FILL #-48
m50 .FILL #-50
;Strings
newline .FILL x0A ; ASCII code for linefeed character
star .FILL x2A ; ASCII code for '*' character
prompt .STRINGZ "Enter a number (0-49): "
invalid .STRINGZ "Invalid input, try again!"
done .STRINGZ "All Done"
goodbye .STRINGZ "\n\nGoodbye!!!\n\n"
.END
1条答案
按热度按时间u91tlkcl1#
建议用伪代码来实现算法,或者更好的是用真实的的编程语言(比如C)来实现,这样你就可以调试和测试算法了。任何语言都可以操作ASCII数据和计算一些状态,所以你不必用汇编来实现算法。
然后将算法转换为汇编,通过将if-then和循环转换为它们的汇编等价物-这里有很多关于它的文章。
注意你在何时何地处理一个ASCII字符代码和一个转换成数字形式的ASCII数字。要确定一个ASCII字符是否是一个数字,检查是否在48和57之间,否则检查
q
是否有值113。只有在48和57之间才是一个数字,然后通过减去48可以得到数字的数值。如果用户输入2个数字,比如
first
和second
,已经从ASCII转换为数值(通过减去48),那么你想要的数字的值将由公式first
× 10 +second
计算,通过基本数学,以10为基数的2位数NM的值为N×101 + M×100。但是,如果用户只输入一个数字,那么数字的值(再次假设从ASCII转换为数字)就是
first
!对于
PUTS
,可以使用LEA
作为字符串标签,或者在R0
中放置一个指向字符串的指针-但是,对于OUT
,只需将一个要打印的字符放入R0
(不是指针,只是一个字符)。这个控制流永远不会到达
QUIT
,因为没有对这个标签的引用,所以没有到这个标签的分支,再加上前面的指令BR LOOP
是一个无条件分支,这使得从标签QUIT
开始的代码我们称之为不可达。