我正在练习使用数组和循环,并试图让用户在控制台中输入少于100个字符来填充我的数组。每当用户输入完他们想要的字符数后,就可以按ENTER键,程序将再次打印出他们输入的内容。
该程序可以工作,但我想知道该程序是如何检查用户是否按ENTER键的。我有它,所以程序会把#10加到输入的字符上,ENTER是x0A,十进制为10。我假设一旦程序检测到这一点,结果为0,如果为false,则退出循环。这就是我的思考过程。
此外,我该如何更改我的代码,使其可以使退出字符为任何字符?
.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
我假设一旦程序检测到这一点,结果为0,如果为false,则退出循环。
这里的结果0的含义不是"0";false"——但是输入字符和10之间的差是0,这意味着它恰好是0xA或10(dec(。
注意:使用BRp可能会被认为是一个错误,尽管使用通常的模拟器时,我在输入ascii值小于10的字符时遇到了问题。
在高级语言术语中,它所说的是:
do { ... } while ( in > 10 );
尽管使用BRnp意味着:
do { ... } while ( in != 10 );
更具体地说是换行符。
如果需要不同的终端字符,请将减去的值更改为另一个字符的值。
LC-3不提供减法;添加";负数。但是,它不能使用ADD
的相同立即数形式来添加小于-16的负数。因此,如果你想检查一个大于16的ascii字符,你必须使用加法寄存器形式,并使用另一条指令加载带有值的寄存器,通常使用一个标记的常量,用.FILL和你想要的值声明。
代替:
ADD R2,R2,#-10 ;check if printed character is enter ASCII #10
BRp DO_WHILE_LOOP
执行以下操作:
LD R3, value ; load value to subtract
ADD R2, R2, R3 ; subtract them
BRnp DO_WHILE_LOOP
...
...
value, .FILL #-65 ; letter A, negated.
在LC-3中,ADD
指令设置条件代码。
有三个条件代码,N、Z和p,-N表示负,Z表示零,p表示正。如果将零添加到某个寄存器,作为加法运算的一部分,这三个标志(条件码(将设置如下:如果原始值为负,则为N;0,=0,>0.
如果我们使用ADD
将一个非零值,这里是X(但在其否定中,-X(添加到寄存器值V,我们会得到一些标志,告诉我们:
- N=(V<X(,即如果V<X
- Z=(V=X(即如果V=X则Z为真
- P=(V>X(,即P为真;X
(全部忽略溢出的可能性(。
然后,BR指令可以测试以下标志:
如果您想更改程序流的控制:
主题代码