我正在练习使用数组和循环,我试图让用户在控制台中输入少于100个字符来填充我的数组。用户可以在输入完他们想要的字符数后按ENTER键,程序将再次打印出他们输入的内容。
程序工作,但我想知道程序如何检查,看看用户是否按下回车键。我有它,所以程序将添加#-10到输入的字符和回车是x 0A,这是十进制的10。我假设一旦程序检测到这一点,结果是0,如果假,并退出循环。这是我的想法过程。
另外,我如何更改代码,使退出字符可以是任何字符?
.orig x3000
LD R1,DATA_PTR ;load the memory address of array into R1
DO_WHILE_LOOP
GETC ;read characters into R0
OUT ;print R0 onto console as ASCII
STR R0,R1, #0 ;stores into memory location in R1
ADD R1,R1, #1 ;increment to next memory address
ADD R0,R0,#-10 ;looks at inputted character and checks if its is ASCII #10
BRp DO_WHILE_LOOP
LD R0,newline
OUT
LD R1,DATA_PTR
DO_WHILE_LOOP2
LDR R0,R1,#0 ;load R1 into R0
OUT ;print
ADD R2,R0,#0 ;move R0 to R2
LD R0,newline ;newline
OUT ;print
ADD R1,R1,#1 ;increment
ADD R2,R2,#-10 ;check if printed character is enter ASCII #10
BRp DO_WHILE_LOOP2 ;if not print next character(loop)
HALT
;Data
DATA_PTR .FILL ARRAY ;DATA_PTR gets the beginning of the ARRAY
newline .FILL x0A
ARRAY .BLKW #100
.END
1条答案
按热度按时间wfsdck301#
我假设一旦程序检测到这一点,结果为0,如果为假,则退出循环。
这里的结果0并不意味着“假”,而是输入字符和10之间的差是0,这意味着它正好是0xA或10(dec)。
注意:BRp的使用可能被认为是一个bug,尽管使用通常的模拟器,我在输入一个ASCII值小于10的字符时遇到了麻烦。
用高级语言来说,它是在说:
尽管使用BRnp意味着:
它更特定于换行符。
如果您需要不同的终止字符,请将减去的值变更为其他字符的值。
LC-3不提供减法,但是它可以“加”一个负数。但是,它不能使用相同的立即数形式
ADD
加一个小于-16的负数。因此,如果你想检查一个大于16的ascii字符,你必须使用add寄存器形式,并使用另一条指令将值加载到该寄存器,通常使用一个带标签的常量。使用.FILL和所需的值声明。而不是:
请执行以下操作:
在LC-3中,
ADD
指令设置条件代码。有三个条件码,N、Z和P,- N代表负数,Z代表零,P代表正数。如果您将零加到某个寄存器中,作为加法运算的一部分,这三个标志(条件码)将按如下方式设置:如果原始值为负,则为N;如果原始值为零,则为Z;如果原始值为正,则为P--因此,〈0,= 0,〉0。
如果我们使用
ADD
将一个非零值(此处为X,但为负数-X)与寄存器值V相加,则会得到以下标志:(all忽略溢出的可能性)。
然后,BR指令可以测试标志,如下所示:
如欲更改程序控制流,请打开:
| 关系式|理念|操作码|
| - -|- -|- -|
| 〈|不|棕色|
| 〉=|不是N| BRzp|
| 的|Z轴|巴西|
| !=的|不是Z| BRnp|
| 大于|P值|溴化丙啶|
| 小于等于|不是P|棕色|