【问题标题】:Include binary file in as86/bin86在 as86/bin86 中包含二进制文件
【发布时间】:2015-03-13 16:52:35
【问题描述】:

我在 i8086 汇编器中编写了一些代码,应该将 80x25 图像放入 VRAM 并在屏幕上显示。

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 汇编器包含图像文件中的二进制数据。我查看了the man page,但找不到任何有效的方法。

如果我尝试构建上面的代码,它不会给我任何错误,但是链接器生成的输出文件大小只有 44 字节,所以显然它没有费心放入 1000 字节的图像。

有人可以帮我吗?我做错了什么?

【问题讨论】:

    标签: linux x86-16 as86


    【解决方案1】:

    我不确定这是否会对您有所帮助,因为我从未尝试过用于 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>
    

    因此,您将在名为.rodata 的部分中拥有一个带有&lt;input_binary_file&gt; 的目标文件。但是你可以随意命名它。然后使用链接器将您的机器代码链接到图像数据。

    符号名称也是为您创建的。同样来自手册页:

    -B
    --binary-architecture=bfdarch
    在将无体系结构的输入文件转换为目标文件时很有用。在这种情况下,输出架构可以设置为 bfdarch。如果输入文件有一个已知的 bfdarch。您可以通过以下方式在程序中访问此二进制数据 引用由转换创建的特殊符号 过程。这些符号称为_binary_objfile_start, _binary_objfile_end 和 _binary_objfile_size。例如您可以将图片文件转换为目标文件,然后在代码中使用 这些符号。

    【讨论】:

      【解决方案2】:

      如果您的整个代码是纯代码(没有可执行的标头,没有重定位...),您可以在代码末尾手动连接图像(当然删除GET splash.bin)。例如,在 Linux 中,您可以使用 cat code-binary image-binary &gt; final-binary。

      【讨论】:

        【解决方案3】:

        感谢所有试图帮助我的人。不幸的是,我没有让objcopy 工作(也许我太愚蠢了,谁知道呢),虽然我一开始实际上使用了cat,但我不得不很快包含多个二进制文件,这些文件仍然可以通过标签访问我的汇编代码,所以这也不是一个解决方案。

        我最终做的是以下内容:您在要放入二进制文件的标签之后直接在汇编源代码中保留确切的字节数,即:

        splash_img:
        .SPACE 1000
        snake_pit:
        .SPACE 2000
        

        然后,您通过在调用 as86 时添加 -s 选项(即 -s snake.symbol)来组装源代码创建符号表。链接器调用不会改变。现在你有一个二进制文件,在你想要二进制数据的位置有一堆零,你有一个符号表,应该看起来像这样:

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

        你现在要做的就是用你的二进制包含文件覆盖链接器创建的二进制文件,该文件从符号表中找到的地址开始。想怎么做就看你自己了,有很多方法,最后我写了a small C program that does this。

        然后我只需调用./as86_binin snake snake.symbols splash_img splash.bin 并将二进制包含复制到我的链接汇编程序中。

        我很抱歉现在回答我自己的问题,但我觉得这是最好的方法。非常不幸的是 bin86 本身没有一个简单的二进制包含宏。如果以后有其他人遇到这个问题,我希望这会对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2014-08-29
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 1970-01-01
          • 1970-01-01
          • 2014-08-10
          • 2017-03-16
          • 1970-01-01
          相关资源
          最近更新 更多