計算機プログラミング

こんにちは、harazhiteli。 プログラマブル電卓のことを聞いたことがある人は多いと思います(そして、それを使用した人もいます)。 奇妙なことに、ここではそのような興味深いことを伝える記事が1つも見つからなかったため、このギャップを埋めて、電卓のプログラミングの基本について話すことにしました。

しばらく前、私はパントリーで、父に属していた古い「 Electronics MK-61 」を見つけました。 当然のことながら、電卓でまったく「標準」ではないプログラミングを学ぶ機会を逃すことはできませんでした。 (プログラム可能な計算機がない場合は、 こちらからエミュレータをダウンロードできます)

記憶


まず、この計算機でメモリがどのように機能するかを理解する必要があります。 ユーザーが自由に使用できるスタックレジスタはX、Y、Z、Tの4つです。レジスタXの内容は常に(計算モードで)画面に表示され、数値の入力もそこに入力されます。 実際、電卓をオンにした後のスタックメモリは次のようになります。

T 0 Z 0 Y 0 X 0 


スタックに何かをプッシュするには、 [↑]キーを使用します。 レジスタXの内容をレジスタYにコピーし、レジスタYの値をZに、ZをTにコピーし、Tにあった値は失われます。 つまり、レジスタのボタン[↑]押す前に値があった場合

 T 5 Z 8 Y 14,5 X 6 


その後、値は次のようになります

 T 8 Z 14,5 Y 6 X 6 


さらに、レジスターのすべての値を循環的にシフトできるコマンドがあります:TからZ、ZからY、YからX、XからT。これを行うには、 [F] [.]押します。

[]コマンドは、XおよびYレジスタの内容を交換します。

[CX]コマンドは、レジスタXの内容を消去します。

スタックメモリに加えて、計算機には15個のアドレス指定可能なレジスタ(RG0-RGE)があります。 それらを使用するには、キー[X→]および[→X]ます。 最初のコマンドは、レジスタXの内容を対応するアドレス指定可能なレジスタに入れます。 たとえば、コマンドのシーケンス[4] [X→] [0]は、レジスターRG0に数値4を配置します。2番目のコマンドは、アドレス可能なレジスターの内容をレジスターXにコピーします。つまり、 [→X] [0] Xは4です。

電卓をオフにすると、すべてのレジスタの値が消去されることに注意してください。

計算


計算を開始する前に知っておく必要がある主なことは、MK-61が逆ポーランド記法(OPN)を使用することです。 単項演算を実行する必要がある場合、レジスタXの数値に対して実行されます。同時に、他のレジスタの値は変更されません。 バイナリ演算は、レジスタYおよびXの内容に対して(この順序で)実行されます。 結果値はXに配置され、ZはYに配置され、TはZにコピーされます。レジスタXの以前の値はサービスレジスタX1に配置されます。 したがって、(避雷器2 3 +で)自明な2 + 3を計算する必要がある場合、計算機のキーを押す必要があります: [2] [↑] [3] [+] 。 この場合、レジスタの値は次のように変更されます。

すべての操作の前:

 T 8 Z 14,5 Y 6 X 0 


キーを押した後[2] [↑] [3]

 T 14,5 Z 6 Y 2 X 3 


[+]押した後:

 T 14,5 Z 14,5 Y 6 X 5 


(15 + 2/5)* 7 + 10など、もう少し複雑な計算を試してみましょう。アレスタでは、この式は15 2 5 / + 7 * 10 +のように記述できます。 計算機でこれを計算するには、次のキーを押す必要があります: [15] [↑] [2] [↑] [5] [/] [+] [7] [*] [10] [+]

プログラミング


それで、それはもっと面白いです:)。 プログラミングモードに入るには、 [F] []押します。 00がディスプレイに表示されますこれは、現在のコマンド番号を意味します。 一般に、MK-61のプログラムは、問題を解決するために必要な一連のコマンドです。 通常、算術演算、数値、場合によってはループと分岐の特別なコードです。 合計で、プログラムは00から99までの番号が付けられた105個以下のコマンドで構成できます。コマンドを入力するには、対応するキーを押します。 計算機のコードとキーの対応表は次のとおりです。



プログラミングモードでは、最後に入力された3つの操作が表示されます。 例えば
ディスプレイ上の02 01 0E 06意味:
  1. 06入力する次のコマンドのアドレス
  2. 0E, 01, 02アドレス03、04、05にある3つの連続したコマンド。

基本

式πr2によって円の面積を見つける最も単純な問題を分析しましょう。 計算機がこの問題を解決するために、プログラミングモード( [F] [] )で次のコマンドを導入します(円の半径がレジスタRG1にあると仮定します)。

 //    —  ,    00 [→X] [1] //    RG1   X (61) 01 [F] [*] //     (22) 02 [F] [+] //   X  (20) 03 [*] //   X  Y (12) 04 [/] //     (    ) (50) 


以上です。 コマンド[F] [/-/]を使用して計算モードに入り、 [/]キーを押してプログラムの先頭に移動する必要があります。 レジスタRG1に5を入力し( [5] [X→] [1] )、 [/]を押して実行を開始します。 計算機がすべてのステップを通過すると、78.539815という数字が画面に表示されます(半径5の円の領域)。

無条件および条件付き遷移

コマンド[] (51)を使用すると、目的のアドレスで無条件のリロード(goto)を実行できます。 これを行うには、プログラミングモードで[]を押してから、目的のアドレスの2桁を押す必要があります。 プログラムの実行中に計算機がオペレーターに到達すると、指定されたアドレスのコマンドから実行を続けます。 例:
 ... 10 [F] [-] // 21 11 [] // 51 12 [4] [2] //   (42) ... 42 [+] // 10 

この場合、ステップ12の後、計算機はすぐにステップ42に進みます。

条件分岐ははるかに便利です。 条件付きジャンプを実装するには、 [X >= 0][X < 0][X = 0]および[X != 0] 4つのコマンドがあります。 これらのコマンドを使用して、レジスタXの内容の条件がチェックされます。 条件が満たされない場合、制御はステートメントの後に指定されたアドレスに渡されます。それ以外の場合(条件が満たされる場合)、アドレスは無視され、プログラムはさらに正常に実行を続けます。 例:
 ... 09 [F] [*] // 22 10 [F] [←] // "if (X == 0)" (5E) 11 [4] [2] //  ,   ,    42 (42) 12 [+] //  ,  X = 0 (10) ... 42 [4] // 04 


サイクル

ループは条件分岐コマンドを使用して実装できますが、さらに、MK-61のループの編成では、コマンドL0-L3( [F] [→X][F] [X→][F] []および[F] [] )。 これらのコマンドは、それぞれレジスタRG0〜RG3の内容を操作します。 ループコマンドが実行されるたびに、対応するレジスタの内容から1が減算され、ゼロと比較されます。 レジスタの内容がゼロに等しくない場合、ループコマンドの後に記録されたアドレスへの遷移があり、等しい場合、ループ遷移アドレスに続くコマンドへの遷移があります。 より明確にするために、例を見てみましょう。 レジスタXにある数値の階乗を考慮します。

 //  RG0    ,  RG1 . 00 [X→] [0] //   X  RG0 -    (40) 01 [1] //  1  X (01) 02 [X→] [1] //    RG1 -  (41) 03 [→X] [1] //       (61) 04 [→X] [0] //        (60) 05 [*] //   (12) 06 [X→] [1] //     (41) 07 [F] [→X] // L0 -         .   ... (5) 08 [0] [3] // ...     03... (03) 09 [/] // ... -  (50) 


おわりに


もちろん、この記事はMK-61でのプログラミングの完全なガイドとはほど遠いものです。 このトピックをより深く理解することに興味がある場合は、このすばらしい計算機の手順 (pdf、6 MB)を読むことをお勧めします。

参照資料

Source: https://habr.com/ru/post/J111099/


All Articles