1

嘿 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
4

1 回答 1

0

对此:

add r3,r1,r0 ;check for end of line

在这里,他正在为随后的“brz”设置零分支。

因此,我们将寄存器 r1 和 r0 的内容相加,并将它们放入 r3,这样如果 r3 为零,我们将分支到下一行:

 brz placeeolnul ;if so process

请记住,r1 已经根据以下代码预加载了一个值:

ld r1,negeol ;to test end of line

它已根据以下代码在标签 negeol 处加载了 r1 的值:

negeol
    .fill xfff3 ; or xfff6

所以这只是一种通过添加 EOL 字符的补语来检测是否找到 EOL 字符的快速方法,这里大概是 xfff3。

关于 brz 声明及其逻辑(您的第二个问题):

brz placeeolnul ;if so process

如前所述,如果 add 为零,我们将在此处进行分支。如果我们不分支(意味着我们没有找到 EOL 字符),那么我们将继续,但该继续将本质上循环回 rdloop 标记:

 add r2,r2,#1 ;ready for next char
 br rdloop ;get it

如果我们确实通过 brz 行跳转,这意味着我们得到了整个字符串,并且我们已经准备好处理它......所以跳转到 placeeolnul 只是将我们放入可以处理字符串的代码中:

 and r0,r0,#0 ;overwrite eol with
 str r0,r2,#0 ;nul
 .... etc...

不确定您是否对这部分代码也有疑问。

希望这可以帮助。

杰夫

于 2017-12-04T15:35:26.503 回答