如何使用LC3中的循环编写打印出“Hello World”的程序5次?

时间:2015-11-09 00:28:12

标签: loops lc3

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

这是我到目前为止只编写一次名称的代码,我很困惑如何将循环实现到此代码中,以便名称将显示5次。

3 个答案:

答案 0 :(得分:1)

打印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

答案 1 :(得分:0)

实现此目的的最佳方法是使用等效的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

答案 2 :(得分:-1)

我认为在LC3机器上使用do while循环要容易得多。还有很多不那么编码。

.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的行更改为 添加R1,R1,#5。将循环更改为此。

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

希望这有帮助!