完全なオンライン コンピュータ サイエンス データベースとインターネット キャリア コー​​スの第 4 章の問題を最初から解決する

Wan Quannaonrain Konpyuta Saiensu Detabesutointanetto Kyaria Ko Suno Di 4 Zhangno Wen Tiwo Zui Chukara Jie Juesuru



問題とその解決策

1) 6502 µP の $0200 から始まり、2A94 の符号なし数値を追加するアセンブリ言語プログラムを作成します。 H 2ABFに(追加) H (オーギュンド)。入力と出力はメモリ内にあります。また、組み立てたプログラムドキュメントは手作業で作成してください。







解決:



CLC
LDA $0213
ADC $0215
STA $0217
LDA $0214
ADC $0216
STA $0218



組み立てられたプログラム:





2) 6502 µP に対して $0200 から始まり、符号なしの数値 1569 を減算するアセンブリ言語プログラムを作成します。 H (減数) 2ABF から H (被減数)。入力と出力をメモリ内に置きます。組み立てたプログラムドキュメントも手作業で作成します。



解決:

SEC
LDA $0213
SBC $0215
STA $0217
LDA $0214
SBC $0216
STA $0218

組み立てられたプログラム:

3) ループを使用して $00 から $09 までカウントアップする 6502 µP 用のアセンブリ言語プログラムを作成します。プログラムは $0200 から開始する必要があります。また、組み立てたプログラムドキュメントは手作業で作成してください。

解決:

LDA #$09
STA $0220 ; X と $09 を比較するため
LDX #$00
ループINX
CPX $0220
BNEループ

組み立てられたプログラム:

4) 6502 µP で $0200 から始まるアセンブリ言語プログラムを作成します。プログラムには 2 つのサブルーチンがあります。最初のサブルーチンは、符号なしの数値 0203 を加算します。 H (オーグエンド) と 0102 H (追加)。 2 番目のサブルーチンは、最初のサブルーチンの合計 (0305) を加算します。 H 0006へ H (オーギュンド)。最終結果はメモリに保存されます。最初のサブルーチン (FSTSUB) を呼び出し、2 番目のサブルーチン (SECSUB) を呼び出します。入力と出力はメモリ内にあります。また、プログラム全体をまとめたプログラムドキュメントも手作業で作成してください。

解決:

セクサブ CLC
LDA $021A
ADC $0234
STA $0236
LDA $021B
ADC $0235
STA $0237
RTS

FSTSUB CLC
LDA $0216
ADC $0218
STA $021A
LDA $0217
ADC $0219
STA $021B
RTS

JSR FSTSUB

組み立てられたプログラム:

5) 次のことを考慮すると、  ̄IRQ ハンドラーは、コア処理としてアキュムレーターで $02 を $01 に追加します。  ̄NMI が発行され、そのコア処理は  ̄NMI アキュムレータで $05 から $04 を追加するには、呼び出しを含む両方のハンドラーのアセンブリ言語を作成します。への呼び出し  ̄IRQ ハンドラーは $0200 のアドレスにある必要があります。の  ̄IRQ ハンドラーは $0300 のアドレスから開始する必要があります。の  ̄NMI ハンドラーは $0400 のアドレスから開始する必要があります。の結果  ̄IRQ ハンドラーは $0500 のアドレスに置かれ、その結果は  ̄NMI ハンドラーは $0501 のアドレスに置く必要があります。

解決:

NMISR PHA ; NMI ルーチンはここ $0400 アドレスから始まります
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
プライ
PLX
人民解放軍
RTI

ISR PHA ;この命令は $0300 アドレスにあります
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : ルーチンの一部ではないためコメントアウトされています
STA $0500;スタックに行きます
;
プライ
PLX
人民解放軍
RTI
;
JMP ISR ;この命令は $0200 アドレスにあります

6) 65C02 コンピュータでソフトウェア割り込みを生成するために BRK 命令がどのように使用されるかを簡単に説明します。

解決:

65C02 µP でソフトウェア割り込みを行う主な方法は、BRK 暗黙アドレス命令を使用することです。メインプログラムが実行中で、BRK 命令が発生したとします。その時点から、現在の命令が完了すると、PC 内の次の命令のアドレスがスタックに送信される必要があります。次に、ソフトウェア命令を処理するサブルーチンを呼び出す必要があります。この割り込みサブルーチンは、A、X、および Y レジスタの内容をスタックにプッシュする必要があります。サブルーチンのコアが実行された後、完了したサブルーチンによって、A、X、および Y レジスタの内容がスタックからそのレジスタに戻される必要があります。ルーチンの最後のステートメントは RTI です。 RTI により、PC のコンテンツもスタックから PC に自動的に戻されます。

7) 通常のサブルーチンと割り込みサービス ルーチンを比較対照する表を作成します。

解決:

8) アセンブリ言語命令の例を挙げて、65C02 µP の主なアドレッシング モードを簡単に説明します。

解決:

6502 の各命令は 1 バイトで、その後に 0 個以上のオペランドが続きます。

即時アドレス指定モード
即時アドレッシング モードでは、オペランドの後にはメモリ アドレスではなく値が入ります。値の前に # を付ける必要があります。値が 16 進数の場合は、「#」の後に「$」を続ける必要があります。 65C02 の即時アドレス指定命令は、ADC、AND、BIT、CMP、CPX、CPY、EOR、LDA、LDX、LDY、ORA、SBC です。この章で説明されていない、ここにリストされている命令の使用方法を知るには、読者は 65C02 µP のマニュアルを参照してください。命令の例は次のとおりです。

LDA #$77

絶対アドレス指定モード
絶対アドレッシングモードの場合、オペランドは 1 つです。このオペランドは、メモリ内の値のアドレスです (通常は 16 進数またはラベル)。 6502 µP には 64K10 = 65,53610 のメモリ アドレスがあります。通常、1 バイト値はこれらのアドレスのいずれかにあります。 65C02 の絶対アドレッシング命令は、ADC、AND、ASL、BIT、CMP、CPX、CPY、DEC、EOR、INC、JMP、JSR、LDA、LDX、LDY、LSR、ORA、ROL、ROR、SBC、STA です。 、STX、STY、STZ、TRB、TSB。読者は、ここにリストされている命令の使用方法、およびこの章で説明されていない残りのアドレッシング モードの使用方法を知るために、65C02 µP のマニュアルを参照する必要があります。命令の例は次のとおりです。

1234ドルです

暗黙のアドレッシングモード
暗黙のアドレッシング モードでは、オペランドはありません。関与するμP レジスタは命令によって暗示されます。 65C02 の暗黙のアドレス指定命令は次のとおりです: BRK、CLC、CLD、CLV、DEX、DEY、INX、INY、NOP、PHA、PHP、PHX、PHY、PLA、PLP、PLX、PLY、RTI、RTS、SEC 、SED、SEI、TAX、TAY、TSX、TXA、TXS、TYA。命令の例は次のとおりです。

DEX: X レジスタを 1 単位デクリメントします。

相対アドレッシングモード
相対アドレス指定モードは分岐命令のみを扱います。相対アドレッシング モードでは、オペランドは 1 つだけです。 -12810~+12710の値です。この値をオフセットと呼びます。符号に基づいて、この値はプログラム カウンタの次の命令から、目的の次の命令のアドレスの結果に加算または減算されます。相対アドレス モード命令は、BCC、BCS、BEQ、BMI、BNE、BPL、BRA、BVC、BVS です。指示の例は次のとおりです。

BNE $7F : (ステータス レジスタ P で Z = 0 の場合に分岐)

これにより、現在のプログラム カウンタ (実行するアドレス) に 127 が加算され、そのアドレスで命令の実行が開始されます。同様に:

BEQ $F9 : (ステータス レジスタ P の Z = : の場合に分岐)

これにより、現在のプログラム カウンタに -7 が加算され、新しいプログラム カウンタ アドレスで実行が開始されます。オペランドは 2 の補数です。

絶対インデックスアドレス指定
絶対インデックス アドレッシングでは、X または Y レジスタの内容が指定された絶対アドレス ($0000 ~ $FFFF、つまり 010 ~ 6553610) に追加されて実際のアドレスになります。この指定された絶対アドレスはベースアドレスと呼ばれます。 X レジスタを使用する場合、アセンブリ命令は次のようになります。

LDA $C453,X

Y レジスタを使用する場合は次のようになります。

LDA $C453,Y

X または Y レジスタの値はカウント値またはインデックス値と呼ばれ、$00 (010) から $FF (25010) までの値になります。オフセットとは言いません。

絶対インデックス アドレッシング命令は次のとおりです: ADC、AND、ASL (X のみ)、BIT (アキュムレータおよびメモリ付き、X のみ)、CMP、DEC (メモリおよび X のみ)、EOR、INC (メモリおよび X のみ)、LDA 、LDX、LDY、LSR (X のみ)、ORA、ROL (X のみ)、ROR (X のみ)、SBC、STA、STZ (X のみ)。

絶対間接アドレス指定
ジャンプ命令のみで使用します。これにより、与えられた絶対アドレスがポインタアドレスを持つことになります。ポインタアドレスは 2 バイトで構成されます。 2 バイトのポインタは、メモリ内の宛先バイト値を指します (そのアドレスです)。したがって、アセンブリ言語の命令は次のようになります。

JMP ($3456)

$3456 アドレスに括弧と $13 があり、$EB が $3457 (= $3456 + 1) アドレスにある場合、宛先アドレスは $13EB で、$13EB はポインタです。絶対 $3456 は説明書の括弧内にあります。

9) a) 「I love you!」というメッセージを表示する 6502 機械語プログラムを作成してください。 $0300 アドレスから始まるメモリ内の ASCII コードの文字列の長さ。プログラムは $0200 アドレスから開始する必要があります。何らかのサブルーチンによって 1 つずつアキュムレータに送信されると仮定して、アキュムレータから各文字を取得します。また、プログラムは手作業でアセンブルしてください。 (「I love you!」の ASCII コードを知りたい場合は、次のとおりです: 'I':4916、スペース : 2016、'l': 6C16、'o':6F16、'v':7616、' e':65、'y':7916、'u':7516、および '!':2116。注: 各コードは 1 バイトを占有します。

b) 「I love you!」というメッセージを表示する 6502 機械語プログラムを作成してください。メモリ内の ASCII コードの文字列。文字列の長さなしで $0300 アドレスから始まり、0016 で終わります。プログラムは $0200 アドレスから開始する必要があります。何らかのサブルーチンによって 1 つずつアキュムレータに送信されると仮定して、アキュムレータから各文字を取得します。また、プログラムは手作業で組み立ててください。

解決:

a) 戦略: 文字列には 12 バイトがあります: 文字列の長さ用に 1 バイト、文字列リテラル用に 11 バイトです。したがって、0 から数えて 12 回の反復 (ループ) が必要です。つまり、0、1、2、3、4、5、6、7、8、9、10、11。これらは 12 個の数値です。

整数 0 が X レジスタに入れられ、数値 1110 = 1210 – 110 = B16 = $0B がメモリ内のアドレス位置、たとえばアドレス $0250 に入れられます。反復ごとに、X レジスタの値がインクリメントされ、その結果が $0250 アドレス位置の $0B と比較されます。 X の値が $0B の値と等しくなった直後、反復は停止します。この時点で、文字列の長さ (バイト数) と文字列リテラルは、$0300 ~ $030B (両端の値を含む) のアドレス位置を占めます。メモリアドレスを $0300 からインクリメントするには、Y レジスタが使用されます。コードは次のとおりです。

LDA #$0B
$0250です
LDX #$00
LDY #$00
STA $0300 ; 11 の長さはサブルーチンによって A に入れられ、$0300 になります。
ループINX
そこには
0250円
BEQループ

b) 戦略: 文字列には 12 バイトがあります。$00 Null ターミネータに 1 バイト、文字列リテラルに 11 バイトです。したがって、0 から数えて 12 回の反復 (ループ) が必要です。つまり、0、1、2、3、4、5、6、7、8、9、10、11。これらは 12 個の数値です。

整数 0 が X レジスタに入れられ、数値 1110 = 1210 – 110 = B16 = $0B がメモリ内のアドレス位置、たとえばアドレス $0250 に入れられます。反復ごとに、X レジスタの値がインクリメントされ、その結果が $0250 アドレス位置の $0B と比較されます。 X の値が $0B の値と等しくなった直後、反復は停止します。この時点で、文字列リテラルのバイト数に Null 文字を加えたものが、$0300 ~ $030B (両端を含む) のアドレス位置を占めます。メモリアドレスを $0300 からインクリメントするには、Y レジスタを使用します。コードは次のとおりです。

LDA #$0B
$0250です
LDX #$00
LDY#$00
STA $0300 ; 「I」はサブルーチンによって A に入れられ、$0300 になります。
ループINX
そこには
0250円
BEQループ