6

大学の前学期、コンピュータ言語クラスの私の先生は私たちにホワイトスペースという難解言語を教えてくれました。非常に忙しいスケジュール(中期)で言語をよりよく学ぶために、私はPythonでインタープリターアセンブラーを作成しました。アセンブリ言語は、プログラムの作成を容易にするように設計されており、サンプルプログラムは、指定されたアセンブリニーモニックを使用して作成されました。

夏になった今、Whitespace 0.3のインタプリタとアセンブラを書き直すことを目的とした新しいプロジェクトが始まり、その後さらに開発が進んでいます。以前よりも設計に取り組む時間が非常に長いため、ここでは、アセンブリ言語のニーモニックの改訂セットを提供する概要を示します。この投稿は、彼らの議論のためのwikiとしてマークされています。

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


スタック操作(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:[タブ] [スペース])

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

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

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

ヒープアクセスコマンドは、スタックを調べて、保存または取得するアイテムのアドレスを見つけます。アイテムを保存するには、アドレスを押してから値を押し、storeコマンドを実行します。アイテムを取得するには、アドレスをプッシュして取得コマンドを実行します。これにより、スタックの最上位の場所に格納されている値が配置されます。

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:[タブ] [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

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

4

3 に答える 3

4

私が提案する最初の変更は、ホールドとドロップをそれぞれプッシュとポップに変更することだと思います。

次に、copyの名前をdupに変更します(これは、スタック型言語でのこの操作の最も一般的な名前だと思います)。

ニーモニックとは異なる短い一言の説明がよくあるのはなぜか、少し戸惑います。たとえば、ニーモニックは保存、説明は保存です。ニーモニックはロード、説明はリトリーブです。ちなみに、これらは私に十分に説明されていない2つのニーモニックです。何をどこに保存しますか?どこから何をロードしますか?(質問の編集は、これらの意味を明確にするために後で編集されました)

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

于 2010-05-25T01:10:06.350 に答える
3
  • #nを押して、nが即時であることを明確にします。
  • 「スワップ」は時々「exc」または「exch」だと思います。
  • 「保存」は通常「st」(ストア)です
  • 「負荷」は通常「ld」です
  • 「call」は「jsr」または「bl」の場合もあります。
  • 「goto」は通常「jmp」または「bra」です
  • 「if=0」は通常「beq」です
  • 「if<0」は通常「blt」です
  • 「return」は通常「ret」または「blr」です
  • 「exit」は通常、CPUのコンテキストでは「halt」/「hlt」です。
  • 「printchr」と「printint」は「print.c」と「print.i」になります。命令バリアントを指定する方法はたくさんありますが、通常はオペランドにはありません。

編集:

CISCy構文を使用して、オペコードとアドレッシングモードを混同してもかまわない場合は、

  • 「コピー」の代わりに「プッシュ(sp)」
  • 「copyN」の代わりに「pushN(sp)」(ワードサイズのモジュロ乗算)
  • 「load」の代わりに「push*(sp)」(ロードされた値をプッシュする前にポップを実行する場合を除く)
  • 「push」の代わりに「pop*1(sp)」(実際に2回ポップする場合を除く)

一方、スタックベースのコードは通常、プッシュとポップを暗黙的なものとして扱います。その場合、「プッシュ」の代わりに「immn」(即時)。その場合、すべてのスタック操作は純粋にスタック操作であり、これは優れた一貫性のある操作です。

「dropN」の書き方がわかりません。「drop1」は「drop」と同じではないように聞こえますが、奇妙に思えます。

于 2010-05-25T03:31:26.980 に答える
1

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

スタックに加えて、算術演算子によって設定されるさまざまな異なるフラグ(Carry、Overflow、Zeroなど)を含む「ステータスレジスタ」を追加する可能性があります。

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

ビットシフトとローテート(左と右の両方)命令、およびビットを操作するAND / OR / XOR/NOT演算を追加します。

I / O命令でメモリをその古き良きチューリングマシンの感触の値のストリームとして扱うことを意図していない限り、ある種のメモリアクセスが必要になる可能性があります。

于 2010-05-25T03:21:39.613 に答える