AVRアセンブラーへの翻訳者としてのExcel

前提条件



記事の数(https://habr.com/ru/post/345320/habr.com/ru/post/80893habr.com/ru/post/246975)が提案Excelの翻訳者として使用できることAVRアセンブリコードに。



Excelを「通常の」コードエディタの基本機能と比較してみましょう。最も人気のある機能のリストは次のとおりです。

コードエディタ機能 Excelで実装する方法 AtmelStudioで実装されているとおり
構文の強調表示 コンテンツに基づくセルの条件付きフォーマット コマンドの強調表示
自動補完 カスタムVBA機能;

名前付き範囲;

Changeイベント用のマクロを備えたミニコンソールとしてのセル。

番号
インデント 隣接する列に手動でジャンプします 手動で
ブラケットの正しい配置を確認する コントロールが組み込まれています 組み立てのみ
コンテキストコードヘルプ 番号 ラベル名のリストがあります
コードのブロックを折りたたむ 列と行のグループ化機能 番号
静的アナライザー 外出先でリンクにエラーを表示します 番号


許容できるようです。「無料」で入手できるものもあれば、改善が必要なものもあります。



ただし、テーブルプロセッサとテキストプロセッサの主な違いは、ユーザーが情報のブロックをスペース内の任意の場所に配置できることです。この機能を使用して、フラットコードをほぼ完全なフローチャートに変換します。



最初の合意



ここから一般的なアプローチと用語を見てみましょう habr.com/ru/post/345320

アルゴリズム全体がブランチに分割されています。ブランチは、独立したプログラムユニットの役割を果たします。

各ブランチには、そのブランチへのエントリポイントである名前があります。それはユニークで意味のあるものでなければなりません。すべてのブランチ名は一番上の行に配置されます。これを「名前文字列」と呼びます。



ブランチは、他のブランチへの1つ以上のブランチで終了します。あるブランチから別のブランチへの移行は、一番下の行に配置されます。それを「トランジションライン」と呼びましょう。

また、あるブランチ内から別のブランチに移動することは不可能であるというルールも受け入れます。

アルゴリズムの一般的なスキーム
image



ブランチおよびブランチ内のループの場合、ラベルも使用されます。つまり、プログラムにはたくさんのラベルがあります。新しい一意の名前を思い付くたびにルーチンです。ここで、基本的なExcel機能が役立ちます。各セルには、列名と行番号で構成される一意の名前がす​​でにあります。



VBAで、Range型の引数を持つlabel関数作成しましょうAVRアセンブラのラベルには、末尾にコロンが必要です。それら。ラベル関数は、それが配置されているセルへの参照を入力として受け取り、そのアドレスをA1形式で計算します。次に、テキスト「_M:」を追加します。「_M」フラグメントは偶然ではありません。これをさらに使用します-セルのフォーマットで。



遷移の視覚化



真の視覚環境では、遷移は矢印で示されます。便利で直感的です。

スプレッドシートプロセッサでは、矢印の代わりに、ジャンプコマンドからラベルへのパスを形成するセルに色を付けることができます。これは例で行われます。



すべてのブランチコードを1つの画面に収めることができれば、ルートを描く必要はありません。すべての遷移コマンドとラベルが目の前に表示されます。



ブロック図については、個々の要素の指定に関する基準があります。たとえば、長方形は計算です。ダイヤモンド-状態など スプレッドシートプロセッサを使用する場合、色、スタイル、境界線の制御にアクセスできます。



Excelには、便利な条件付き書式機能があります。さまざまな方法で使用できますが、ここでは3つの簡単なルールのみを紹介します。



  1. ネームバーとトランジションバーの空でないセルは黄色で表示されます。
  2. ブランチの本体にある空でないセルはオレンジ色で表示されます。
  3. 「ローカル」ラベルとジャンプコマンドのあるセルは青色で表示されます。これは、上記の「_M」文字を含む空白以外のセルです。




以下のgifは、すべての設定後のラベルとトランジションの操作がどのように見えるかを示しています。



ラベルとジャンプコマンドの操作
image







最終リストを作成するための手順



リストコレクターは、最終的なプログラムを上から下、および右から左にトラバースします。一度に1つのセル。

最終的なリストがどのように形成されるか
image



アセンブリアルゴリズムは、空のセルと「;」文字を含むセルをスキップします。コメント。



アルゴリズムのデバッグとプロジェクトの最終組み立てはスタジオで行われます。Excelセルを使用するスタジオにはコードフィードバックはありません。したがって、各コマンドの反対側の最終リストでエラーをキャッチするために、セルリンクを示します。このリンクから、Excelの図で問題のあるコマンドを見つけます。



基本的なアルゴリズムソリューションは、次のように分岐します。



If <> then 
    <>
Else
    <>
End if


そのために、AVRアセンブラーには条件付きジャンプ命令があります(breq、brne、sbicなど)。これらのコマンドは、条件が満たされたときにどこに行くかをプログラムに指示します。



ここで、上記の原則を考慮して、このような分岐のプログラムがどのように見えるかを想像してみましょう。



単純な分岐
image





brneコマンドとその仲間は制限があります。ジャンプ距離は各方向64ワードです。したがって、「None」ブランチに挿入された長いマクロは、範囲外を呼び出す可能性があります。



この制限を回避するには、「いいえ」の処理を別のブランチで実行する必要があります。これは、brneのブランチマークの右側にあります。または、マクロが呼び出されるサブルーチンを使用します。



ケースを選択



多数のオプションから選択する必要がある場合、JavaではSelectCaseが使用されます。



Select Case <>
    Case <1>
    Case <2>
    Case <3>
    Case else
End select




インデックスジャンプは、AVRのアセンブリ言語で利用できます。実装オプションを示しましょう。

ケースを選択
image





ここでは、ブランチの本体から別のブランチへのジャンプの禁止に違反していることがわかります。これは意図的なものです。そうしないと、プログラムが水平方向のスペースを取りすぎてしまいます。



同じ理由で、割り込みベクトルは1つの列で実行する必要があります。



事後条件付きループ



ループは、少なくとも1回の繰り返しが必要な場合、Java表記では次のようになります。

Do
    <>
Loop while <>


Excelでの外観とスタジオでの結果のコードの例:

事後条件付きループ
image





前提条件でループする



Javaの例:

Do while <>
	<>
Loop


Excelでの外観とスタジオでの結果のコードの例:

前提条件でループする
image





ネストされたループでループ



配列の処理または数値の操作には、ネストされたループの使用が含まれます。JAVUの概観:



Do
    Do
        <>
    Loop while < 2- >
    <>
Loop while < 1- >




ネストされたループを実装するには、単一のブランチ内に実装する方法と、複数のブランチを使用する方法の2つがあります。両方のオプションを示しましょう。

1つのブランチ内のネストされたループ
image





ブランチを介した実装によるネストされたループ
image





条件付き終了でループ



サイクルが終了する前にサイクルを終了する必要がある場合があります。たとえば、ポートDの0番目のレッグの論理ゼロは、何らかの誤動作を示している可能性があります。プログラムはメインループを終了し、アラームをトリガーする必要があります。



JLUでは、breakコマンドが使用され、一般的なアルゴリズムは次のとおりです。



Do 
    <>
    If < > then break
Loop while <>




ブランチなしとブランチありのアルゴリズムがどのように見えるかをもう一度示しましょう。

1つのブランチ内のループを中断する
image





ブランチを介して実装されたループの中断
image





サブルーチンの呼び出し



サブルーチンは、callicallrcallコマンドによって呼び出されますここには重要な機能があります。サブルーチンは、ブランチの本体から厳密に呼び出す必要があります。呼び出しが分岐行に配置された場合、サブルーチンからの戻りは、間違った場所で発生することがほぼ保証されます。



サブルーチンの必須要件:

  • サブルーチン自体はラベル名で始まる必要があります。
  • サブルーチンの最後のコマンドはretで、ジャンプラインに配置する必要があります


サブプログラムの内部構造は任意です。ロジックを実装するために、すべて同じ自動ラベルラベル適用します



ランニングライトの例



これは、実行中のライトテストプログラムのコードです。この例には、ループ、分岐、およびサブルーチン呼び出しが含まれています。



最終結果は次のようになります。

ランニングライトスキーム
image





プログラム全体をExcelで一覧表示し、1つの画面にスクラッチフィットします。

ランニングライト。エクセルコード
image





ランニングライト。最終リスト
image





結果



気に入らなかったもの



  1. 説明されている方法は、チーム全体が参加する大規模なプロジェクトでの作業には適していない可能性があります。バージョンコントロール、diffなど。あなたはまだ側で決める必要があります。
  2. デバッグモードでは、2つのモニターがないと非常に不便です。デバッグ自体はスタジオで実行され、フローチャートはExcelで実行されます。これらは異なるウィンドウであり、切り替えが必要です。
  3. プログラムは水平方向に急速に膨張します。同時に、Excelでは横にスクロールするのが面倒で不便です。
  4. - – . 12801024 5 45 . 20% ( 45 ). – . .






  1. « » . .
  2. Excel . Atmel Studio .
  3. .
  4. . – . , .
  5. Excel . - , - – VBA.






  1. . « » , . 4-5 . « – – – » , « » , « » « ». 4-5 .
  2. エラーの追加チェック。マクロを編成して、遷移で終わらない「ハング」ブロックがあるかどうかを確認するのは簡単です。マクロを使用して、デバッグ中に注意をそらす未使用のラベルを見つけて削除することもできます。
  3. セルの色付けに関する独自のルールを入力できます。
  4. スプレッドシートプロセッサがコードエディタとしてスタジオに組み込まれている場合、そのようなブロック図で直接デバッグすると非常に便利です。



All Articles