0

以下は、sic/xe マシンのアセンブリ言語コードです。

     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.. .入力を一度取得すると、その ascii 値から元の値を見つけ、それを「ループ」に送信して保存します...プログラムからは、最初の半バイトの文字のみがループに送信され、次にその他...これが事実である場合、最初にcharcterの最初の半分のバイトがあるため、最初の半分のASCII操作は入力の実際の値を提供しません...また、プログラムが「getc」に戻ったとき' 残りの半バイトを取得するために、代わりにリスト内の他の文字が読み取られることはありません...以下は同じ本からのヘルプの行です...

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

1 に答える 1

0

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

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

各バイト値に対して 2 つの読み取りを行う必要があります。(ご覧のとおり、文字列 'A5' には 'A' と '5' の 2 つの文字があります。

getc ルーチンは最初の文字を読み取ります。私の例では、これは 'A' で、ASCII 値は 65 (41 hex) です。ルーチンは 48 を減算し、さらに 7 を減算します。65-48-7 = 10、これは 16 進数 A の 10 進数表記です。

次に、ループはこの値を 4 桁シフトし、値は 160' になります。これは、最初に読み取った文字が 2 バイト文字列の上位バイトだったためです。

次に getc が呼び出されると、コードが 53 の文字 '5' が読み取られます。53-48 は 5 です。

次に、ループは以前に保存された値 160 に 5 を追加し、正しい合計 165 を与えます。

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

于 2011-08-12T13:23:58.367 に答える