【发布时间】: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 次。
【问题讨论】:
.ORIG x3000
COUNTER .FILL x0005
LEA R0, HELLO_WORLD
PUTS
HALT
HELLO_WORLD .stringz "Hello World this is John Cena!"
.END
这是我到目前为止只写一次名称的代码,我很困惑如何在这段代码中实现循环,以便名称将显示 5 次。
【问题讨论】:
打印 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
【讨论】:
我认为在 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
希望这会有所帮助!
【讨论】: