0

80x25 の画像を VRAM に配置して画面に表示することになっている i8086 アセンブラーでコードを少し書きました。

entry start
start:
    mov di,#0xb800  ; Point ES:DI at VRAM
    mov es,di
    mov di,#0x0000
    mov si,#image   ; And DS:SI at Image

    mov cx,#0x03e8  ; Image is 1000 bytes

    mov bl,#0x20    ; Print spaces

; How BX is used:
; |XXXX XXXX XXXXXXXX|
;            ^^^^^^^^^  BL contains ascii whitespace
;  ^^^^                 BH higher 4 bits contain background color
;       ^^^^            BH lower  4 bits contain unused foreground color

img_loop:
    seg ds          ; Load color 
    mov bh,[si]

    seg es          ; Write a whitespace and color to VRAM
    mov [di],bx

    add di,#2   ; Advance one 'pixel'
    sal bh,#4   ; Shift the unused lower 4-bits so that they become background color for the 2nd pixel

    seg es
    mov [di],bx

    add di,#2   
    add si,#1

    sub cx,#1   ; Repeat until 1 KiB is read
    jnz img_loop

endless:
    jmp endless

image:
GET splash.bin

問題は、イメージ ファイルからのバイナリ データを as86 アセンブラに含めることができないことです。マニュアルページを見ましたが、機能するものは見つかりませんでした。

上記のコードをビルドしようとしてもエラーは発生しませんが、リンカーによって生成される出力ファイルのサイズはわずか 44 バイトであるため、明らかに 1000 バイトのイメージを挿入する必要はありませんでした。

誰でもそれを手伝ってもらえますか?私は何を間違っていますか?

4

3 に答える 3

0

私を助けようとしてくれた他のみんなに感謝します。残念ながら、私は を機能させることができませんでしたobjcopy(たぶん私は愚かすぎるかもしれません) cat。最初は実際に使用していましたが、すぐに複数のバイナリ ファイルを含める必要がありました。も解決にはなりませんでした。

私がやったことは次のとおりです。バイナリファイルに入れたいラベルの直後に、アセンブラソースコードの正確なバイト数を予約します。

splash_img:
.SPACE 1000
snake_pit:
.SPACE 2000

次に、-s オプションを追加して (つまり-s snake.symbol、as86 への呼び出しに)、シンボル テーブルを作成するソース コードをアセンブルします。リンカー呼び出しは変更されません。これで、バイナリ データを配置したい位置に多数のゼロがあるバイナリ ファイルができ、シンボル テーブルは次のようになります。

0 00000762 ---R- snake_pit
0 0000037A ---R- splash_img

あとは、リンカーによって作成されたバイナリ ファイルを、シンボル テーブルで見つかったアドレスから始まるバイナリ インクルード ファイルで上書きするプログラムを取得するだけです。どうやってやりたいかはあなた次第です。たくさんの方法があります。私は最終的にこれを行う小さな C プログラムを書きました。

次に、呼び出すだけ./as86_binin snake snake.symbols splash_img splash.binで、バイナリ インクルードがリンクされたアセンブラ プログラムにコピーされます。

今、自分の質問に答えて申し訳ありませんが、これが最善の方法だと感じました。非常に残念なことに、bin86 には単純なバイナリ インクルード マクロがありません。将来誰かがこの問題に遭遇した場合は、これが役立つことを願っています。

于 2015-03-16T17:03:30.997 に答える
0

コード全体が純粋なコードである場合 (実行可能なヘッダーも再配置もありません...)、コードの最後に手動でイメージを連結できます (もちろん、 を削除しGET splash.binます)。たとえば Linux では、次のことができますcat code-binary image-binary > final-binary

于 2015-03-13T21:52:38.530 に答える
0

8086コードで試したことがないので、これが役立つかどうかはわかりません. しかし、あなたはそれを機能させることができるかもしれません。

プログラムは、objcopyバイナリ オブジェクトをさまざまな異なる形式に変換できます。ページのこの例のようにman objcopy

objcopy -I binary -O <output_format> -B <architecture> \
  --rename-section .data=.rodata,alloc,load,readonly,data,contents \
  <input_binary_file> <output_object_file>

<input_binary_file>そのため、という名前のセクションにオブジェクトファイルがあります.rodata。しかし、好きな名前を付けることができます。次に、リンカーを使用してマシン コードを画像データにリンクします。

シンボル名も作成されます。また、マニュアルページから:

-B
--binary-architecture=bfdarch
アーキテクチャのない入力ファイルをオブジェクト ファイルに変換するときに役立ちます。この場合、出力アーキテクチャを bfdarch に設定できます。入力ファイルに既知の bfdarch がある場合、このオプションは無視されます。変換プロセスによって作成された特殊なシンボルを参照することにより、プログラム内でこのバイナリ データにアクセスできます。これらのシンボルは、_binary_objfile_start、_binary_objfile_end、および _binary_objfile_size と呼ばれます。たとえば、画像ファイルをオブジェクト ファイルに変換し、これらのシンボルを使用してコード内でアクセスできます。

于 2015-03-13T20:28:25.437 に答える