2017-12-03 4 views
1

私は教授が私たちに勉強してもらいたいいくつかのサンプルコードを書きました。コードの意味を理解していて、曖昧。最初のものはR3、R1,0です。行末を確認してください、私が得ない2番目の事は実際にはplaceolnulの始まりの背後にあるロジックです。最後に、特に不思議なnegeolの.fill値ですが、理由は分かりません。あなたが本当にそれらの問題で私を助けることができれば、コードをよく理解する助けになります。これに関してはLC-3命令の理解

.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

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

は、ここで彼はゼロに分岐する、後続の "BRZ" のために設定されます。

R3がゼロであれば、我々は次の行に分岐しますようだから我々は、レジスタR1の内容を加算し、R0とR3でそれらを入れている:

brz placeeolnul ;if so process 

r1はすでに前であることを忘れないでくださいこのコードあたりのタグnegeolで値がR1をロードした

ld r1,negeol ;to test end of line 

negeol 
    .fill xfff3 ; or xfff6 
このコードに基づいて値がロード

これは、EOL文字の補数を追加することでEOL文字が見つかったかどうかを簡単に検出する方法です。これはおそらくxfff3です。 BRZの声明とそのためのロジック(あなたの第二の質問)について

:アドオンがゼロの場合、前述のように

brz placeeolnul ;if so process 

、我々はここで分岐されています。我々は(我々はEOL文字を見つけられませんでしたという意味)分岐していない場合、我々は継続されますが、その継続が基本的にループバックは、タグrdloopします:

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

我々はBRZラインを介してジャンプしない場合は、その手段をあなたはこの部分での質問がある場合

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

わからない:ので、ちょうど私たちは、文字列を処理できるコードに私たちを置くplaceeolnulにジャンプ....我々は、文字列全体を得た、と我々はそれを処理する準備ができていますコードの

これが役に立ちます。

Jeff