0

まず第一に、私はネイティブ スピーカーではないことを指摘しておきたいので、私の間違いを気にしないでください :) ですから、単純なアセンブリ コマンドには大きな問題があります。問題は、このコマンドがユーザーと対話する「強力な」方法。ここに来ます:

LogisimでCPUを構築しています(特別なことは何もありません。そのプログラムに慣れようとしており、「スキル」を向上させようとしています)。それで、私はJavaでアセンブリトランスレータをプログラミングしています(CPUの命令セットに適合するアセンブリ入力、バイナリおよび16進出力)。しかし、私は大きな問題に直面しています...^^

私は実際に --PRINT "text"-- コマンドを追加することを計画していました.assemblytranslatorはすべての文字に対して7ビットのASCII番号を生成し、次のような出力を生成します:

アセンブリ入力: PRINT "hello world"

CPU の出力

プリント h

プリント e

印刷 l

印刷 l

印刷 o

印刷 (スペース)

[...]

これは、私の CPU が一度に 1 文字しか印刷できないためです :( さて、これに関する問題は、BRANCH コマンドを実行しようとしたときに発生します。

たとえば、私の翻訳者プログラムの行は Line: 2 で、この行に 5 文字の長さのテキストを出力します。したがって、次のコマンドは 3 行目にありますが、CPU はちょうど 5 文字を出力したので、Programcounter は現在 8 行目を指しており、Translator の 3 行目は実際には Programcounter の 8 行目にあることを意味します。

どうすればそれを修正できますか?CPUが実際に実行する各「PRINT」コマンドの後にインクリメントする特殊レジスタを追加し、分岐したい行に追加しますか? または、誰かが文字を画面に出力するためのより良い方法を持っていますか?

事前にすべての回答をありがとう、

セール

4

1 に答える 1

0

これを正しく理解しているかどうかはわかりません。アセンブラには、いくつかの「即時印刷」命令 (おそらく 2 バイト サイズ) に展開される印刷文字列マクロがあります。そして、(条件付きで) 次の命令をスキップする命令があります。この命令が ez (Execute on Zero) と呼ばれているとしましょう。したがって、次のようにコードします。

  ez print "Hello"

次のように組み立てられます。

1234h ez
1235h print 'H'
1237h print 'e'
1239h print 'l'
123bh print 'l'
123dh print 'o'
123fh ...

そして、ez 命令が 1 つではなく 5 つの命令を自動的にスキップするようにします。右?これを実装する 1 つの方法は、print 命令にリンクされていないことを示すビットを 1 つ持たせることです。これにより、ez 命令は、このビットがなくなるまで命令をスキップし続けることができます。しかし、私見では、これは CPU 設計には少し複雑すぎるようです。print string がいくつかの命令を生成し、次のように記述する必要があることをプログラマーが知っていることを期待するのは合理的だと思います。

  enz bra skip_print
  print "Hello"
skip_print:
于 2012-08-03T17:20:23.180 に答える