Hey Stackoverflow我正在查看我们的教授留给我们研究的一些示例代码,并且我在理解某些代码的含义时遇到了一些问题,并且它的一些评论含糊不清。第一个是R3,R1,0;检查行结束,我得到的第二件事实际上是placeolnul开头背后的逻辑,最后是negeol的.fill值,看起来很奇怪,但我不明白为什么。如果你能真正帮助我解决这些问题,那将真正帮助我更好地理解代码。
.orig x3000
getstring:
lea r0,prompt ;get string prompt
puts
ld r1,negeol ;to test end of line
lea r2,rdbuff ;prep to read string
rdloop:
getc ;get string char
out
str r0,r2,0 ;store it
add r3,r1,r0 ;check for end of line
brz placeeolnul ;if so process
add r2,r2,1 ;ready for next char
br rdloop ;get it
placeeolnul:
and r0,r0,0 ;overwrite eol with
str r0,r2,0 ;nul
lea r1,rdbuff ;get address for len
jsr strlen ;get length
add r0,r0,0 ;if 0
brz quit ;then prog finished
trap xfc ;print length
lea r0,colon ;print colon
puts
lea r0,eol ;print lf
puts
br getstring ;go again
quit
halt
prompt: .stringz "Enter a string:"
eol: .fill x000d ; or x000a
.fill x0000
negeol: .fill xfff3 ; or xfff6
colon: .fill x003a
rdbuff .blkw 80
; length subroutine
strlen:
and r0,r0,0 ;counter for length
st r2,saveX2 ;save regs used
st r3,saveX3
add r2,r1,0 ;copy of string addr
cloop:
ldr r3,r2,0 ;get char
brz exit ;check for nul
add r0,r0,1 ;incr counter
add r2,r2,1 ;go to next char
br cloop ;process it
exit:
ld r2,saveX2 ;restore used regs
ld r3,saveX3
ret
saveX2: .blkw 1
saveX3: .blkw 1
.end
答案 0 :(得分:0)
关于这一点:
brz placeeolnul ;if so process
他在这里设置后续的“brz”以零分支。
所以我们将寄存器r1和r0的内容添加到r3中,这样如果r3为零,我们将分支到下一行:
ld r1,negeol ;to test end of line
请记住,r1已预先加载了基于此代码的值:
negeol
.fill xfff3 ; or xfff6
已根据以下代码加载r1,其值为标记negeol:
brz placeeolnul ;if so process
所以这只是通过添加EOL字符的补充来检测是否找到EOL字符的快速方法,这可能是xfff3。
关于brz语句及其逻辑(第二个问题):
add r2,r2,#1 ;ready for next char
br rdloop ;get it
如上所述,如果add为零,我们就在这里进行分支。如果我们不进行分支(意味着我们没有找到EOL字符),那么我们将继续,但该延续将基本上循环回到rdloop标记:
and r0,r0,#0 ;overwrite eol with
str r0,r2,#0 ;nul
.... etc...
如果我们通过brz行跳转,这意味着我们得到了整个字符串,我们已准备好处理它....所以跳转到placeeolnul只是将我们放入我们可以处理字符串的代码中:
{{1}}
不确定您是否对此部分代码也有疑问。
希望这有帮助。
杰夫