2011-08-12 24 views
0

以下SIC/XE機のアセンブリ言語コードは、これはブートストラップローダであるsicxeアセンブリ言語プログラミング

 clear a 
    ldx #128 
loop jsub getc 
    rmo a,s 
    shift s,4 
    jsub getc 
    addr s,a 
    stch 0,x 
    tixr x,x 
    j loop 



getc td input 
    jeq getc 
    rd input 
    comp #4  ;if input is 4 then eof 
    jeq 80  ;jump to start of program 
    comp #48 ; compare to charcter 0 
    jlt getc ;skip charcters less than 0 
    sub #48  
    comp #10 ;if result is less than 10, conversion is complete 
    jlt return 
    sub #7  ;for hex digits A through F 
return rsub 
input byte x'F1' 

.... ...ているこのプログラムの目的は、装置F1から読み取ると80から始まるアドレスに入力を保存する...今私の質問は、なぜシフトs、4をする必要があるのか​​...入力を1回とると、ascii値から元の値を見つけて送信するそれを格納するために 'ループ'する...プログラムからは、最初にチャタラクタの半分のバイトだけがループに送られ、次に他のものが送られるように見える...これが最初の場合、最初の半バイトはcharcterと同様に、上半身のascii操作は私たちに入力の本当の価値を与えません...またw鶏は、プログラムが...リスト内の他の文字は、次のヘルプのために同じ本からのラインです...代わりに読まれることはありません「のgetc」もう半分のバイトを取得するために

each byte of the code to be loaded is on device F1 as two hexadecimal digits 
+0

「宿題」タグが必要ですか? –

答えて

0

を返すことコードは、ASCII文字列にエンコードされた数値をバイト値に変換します。

したがって、文字列 'A5'を指定すると、数字165がメモリ内のバイトに格納されます。

バイト値ごとに2回読み込みが必要です。 (文字列 'A5'には2つの文字があり、 'A'と '5'です。)

getcルーチンは最初の文字を読み込みます。 ASCII値65(41 hex)ルーチンは48を引いた後、再び7を引く65-48-7 = 10、16進数Aの10進表記A

ループはこの値をシフトする4最初に読み取った文字が2バイト文字列の上位バイトだったからです。

次回getcが呼び出されると、文字 '5'が読み込まれます。 53のコードを有する。53-48は5である。

ループは、以前に格納された160の値に5を加算し、合計165を返します。

このコードスニペットは、ASCIIエンコードされた16進数をバイト値に変換します。バイト値を構成するには2つの文字が必要です。