Как мне написать программу, которая печатает "Hello World" 5 раз, используя цикл в LC3?

.ORIG x3000
COUNTER .FILL x0005
LEA R0, HELLO_WORLD  
PUTS
HALT
HELLO_WORLD .stringz "Hello World this is John Cena!"
.END

Это код, который у меня есть для того, чтобы просто написать имя один раз, я запутался, как внедрить цикл в этот код, чтобы имя отображалось 5 раз.

3 ответа

Печать Hello World! 5 раз, используя цикл:

; +++ Intro to LC-3 Programming Environment +++

; Print "Hello World!" 5 times
; Use Loops to achieve the aforementioned output

; Execution Phase
.ORIG x3000 

LEA R0, HELLO   ; R0 = "Hello....!"
LD R1, COUNTER  ; R1 = 5

LOOP TRAP x22   ; Print Hello World
ADD R1, R1, #-1 ; Decrement Counter
BRp LOOP    ; Returns to LOOP label until Counter is 0 (nonpositive)

HALT

; Non-Exec. phase

HELLO .STRINGZ "Hello World!\n" ; \n = new line
COUNTER .fill #5        ; Counter = 5

.END    ; End Program

Удачи в выполнении заданий и изучении языка ассемблера LC-3! : D

Лучший способ сделать это - использовать эквивалент цикла for. Наша переменная предела цикла должна быть инвертирована с использованием дополнения 2, это дает нам -5. Затем мы добавляем наш счетчик циклов к -5, чтобы увидеть, равны ли они 0. Если ноль, то выпрыгнуть из цикла for.


.ORIG x3000
    AND R1, R1, #0  ; clear R1, R1 is our loop count
    LD R2, LIMIT    ; load our loop max limit into R2
    NOT R2, R2      ; Invert the bits in R2
    ADD R2, R2, #1  ; because of 2's compliment we have
                    ; to add 1 to R2 to get -5
FOR_LOOP
    ADD R3, R1, R2  ; Adding R1, and R2 to see if they'll
                    ; will equal zero
    BRz LOOP_END    ; If R1+R2=0 then we've looped 5
                    ; times and need to exit
    LEA R0, HELLO   ; load our string pointer into R0
    PUTs            ; Print out the string in R0
    LD R0, NEWLINE  ; load the value of the newline
    PUTc            ; print a newline char
    ADD R1, R1, #1  ; add one to our loop counter
    BRnzp FOR_LOOP  ; loop again
LOOP_END

HALT                    ; Trap x25

; Stored values
LIMIT   .FILL   x05     ; loop limit = 5
NEWLINE .FILL   x0A     ; ASCII char for a newline
HELLO   .STRINGZ "Hello World, this is NAME!"

.END

Я думаю, что использование цикла do while намного проще на машине LC3. И много меньше кода тоже.

.ORIG x3000
     AND R1,R1,#0      ;making sure register 1 has 0 before we start.
     ADD R1,R1,#6      ;setting our counter to 6, i will explain why in a sec

LOOP    LEA R0, HELLO_WORLD
        ADD R1,R1,#-1  ;the counter is decremented before we start with the loop
        BRZ DONE       ;break condition and the start of the next process
        PUTS
        BR LOOP        ;going back to the start of the loop while counter !=0

DONE    HALT           ;next process starts here, stopping the program

HELLO_WORLD .STRINGZ "HELLO WORLD\n"
.END

Причина, по которой я установил счетчик на 6, состоит в том, что он на самом деле уменьшается до того, как цикл действительно запускается, поэтому, когда цикл запускается, он фактически равен 5. Причина, по которой я это сделал, заключается в том, что инструкция BR связана с последним регистром, с которым вы играли. Если вы хотите установить его на 0, просто измените строку с ADD R1, R1, #6 на ADD R1, R1, #5. Измените цикл в этом.

LOOP LEA R0, HELLO_WORLD
     ADD R1, R1, #0
     BRZ DONE
     PUTS
     ADD R1, R1, #-1
     BR LOOP

Надеюсь это поможет!

Другие вопросы по тегам