9

6502 プロセッサでアセンブリに while ループを書き込もうとしていますが、16 進数コードの書き方がわかりません。ループの開始位置と終了位置を示すラベルがある短縮形を使用して記述された例を見てきましたが、実際の 16 進コードについては何も表示されません。

私が有用だと思う2つのコードは次のとおりです。

  1. メモリ内のバイトを X reg と比較します (省略形: CPX、16 進数: EC)。これは、等しい場合に Z フラグをゼロに設定し、
  2. Z フラグ = 0 の場合、X バイトを分岐します (省略形: BNE、16 進数: D0)。
4

4 に答える 4

6

ここから始めましょう。このページには、PC 上で実行できるクロス アセンブラーが含まれています。それはあなたにとって良い開発プラットフォームになる可能性があります.

何かを行う前に、6502 の動作原理を理解する必要があります。次に、以下を含むソフトウェア開発プロセスを理解する必要があります。

-- いわゆる「速記」と呼ばれるシンボリック命令の「ソース ファイル」を準備します
-- アセンブラを使用して、そのソース ファイルを 6502 が理解できるマシン命令に変換します --
変換を 6502 にロードします --
6502 翻訳されたマシン命令を実行する

LENサンプル プログラムは、メモリ バイトを からSRCにコピーしようとしますDST

次のようにフォーマットします。

      LDX #0    ; Start with the first byte 
_LOOP LDA SRC,X ; load a byte from SRC into the A register 
      STA DST,X ; store that byte into DST
      INX       ; bump the index register to point to the next SRC and DST locations 
      CPX #LEN  ; have we moved LEN characters?  
      BNE _LOOP ; if not, go move the next one

さらにステートメント行を追加した後 (ENDたとえば、など); SRCDST、およびを定義しLENたら、全体を という名前のファイルに保存しますcploop.txt

次に、アセンブラに翻訳を指示します。アセンブラは、あなたが話している16進バイトとして表現できるバイナリ6502マシンコードのファイルを出力します。

そのマシン コードのファイルを、シミュレートされた 6502 にフィードします。次に、6502 に、マシン コードが具現化する操作を実行するように何らかの方法で指示します。

于 2011-05-16T17:27:01.300 に答える
3

これは、アセンブリ (「省略形」と呼ばれるもの) とマシン コードの間の対応を示す例です。まず、いくつかのパラメーターが抽象化された、アルゴリズムのアセンブリ コードを次に示します。

* = 4000          ; This is the address where our program will be stored

      LDX #len
loop  LDA src,X 
      STA dest,X 
      DEX       
      BNE loop

もちろん、それを直接機械語に変換することはできません。lensrcおよびの値も入力する必要がありますdest

src = $1234
dest = $5678
len = 10

名前について理解しておくべきことは、に value が割り当てられるのloopと同じように、その後に命令のアドレスが割り当てられるということです。したがって、この場合、は 2 バイトを占めるため (後で説明します)、に設定されます。これはアセンブラーによって自動的に行われますが、もちろん、これらすべてを紙の上で行うこともできます。src$1234loopLDX #lenloop$4000 + 2 = $4002

では、上記のアセンブリ プログラムの 6502 マシン コードは何でしょうか?

A2 0A
BD 34 12
9D 78 56
CA
D0 F7

どうすればこれを知ることができますか? 上記のプログラムをオンラインの 6502 アセンブラー ( http://www.masswerk.at/6502/assemblyr.html ) に貼り付けただけです。アセンブリとマシン コード間の詳細なマッピングも表示されます。

4000        LDX #LEN        A2 0A
4002 LOOP   LDA SRC,X       BD 34 12
4005        STA DEST,X      9D 78 56
4008        DEX             CA
4009        BNE LOOP        D0 F7
400B

の実際の値はLOOPのマシンコードの計算にも使用されず、命令自体BNE LOOPと比較した相対アドレスのみが使用されることに注意してください: は -9 であり、との差 は -9 です!BNEF7$400B$4002

したがって、これを手動で行う場合は、他のすべてを機械語に変換するだけで、ジャンプに到達したら、次の命令の開始アドレスとジャンプ先のアドレスの差を計算します。後方へのジャンプでは負、前方へのジャンプでは正である必要があります。

于 2014-06-12T03:08:58.427 に答える
1

whileステートメントとは、次のことを意味します。

  1. 条件をテストする
  2. 条件が偽の場合は 5 へ
  3. 何かをする
  4. 1 に戻る (単純な JMP またはブランチ)
  5. プログラムの残り

6502 では、多くの仮定を立てることができない限り、これは非常に単純ではありません。テストする条件が常にレジスターになる場合、比較命令 (cmp、cpx、cpy) と分岐命令は明らかに 1 に必要なものです。

メモリに格納された単一のバイトになる場合は、そのバイトをロードしてから比較する必要があります。

2 バイトに格納された 16 ビット値の場合は、バイトの各値を読み込んでテストする必要があります。

フロートを扱う?浮動小数点パッケージ (Commodore 64 ROM BASIC 浮動小数点ルーチンなど) を作成したか、入手できる場合は、それらを使用する必要があります。

高級言語にデータ型がある理由がわかります。

実際には、扱っているデータのタイプによって異なりますがwhile、6502 の実装はほとんど上記に従う必要があります。

比較するデータが常に X にあり、宛先が常に +127/-128 バイト離れていることがわかっている場合 (Bxx 命令の範囲制限)、質問で特定した特定のケースは問題ありません。

于 2013-08-18T14:38:49.233 に答える