質問

大学の最後の学期、コンピューター言語のクラスの私の教師は私たちに名前が付けられた難解な言語を教えてくれました 空白. 。非常に忙しいスケジュール(中期)で言語をよりよく学ぶことのために、私は 通訳者アセンブラPython. 。 an アセンブリ言語 執筆プログラムを簡単に促進するように設計されました。 サンプルプログラム 与えられたアセンブリで書かれました ニーモニック.

夏になった今、新しいプロジェクトが始まっており、客観的なプロジェクトは、ホワイトスペース0.3の通訳者とアセンブラーを書き直すことであり、その後さらに開発が進みます。そのデザインに取り組むために以前よりも多くの余分な時間があるので、ここでは、アセンブリ言語に改訂されたニーモニックのセットを提供するアウトラインが表示されます。この投稿は、彼らの議論のためにウィキとしてマークされています。

過去にアセンブリ言語の経験がありましたか?あなたが何か違うものに改名されるべきだと思ったいくつかの指示はありましたか?箱の外で、ニーモニックの名前とは異なるパラダイムで考えていることに気づきましたか?これらの質問のいずれかに「はい」と答えることができれば、ここで大歓迎です。主観的な答えをいただければ幸いです!


スタック操作(IMP:[スペース])

スタック操作は、より一般的な操作の1つであるため、IMP [空間]の短さです。 4つのスタック命令があります。

hold N       Push the number onto the stack
copy         Duplicate the top item on the stack
copy N       Copy the nth item on the stack (given by the argument) onto the top of the stack
swap         Swap the top two items on the stack
drop         Discard the top item on the stack
drop N       Slide n items off the stack, keeping the top item

算術(IMP:[Tab] [Space])

算術コマンドは、スタックの上位2つのアイテムで動作し、操作の結果に置き換えます。プッシュされた最初のアイテムは、オペレーターのままであると見なされます。

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

ヒープアクセス(IMP:[タブ] [タブ])

ヒープアクセスコマンドはスタックを見て、保存または取得するアイテムのアドレスを見つけます。アイテムを保存するには、アドレスを押してから値を押して、ストアコマンドを実行します。アイテムを取得するには、アドレスを押して、retiveコマンドを実行します。これにより、スタックの上部にある場所に保存された値が配置されます。

save         Store
load         Retrieve

フロー制御(IMP:[LF])

フロー制御操作も一般的です。サブルーチンは、ループを実装できる条件付きおよび無条件ジャンプのターゲットだけでなく、ラベルによってマークされています。 [LF] [LF] [LF]によってプログラムを終了する必要があり、インタープリターがきれいに終了できるようにする必要があります。

L:           Mark a location in the program
call L       Call a subroutine
goto L       Jump unconditionally to a label
if=0 L       Jump to a label if the top of the stack is zero
if<0 L       Jump to a label if the top of the stack is negative
return       End a subroutine and transfer control back to the caller
halt         End the program

I/O(IMP:[Tab] [LF])

最後に、ユーザーと対話できる必要があります。数字と個々の文字を読み書きするためのIOの指示があります。これらを使用すると、文字列操作ルーチンを書くことができます。読み取り命令は、スタックの上部から結果を保存するためのヒープアドレスを取ります。

print chr    Output the character at the top of the stack
print int    Output the number at the top of the stack
input chr    Read a character and place it in the location given by the top of the stack
input int    Read a number and place it in the location given by the top of the stack

質問: 以前のニーモニックをどのように再設計、書き直し、または変更しますか?

役に立ちましたか?

解決

  • #Nを押して、nが即時であることを明確にするために。
  • 「スワップ」は時々「Exc」または「交換」です。
  • 「セーブ」は通常「st」です(ストア)
  • 「ロード」は通常「LD」です
  • 「call」も「JSR」または「BL」にすることもできます。
  • 「goto」は通常「jmp」または「bra」です
  • 「= 0」は通常「beq」です
  • 「<0」が通常「BLT」の場合
  • 「リターン」は通常「ret」または「blr」です
  • 「出口」は通常、CPUのコンテキストで「停止」/「HLT」です。
  • 「print chr」と「print int」は、「print.c」と「print.i」になる可能性があります。命令バリアントを指定するには多くの方法がありますが、通常はオペランドにはありません。

編集:

ciscy構文を使用して、オペコードとアドレス指定モードの融合を気にしない場合は、

  • 「コピー」の代わりに「プッシュ(sp)」
  • 「n(sp)を「n(sp)」を「n」の代わりに(n(sp)」(moduloが単語サイズを掛けている)
  • 「ロード」の代わりに「プッシュ *(sp)」(ロードされた値を押す前にポップを行うことを除く)
  • 「プッシュ」の代わりに「pop *1(sp)」(実際には2回ポップすることを除く)

一方、スタックベースのコードは通常、プッシュとポップを暗黙的に扱います。その場合、「プッシュ」の代わりに「IMM N」(即時)。その後、すべてのスタック操作は純粋にスタック操作です。これは素晴らしく一貫性があります。

「ドロップn」と書く方法はわかりません。説明により、「ドロップ1」が「ドロップ」と同等ではないように聞こえますが、奇妙に思えます。

他のヒント

私が提案する最初の変更は、それぞれ押し下げてポップするようにホールドとドロップを変更することだと思います。

それから多分私はコピーをDUPに名前を変更します(それがスタック指向言語でのこの操作の最も一般的な名前だと思います)。

私は少し困惑しているのはなぜあなたがしばしば短い一言の説明を持っているのですか 違う ニーモニックに。たとえば、Mnemonicは保存され、説明は保存されます。ニーモニックは負荷であり、説明は取得されます。ちなみに、それらは私に十分に説明されていない2つのニーモニックです。どこで保存しますか?どこからロードしますか? (編集 これらの意味を明確にするために、その後、質問が編集されました)

興味深い投稿をありがとう。

私はあなたの質問を完全に理解しているかどうかわからないので、私が基地から外れているなら、私を許してください。

スタックに加えて、算術演算子によって設定されたさまざまなフラグ(キャリー、オーバーフロー、ゼロなど)を含む「ステータスレジスタ」を追加するでしょう。

次に、それらのフラグをテストする「if」フォームを追加します。

ビットシフトを追加して(左右の両方)指示と、および/または/xor/not操作をビットで動作させる操作ではありません。

I/Oの指示を、その古き良き張り出したチューリングマシンの感覚の価値の流れとして扱うためのI/Oの指示を意図していない限り、何らかのメモリアクセスを望むでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top