LC-3如何重置柜台?

时间:2013-11-25 00:33:46

标签: lc3

任何人都可以运行此程序,或者试着帮助我理解为什么我的计数器没有更新?

我应该从提示中读取文本,找到文本的长度并用冒号输出,然后打印出输入的实际文本。

如果我第一次输入“test”时长度为4,但是当它循环返回以启动时它要求我再次输入,它会输出正确的文本,但除非文本更长,否则计数器不会改变。

所以,如果我输入“I”,它将输出4的长度,因为测试更长并且是4.但是如果我输入7个字母的“Control”,它会将计数器更新为7。

输出:

Enter: Hey
 3:Hey
Enter: Test
 4:Test
Enter: Control
 7:Control
Enter: Hey
 7:Hey      <---- Length should be 3!

谢谢!

.orig x3000             ; Starting point of the program.

BR start            ; Branch to the start routine.

newln:  .stringz "\n"
msg1:   .stringz "Enter: "

; Prints out the instructions to the user and reads some user input.

start:

lea r0, newln           ; Load address of newline into R0.
puts                    ; Print newline.

lea r0, msg1            ; Load address of message3 into R0.
puts  

lea r2, MESSAGE         ; Load starting point address of MESSAGE.
and r1, r1, #0          ; Initialize R1 to zero.

input:
getc                        ; Read in a single character to R0.
out
add r5, r0, #-10        ; Subtract 10 because enter key is 10.
BRz printint                ; If zero, branch to checkChar routine.
                            ; Else continue the loop.
str r0, r2, #0          ; Store char in MESSAGE.
add r2, r2, #1          ; Increment index of MESSAGE.
add r1, r1, #1          ; Increment input counter.
BR input                ; Unconditional branch to input.

checkChar:
lea r5, inv81           ; Load address of inv68 into R6.
ldr r5, r5, #0          ; Load contents of inv68 into R6 (R6 now holds     -68).
add r0, r3, r5          ; Add -68 to the value in R3, to check if it's 'q'.
BRz quit                ; If zero, branch to decrypt.



;
;print integer starts here
;
printint:
ld      r3,psign
jsr STRLEN
    ADD     r7, r0, #0     ; get the integer to print

    brzp    nonneg
    ld      r3,nsign
    not     r7,r7
    add     r7,r7,1
nonneg:
    lea     r6,buffer  ; get the address of o/p area
    add     r6,r6,#7   ; compute address of end of o/p
    ld      r5,char0   ; get '0' to add to int digits
loop1:
    and     r0,r0,#0   ; init quotient for each divide
loop2:
    add     r7,r7,#-10 ; add -10
    brn     remdr      ; until negative
    add     r0,r0,#1   ; incr to compute quotient
    br      loop2      ; repeat
remdr:
    add     r7,r7,#10  ; add 10 to get remainder
    add     r7,r7,r5   ; convert to ascii
    str     r7,r6,0    ; place ascii in o/p
    add     r7,r0,#0   ; move quot for next divide
    brz     end        ; if done then print
    add     r6,r6,#-1  ; move to prev o/p position
    br      loop1      ; repeat
end:
add     r6,r6,#-1  ; move to prev o/p position
    str     r3,r6,0    ; place sign
    add     r0,r6,#0   ; move address of 1st char 
    puts               ; into r0 and print

output:
ld r5, colon
and r3,r3, 0;
add r0, r3, r5;
out

lea r2, MESSAGE         ; Load (starting) address of MESSAGE.

outputLoop:
ldr r0, r2, #0          ; Load contents of address at MESSAGE index into R0.
out                     ; Print character.
add r2, r2, #1          ; Increment MESSAGE index.
add r1, r1, #-1         ; Decrease counter.

BRp outputLoop          ; If positive, loop.

br start
quit:

halt  ; Halt execution.

STRLEN:
 LEA    R2, MESSAGE ;R1 is pointer to characters
 AND    R0, R0, #0  ;R0 is counter, initially 0
     LD R5, char0


LOOP:    ADD     R2, R2, #1 ;POINT TO NEXT CHARACTER
 LDR     R4, R2, #0 ;R4 gets character input
 BRz     FINISH
 ADD     R0, R0, #1
 BR  LOOP

FINISH: 
 ADD     R0, R0, #1
 ret

MESSAGE:  .blkw         99          ; MESSAGE of size 20.
inv48:    .fill         #-48        ; Constant for converting numbers from     ASCII to decimal.
inv81:    .fill     #-81        ; Constant for the inverse of 'Q'.
buffer:   .blkw   8          ; o/p area
null:     .fill   0          ; null to end o/p area
char0:    .fill   x30
colon     .fill   x3A
nsign     .fill   x2d
psign     .fill   x20
  .end

1 个答案:

答案 0 :(得分:2)

在您的示例结束时,从消息开始的内存中的内容是: Heytrol0000000

在我看来,问题是在STRLEN中我们通过计算来计算字符串的长度,直到我们到达第一个字符为0.“Heytrol”中有7个字符。

但是,当我们存储消息时,我们会计算我们读入的字符数(保留在r1中)。当我们稍后打印字符串时,我们使用r1中的值,因此我们不会打印任何“额外”字符。

要解决这个问题,我要输出r1中的值,该值是在读取字符串作为其长度时计算出来的(完全除去STRLEN代码)或确保当我们在输入循环中读取输入时,我们在进行打印之前在字符串中写入零:

input:
getc                    ; Read in a single character to R0.
out
add r5, r0, #-10        ; Subtract 10 because enter key is 10.
BRz finishString        ; If zero, branch to finishString routine.
                        ; Else continue the loop.
str r0, r2, #0          ; Store char in MESSAGE.
add r2, r2, #1          ; Increment index of MESSAGE.
add r1, r1, #1          ; Increment input counter.
BR input                ; Unconditional branch to input.

finishString:
and r0, r0, #0          ; set r0 to zero so we can store it
str r0, r2, #0          ; write zero (from r0) into the end of the string
BR printint             ; Now, branch to checkChar routine.