【问题标题】:How do I write a program that prints out “Hello World”, 5 times using a loop in LC3?如何编写一个程序,在 LC3 中使用循环打印 5 次“Hello World”?
【发布时间】:2015-11-09 00:28:12
【问题描述】:
.ORIG x3000
COUNTER .FILL x0005
LEA R0, HELLO_WORLD  
PUTS
HALT
HELLO_WORLD .stringz "Hello World this is John Cena!"
.END

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

【问题讨论】:

    标签: loops lc3


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我认为在 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
        

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          • 2012-10-06
          • 1970-01-01
          • 2015-05-04
          • 2013-01-24
          • 2013-08-23
          • 1970-01-01
          相关资源
          最近更新 更多