assembly 组件LC-3从用户输入0-49打印星形

noj0wjuj  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(144)

这个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
u91tlkcl

u91tlkcl1#

建议用伪代码来实现算法,或者更好的是用真实的的编程语言(比如C)来实现,这样你就可以调试和测试算法了。任何语言都可以操作ASCII数据和计算一些状态,所以你不必用汇编来实现算法。
然后将算法转换为汇编,通过将if-then和循环转换为它们的汇编等价物-这里有很多关于它的文章。
注意你在何时何地处理一个ASCII字符代码和一个转换成数字形式的ASCII数字。要确定一个ASCII字符是否是一个数字,检查是否在48和57之间,否则检查q是否有值113。只有在48和57之间才是一个数字,然后通过减去48可以得到数字的数值。
如果用户输入2个数字,比如firstsecond,已经从ASCII转换为数值(通过减去48),那么你想要的数字的值将由公式first × 10 + second计算,通过基本数学,以10为基数的2位数NM的值为N×101 + M×100。
但是,如果用户只输入一个数字,那么数字的值(再次假设从ASCII转换为数字)就是first
对于PUTS,可以使用LEA作为字符串标签,或者在R0中放置一个指向字符串的指针-但是,对于OUT,只需将一个要打印的字符放入R0(不是指针,只是一个字符)。
这个控制流永远不会到达QUIT,因为没有对这个标签的引用,所以没有到这个标签的分支,再加上前面的指令BR LOOP是一个无条件分支,这使得从标签QUIT开始的代码我们称之为不可达。

相关问题