2016-03-05 2 views
1

Я пытаюсь написать программу LC-3, которая будет подсчитывать количество вхождений символа, которое пользователь вводит в строкой, жестко закодированной. У части, с которой у меня возникают проблемы, является проверка, совпадают ли два символа друг с другом, и у меня также возникает проблема с перемещением следующего символа в строке, чтобы проверить его. ; Программа для подсчета вхождений полукокса в строкеLC-3 Программа для подсчета вхождения символа в строке

.ORIG x3000 
LD R3, POSASC ;Loads R3 with #48 
LD R4, NEGASC 
LD R1, word ;R1 = word 

ADD R6, R6, #5 ;Length of word 
GETC   ;Gets the char 
OUT   ;Prints the char 
ADD  R2, R2, R0 ;Stores the char in R2 
;ADD R2, R2, R4 ;To ascii 
AND R0, R0, #0 ;set R0 back to 0 
LOOP  
AND  R5, R2, R1 ;check if char is equal 
ADD  R1, R1, #1 ;increment to next char in word 
ADD R6, R6, #-1 
BRnp LOOP 

ADD R0, R0, R5 ;Set R0 to # of occurrences 
OUT   ;Print # of occurrences 

HALT 
POSASC .FILL x0030  ;#48 
word .STRINGZ "hello" ;word to count occurrences of a char 
NEGASC .FILL xFFD0  ;#-48 
.END 

ответ

0

Я решил это:

.ORIG x3000 
    LEA  R1, word  ;load address of word 
    LD  R4, ascii 
    GETc     ;get char 
    OUT      ;display char 
    ADD  R6, R6, #5  ;# of chars in word 
    ADD  R2, R0, R2  ;put char in R2 

    NOT  R2, R2 
    ADD  R2, R2, #1  ;R2 now has 2's complement of char 

next AND  R0, R0, #0  ;clear R0 
    LDR  R0, R1, #0  ;get char of word 
    ADD  R0, R0, R2  ;add 2's complement to char of word 
    BRz  equals 
    BRnp unEqual 

equals ADD  R5, R5, #1  ;add 1 to counter if equal 

unEqual ADD  R1, R1, #1  ;move to next letter 
    ADD  R6, R6, #-1  ;decrement # of letters in word 
    AND  R0, R0, #0  ;clear R0 
    ADD  R0, R6, R0  ;test if done 
    BRp next 

    ADD  R0, R5, R0  ;put counter in R0 
    ADD  R0, R4, R0  ;convert to ascii 
    OUT 

    HALT 
word .STRINGz "hello" 
ascii .FILL #48 
    .END 
0

Это в основном проблема, как работать со строками и массивами. В начале, когда вы отправитесь в адрес памяти, который представляет «слово», и вы получаете байт. Итак, в этой точке R1 = 'h'.

Однако позже вы пытаетесь перебирать струны, с

ADD R1, R1, #1 

Теперь, R1 = «Н» + 1 = «я», который является не то, что вы хотели. То, что вы сделали, увеличивает ваши данные из адреса памяти, а не увеличивает адрес. Поэтому вместо того, чтобы начинать с LD, который загружает данные с метки памяти, начинайте с LEA, который загружает эффективный адрес метки памяти. Есть еще одна инструкция по загрузке, которая также пригодится, что является LDR. Это загружает данные с адреса, расположенного в регистре. Итак:

LD R1,word  ; "h" 
LEA R2,word ; memory address of word 
LDR R3,R2,#0 ; "h" 
word: .STRINGZ "hello" 

Теперь, если вы считаете, что R2 = R2 + # 1 не будет увеличивать сами данные, а также адрес, вы можете увидеть следующее:

LD R1,word  ; "h" 
ADD R1,R1,#1 ; "h"+1="i" 
LEA R2,word ; memory address of word 
ADD R2,R2,#1 ; (memory address of word) +1 
LDR R3,R2,#0 ; "e" 
word: .STRINGZ "hello" 

Надеемся, что это будет решать ваши проблемы ,

p.s. Вы также считаете, что регистры инициализируются до нуля. На симуляторе есть команда, которая рандомизирует память перед запуском - это вызовет полный хаос вашего кода и может произойти в реальном аппаратном обеспечении. Инициализируйте память перед ее чтением.

Смежные вопросы