子供の頃、私は MK-61Soviet 計算機でプログラミングをしていました。 4つの動作レジスタ(X、Y、Z、T)と15のストレージレジスタがありました。プログラムは105ステップを持つことができます。
思い出すと、次のようなコマンドがありました。
このコマンドはアセンブリ言語を設定していますか?このデバイスを使用してアセンブリ言語の基本的な考え方はありましたか?
それは "keystroke programming" と呼ばれるものであることがわかりました。
おもしろい事実:1988年の宇宙ミッションの軌道計算用のバックアップハードウェアとして、同様の計算機(この計算機のようですが、エネルギーに依存しないメモリを備えています)が使用されていました。:-)
これはアセンブリ言語ではなく、機械語です。
機械語は、機械にとって物理的に何かを意味するものです。ポケットコンピュータの場合、それはキープレスであり、マシンで数字にエンコードされます。 Electronika MK61 machine についてこれ以上の情報を提供しないので、 TI-57 の例を示します:マシン言語は指定されたキーの番号を使用しました数十の列と単位の行として。したがって、たとえば、メモリ8をインクリメントするプログラムは次のようになります。
33 8 57 1 58 23
これは機械語です。それは機械によって直接解釈されるものです。
アセンブリ言語は、人間が読めるテキストになります:
RCL 8
+
1
=
STO 8
このテキストを一連のマシンコードに変換するには、アセンブラーが必要です。これはプログラムか、そのテキストを次のように翻訳する人間です。数列。
しばしばアセンブリ言語から機械語への非常に直接的な変換があるため、混乱がしばしば起こりますが、これは常に完全に直接的な変換であるとは限りません。マクロアセンブラには、アセンブラで多くの作業を実行し、単一のアセンブリ命令からの多くの機械語命令。シンボリックアドレスの単なる変換では、分岐命令のオペコードを変更する必要がある場合があります(たとえば、短い相対アドレス指定から長い相対アドレスまたは絶対アドレス指定に切り替える場合など)。
あなたの質問の両方の答えはノーです:この計算機のコマンドはアセンブリ言語とは異なり、この計算機のプログラミングはアセンブリ言語でのプログラミングとは異なります。
この計算機がプログラムされている「言語」はかなり低いレベルですが、プログラマーには見えない下位レベルの構成要素の上にある抽象を表しています。私は少し推測していますが、あなたの説明とキーボードを見て(そしてそれをHewlett Packardの似たような電卓や1970年代後半から1980年代初めのTexas Instrumentsと比較して)、各プログラムは「ステップ「「追加」や「XとYの入れ替え」などの単純な操作だけでなく、三角法、指数、対数などのより複雑な操作も可能です。これらの各ステップは、おそらく内部マイクロコードルーチンとして実装されています。そのマイクロコードはおそらくアセンブリ言語でプログラムされていますが、あなたが説明したレベルでは通常の計算機プログラミングではそれが見えないように思います。
他の人が説明したように、アセンブリ言語は通常、基になるマシンの機能と(1:1でなければ)非常に密接に対応しています。アセンブリ言語プログラミングには、この計算機のプログラミングにはおそらくない以下の特性が含まれていると思います。
演算には、ビット単位のAND、OR、XOR、シフトなどの下位レベルの演算が含まれます。整数および(おそらく)浮動小数点演算、さまざまなデータサイズ(単精度または倍精度など)さまざまなサイズのロード/ストア(バイト、ハーフワード、ワードなど)。
上位レベルの演算(トリガー、対数)は通常、命令ではなくサブルーチン呼び出しです。 DEC VAXのように、多項式評価命令があったなど、いくつかの例外があります。 [編集:OPはx87にもトリガー関数があることを指摘しました。]
マシンのアドレス指定スキームが公開されています。アドレス空間がセグメント化されている場合は、ベースアドレスをレジスタにロードしてから、そのレジスタに関連するコードまたはデータをアドレス指定する必要があります。フラットなアドレス空間であっても、アドレスとアドレス計算に気づいています。通常、アセンブラーを使用すると、プログラマーはラベルを使用してアドレスを示すことができます。ただし、アドレスが別のセグメントにある場合は、アドレスに到達する前にセグメントレジスタをロードする必要があります。
メモリ配置が公開されます。たとえば、多くのマシンでは、4バイトのWordは、4バイトの倍数のアドレスからのみロードまたは保存できます。
データ表現が公開されます。通常、アセンブラは、16進数、8進数、10進数、浮動小数点、場合によっては文字データで数値データを指定する方法を提供します。
レジスターの特殊化が公開されています。一部のアーキテクチャでは、一部のレジスタでは整数とアドレスの演算が許可されていますが、他のレジスタでは浮動小数点のみが許可されています。場合によっては、アドレス指定や演算に使用できない条件ビットまたはステータスビットを持つ特殊なレジスターがあります。
サブルーチン呼び出し規約が公開されています。引数と戻り値は、レジスタで渡すか、スタックにプッシュしたり、スタックからポップしたりできます。 (このスタックは通常、特別なスタックポインタレジスタによってアドレス指定されるメモリの領域であり、X Y ZおよびTのような固定セットではありません。)
OSとの対話方法、またはOSがない場合は低レベルのハードウェア機能の処理方法を意識する必要があるかもしれません。 OSでは、引数をレジスタ(またはスタック)にロードし、カーネルにトラップする必要があります。 OSがなければ、おそらく割り込みとタイマーを処理する必要があります。
アセンブリプログラミングについての私の記憶は、それが非常に非常に苦痛であるということです。比較すると、この計算機のプログラミングは簡単で楽しいと思います。 (ごめんなさい。)
はい、それは間違いなく私にとってアセンブリ言語のように聞こえます。
それが実際にisアセンブリであるかどうかは、説明だけではわかりません。定義(コマンドがターゲットプラットフォームのマシンコードと1:1で対応する言語)は、マシンコード自体の知識はありますが、それはASMが他のプラットフォームで機能する方法のように聞こえます。
それは確かにアセンブリ言語にいくつかの類似点を持っていますが、私はそれが実際にはそうではないことを主張します。
アセンブリ言語では、操作は主に1対1からCPU命令にマッピングされます。マクロや疑似操作(たとえば、実際にレジスター自体をXORするCLEAR命令など)のようないくつかの例外があります。実際のポイントは、アセンブリプログラムが生成するCPU命令を正確に決定することです。 (これは、アセンブリ言語とCのような高水準言語の根本的な違いです。後者では、プログラムはbehaviorを指定します)。
計算機には間違いなくCPUが搭載されていますが、個々のCPU命令がX、Y、Z、Tの「レジスタ」を参照したり、x
のような高レベルの操作を実行したりすることはないと思います。y
またはsin
(またはПРГ
、 それがどのような意味でも!)。
代わりに、目に見える操作の多くまたはほとんどがサブルーチン呼び出しとして実行されると確信しています。また、実行される操作ごとに、結果を表示するためにかなりの量の追加の作業が必要になります。
可視操作は、高レベルの仮想マシンのアセンブリ言語と考えることができますが、その仮想マシンは、実際のCPUで実行されるインタープリターのようなものを介して実装されます。
それでも、質問の2番目の部分に対する答えは次のとおりです。
このデバイスを使用したアセンブリ言語の基本的な考え方はありましたか?
はい。
そうです、投稿されたコードの断片はアセンブリ言語のように見えます。このコードを適切に変換すると、バージョンが定義されます。
編集:このデバイスには特定の言語がありますが、アセンブリではありません。
ソビエト連邦製の電卓のようにも見えます。丸いバッテリー/コードで動作しますか?
逆ポーランド記法 (RPN)計算機は古典的でした。いいえ、レジスタ指定はアセンブリ言語のように見えますが、そうではありませんでした。計算は、代数的フォーマットからスタックに変換することによって実行されました。使用された数値はスタックにプッシュされ、最後にスタックされた値に対して最後にスタックされた値に対して演算が実行されました。
表示された値はスタックメンバーであるため、スタックを「回転」して値を移動できます。結果は必要に応じて交換またはスタックして、ほぼ複雑な計算を実行できます。スタックハードウェアとアセンブリ言語を理解していれば、このパラダイムが最も似ていたため、この計算機は簡単に学ぶことができました。
BASIC Assembly言語のハイブリッドに近いと思いますが、それは実際には基盤となるCPUとアーキテクチャに依存しています。真のRAMについて話していない場合は、直接メモリアクセスする必要はありません。浮動小数点演算も、FPUなしで存在する必要はありません。
簡単なテストは、浮動小数点数と整数の加算演算だと思います。より高いレベルのプログラミング言語は、ADD 2.5、7を受け入れ、9.5を返します。ただし、アセンブリ言語は、呼び出された命令に基づいて、バイナリの基になる数値表現に応じて出力を異なります。ほとんどのアセンブリ言語では、浮動小数点演算と整数演算の使用に基づいて、異なる命令を使用する必要があります。これに対する例外は、ある種の固定小数点形式かもしれません。