LC-3汇编语言Sentinel控制循环当我按下回车键时,我的代码为什么会结束



我正在练习使用数组和循环,并试图让用户在控制台中输入少于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指令可以测试以下标志:

如果您想更改程序流的控制:

主题代码<N>不是N=ZBRz=而非ZBRnp>P<而非PBRnz

相关内容

  • 没有找到相关文章

最新更新