2017-11-18 8 views
0

私は、ファイル内のcharの出現回数をカウントするプログラムを、遠くのメモリ位置に一致が発生した16進アドレスのリストを格納するように適合させようとしています。コード:すぐに遠いメモリアドレスにプログラムカウンタを移動することはできますか?

011 0000 0000 0000 ;Codes x3000 as Load-address of program 
0101 010 010 1 00000 ;R2 <- 0 
0010 011 000010000 ;R3 <- M[x3012] 
1111 0000 0010 0011 ;TRAP x23 (Loads INPUT into R0) 
0110 001 011 000000 ;R1 <- M[R3] 
;LOOP BEGINS HERE 
0001 100 001 1 11100 ;R4 <- R1 - EOT 
0000 010 000001000 ;If above = 0, exit loop 
1001 001 001 111111 ;R1 <- NOT R1 
0001 001 001 1 00001 ;R1 <- R1 + 1 
0001 001 001 0 00 000 ;R1 <- R1 + R0 
0000 101 000000001 ;If above != 0, do NOT increment counter 
0001 010 010 1 00001 ;R2 <- R2 + 1 (increment counter) 
0001 011 011 1 00001 ;R3 <- R3 + 1 (increments pointer to next char in file) 
0110 001 011 000000 ;R1 <- M[R3] (loads next char into R1) 
0000 111 111110110 ;BRnzp x3004 (unconditionally RETURN to loop start) 
;LOOP ENDS HERE 
0010 000 000000100 ;R0 <- M[x3013] 
0001 000 000 0 00 010 ;R0 <- R0 + R2 
1111 0000 0010 0001 ;TRAP x21 (OUTPUT) 
1111 0000 0010 0101 ;TRAP x25 (HALT) 
0011 0001 0000 0000 ;Codes x3100 for the starting address of the file 
0000 000 000110000 ;ASCII template 

私のプログラムはメモリアドレスx3000から始まります。私は、x300B( "インクリメントR2"命令の下)でリストを処理する一連の命令を開始したいと考えています。問題は、私はx3500でリストを開始したいと思います。そこに到達する「効率的な」方法はわかりません。

私の元の計画は、ロード間接(LDI)命令を使用することでしたが、符号拡張のために、9ビットオフセットは最大x00FF = 0000 0000 1111 1111のオフセットしか許さず、x300C (プログラムカウンタをインクリメントしてx300B)をx310Bに設定します。

私が思いついた唯一の本当の「回避策」は、アドレス有効値(LEA)命令を使用してレジスタx310Bをレジスタ(R5など)に格納し、値x00FFをR6に格納して繰り返しx3408(3つのADD命令が必要です)になるまでR6をR5に追加します。その時点で、R6に値x0092を格納し、R5に追加して、R5にx3500を追加します。その時点で

、残りは簡単です((R5 +カウンタの店舗R3)、リスト上の適切な「スポット」に現在のマッチのアドレスを入れます)

私が実際に持っていません上で説明したx3500に到達するための全体的な方法は、実際には面倒で不器用に思えるので、これをまだ実行していません。私は、同時に多くのメモリアドレスを移動するためのより良い、早い方法が必要であるという気持ちを揺さぶることはできません。

x300Cからx3500への単一命令の移行は可能ですか?私が現在持っているものよりも2つでも良いでしょう。

答えて

1

そうしたくはありませんが、これを行うにはLD(opcode 0010)とLDR(opcode 0110)を使用する方が簡単な方法です。 PCをx3500にジャンプさせる必要はありません(あなたの配列のデータを悪い状態で実行し始めるでしょう)

アドレスにビットが含まれています0011 0101 0000 0000 オペコード0010はx3500をレジスタに。オペコード0110を使用すると、配列から値をロードできます。

関連する問題