assembly LC-3汇编语言Sentinel-Controlled Loop(哨兵控制循环)为什么当我按回车键时我的代码就结束了?

3vpjnl9f  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在练习使用数组和循环,我试图让用户在控制台中输入少于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
wfsdck30

wfsdck301#

我假设一旦程序检测到这一点,结果为0,如果为假,则退出循环。
这里的结果0并不意味着“假”,而是输入字符和10之间的差是0,这意味着它正好是0xA或10(dec)。
注意:BRp的使用可能被认为是一个bug,尽管使用通常的模拟器,我在输入一个ASCII值小于10的字符时遇到了麻烦。
用高级语言来说,它是在说:

do { ... } while ( in > 10 );

尽管使用BRnp意味着:

do { ... } while ( in != 10 );

它更特定于换行符。
如果您需要不同的终止字符,请将减去的值变更为其他字符的值。
LC-3不提供减法,但是它可以“加”一个负数。但是,它不能使用相同的立即数形式ADD加一个小于-16的负数。因此,如果你想检查一个大于16的ascii字符,你必须使用add寄存器形式,并使用另一条指令将值加载到该寄存器,通常使用一个带标签的常量。使用.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;如果原始值为零,则为Z;如果原始值为正,则为P--因此,〈0,= 0,〉0。
如果我们使用ADD将一个非零值(此处为X,但为负数-X)与寄存器值V相加,则会得到以下标志:

  • N =(V〈X),即如果V〈X则N为真,
  • Z =(V = X),即如果V = X,则Z为真,并且,
  • P =(V〉X),即如果V〉X,则P为真

(all忽略溢出的可能性)。
然后,BR指令可以测试标志,如下所示:
如欲更改程序控制流,请打开:
| 关系式|理念|操作码|
| - -|- -|- -|
| 〈|不|棕色|
| 〉=|不是N| BRzp|
| 的|Z轴|巴西|
| !=的|不是Z| BRnp|
| 大于|P值|溴化丙啶|
| 小于等于|不是P|棕色|

相关问题