首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在as86 86/bin86中包含二进制文件

在as86 86/bin86中包含二进制文件
EN

Stack Overflow用户
提问于 2015-03-13 16:52:35
回答 2查看 524关注 0票数 0

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

代码语言:javascript
复制
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字节的图像放进去。

有人能帮我吗?我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 17:03:30

谢谢其他想帮我的人不幸的是,我没有让objcopy工作(也许我太笨了,谁知道),虽然我一开始确实使用了cat,但我必须尽快包含多个二进制文件,这些文件仍然应该可以通过汇编程序代码中的标签访问,所以这也不是一个解决方案。

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

代码语言:javascript
复制
splash_img:
.SPACE 1000
snake_pit:
.SPACE 2000

然后,通过添加-s选项,即将-s snake.symbol添加到对as86的调用中,组装创建符号表的源代码。链接器调用不会更改。现在,您有了一个二进制文件,在您希望拥有二进制数据的位置有一堆零,并且您有一个符号表,它看起来应该类似于以下内容:

代码语言:javascript
复制
0 00000762 ---R- snake_pit
0 0000037A ---R- splash_img

现在您要做的就是得到一个程序来覆盖由链接器创建的二进制文件,从符号表中找到的地址开始使用二进制包含文件。这取决于你如何去做,有很多种方法,我最终写了这样做的一个小C程序

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-03-13 20:28:25

我不确定这会对你有帮助,因为我从来没有尝试过8086代码。但你也许能让它发挥作用。

objcopy程序可以将二进制对象转换成各种不同的格式。就像man objcopy页面中的这个例子:

代码语言:javascript
复制
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 -二进制-体系结构=bfdarch 当将架构少的输入文件转换为对象文件时非常有用。在这种情况下,输出架构可以设置为bfdarch。如果输入文件有已知的bfdarch,则将忽略此选项。您可以通过引用转换过程创建的特殊符号来访问程序中的二进制数据。这些符号被称为_binary_objfile_start,_binary_objfile_end和_binary_objfile_size。例如,您可以将图片文件转换为对象文件,然后使用这些符号在代码中访问它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29037797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档