16

例えば:

        .text
        .align 2
        .global main
        .equ val,0x4712         # 16-bit binary code for 0x4712: 0100 0111 0001 0010
                                # Program code starts now
main:                           # This label must be main:, not MAIN: 
        movi r16,val            # WHAT WOULD THIS LINE BE IN BINARY?
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 
4

3 に答える 3

22

手でということですか?

手で、マイクロプロセッサの命令セット シートを取得し、アドレッシング モードやその他のデータ表現の問題を理解してから、それを 16 進表記などの便利なものに変換します。

次に、デバイス固有のプロセス(ディスクからのファイル、シリアルラインからのファイル、多数のスイッチを備えたフロントパネルからのキー入力)を使用して、デバイスのメモリにその情報を取得する必要があります。

明らかに、バイナリをマシンに取り込むために把握しなければならないあらゆる種類のツール チェーンの問題が存在する可能性があります。笑いのためにやっているだけなら、16 進数、鉛筆、リーガル パッドが何年にもわたって適しています。

編集 -

いくつかのことを知っておく必要があります。

まず、オペ コードとオペ コードに加えて、アドレッシング モードを知る必要があります。

この 6502 を考えてみましょう:

LDA #$00
LDA $00
LDA $1234

これらは、6502 の 3 つの異なる命令です。

最初はアキュムレータ (A) に 16 進数で $00, 0 をロードします。# 記号は、「即時」アドレッシング モードを使用していることをアセンブラに伝えます (6502 には合計 13 のアドレッシング モードがあります)。

2 番目は、アドレス $0000 にあるメモリ位置の値をアキュムレータにロードします。6502 には「ゼロ ページ」モードがあるため、メモリの最初のページ (アドレス $0000 ~ $00FF) からより簡単にメモリにアクセスできます。

3 番目は、アドレス $1234 にあるメモリ位置の値をアキュムレータにロードします。これは、関心のあるメモリの実際のアドレスを指定するだけの絶対アドレス指定です。

この例を強調するのは、一見すると、これら 3 つすべてが同じに見えるからです。しかし実際には、それらはすべて 3 つの異なる命令またはオペコードにコンパイルされます。そのため、プロセッサに適したオペコードを選択できるように、アセンブリが何を伝えているかを理解することが重要です。

ここで、6502 のオペコード ガイドを見て、LDA 命令を調べると、命令ごとに異なるバイナリ値が表示されます。

したがって、この場合、次のようになります。

$A9 $00
$A5 $00
$AD $12 $34

これは、これら 3 つの命令のバイナリ (16 進数) 表現​​です。

最初の $A9 は「即時」アドレス指定モード用、2 番目の $A5 はゼロ ページ アドレス指定用、最後に $AD は絶対モード用です。

また、オペランドの後に引数があることに注意してください。6502 の場合、それらはバイト ストリームに続くだけです。異なるプロセッサは異なることを行います。絶対値の場合、$12 と $34 の 2 バイトがあり、それぞれが合計 16 ビット アドレスの半分を表していることに注意してください。アドレスの最上位バイトが最初に来るというのは正しいと思いますが、逆になる可能性があります ($A9 $34 $12)。

というわけで、手組みの基本です。

他に注意すべき点は、アセンブリが読み込まれる場所などの問題です。これは、ラベルなどの値に影響します。

6502:

label:  LDA #$00
        JMP label

アセンブリがアドレス $1000 で開始されている場合、これは次のようにアセンブリされます。

$A9 $00
$4C $10 $00

アセンブリが $5555 のアドレスから始まる場合:

$A9 $00
$4C $55 $55

JMP (Jump) 命令 ($4C) にはジャンプ先のアドレスが必要であり、アセンブリ内のラベルはプログラム内の位置に関連しています。便利なことに、この場合、ラベルは一番最初にあります。しかし、アドレスが最終的なマシン コードにどのようにコーディングされているかを見ることができます。

6502 は EASY (本当に簡単) な組み立てです。現代のプロセッサはそうではありません。最新のアセンブラーは多くの作業を行います。より大きな命令セットを備えたより複雑な CPU を使用している場合や、アラインメントの問題などがありますが、これらはすべて 6502 にはありません。それらのニュアンス。

マイクロプロセッサのマニュアルには、これらのニュアンスが記載されているはずです。しかし、最新の複雑な CPU では、実行して学習するのは簡単ではありません。

必ずしもこれを思いとどまらせたいわけではありませんが、かなりの作業になる可能性があることに注意してください。

しかし、これはあなたがしなければならないことの本質です。

于 2010-09-29T23:50:46.530 に答える
1

私が使用したすべてのアセンブラには、アセンブリを実行するときにコードの横の出力リストにバイナリを含める機能がありました。

于 2010-11-12T16:37:43.873 に答える