Linux 在as86/bin86中包含二进制文件
我已经在i8086汇编程序中编写了一段代码,应该将80x25图像放入VRAM并在屏幕上显示Linux 在as86/bin86中包含二进制文件,linux,x86-16,as86,Linux,X86 16,As86,我已经在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 ; Pri
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字节的图像
有人能帮我吗?我做错了什么?我不确定这是否会对您有所帮助,因为我从未尝试过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>
objcopy-I二进制-O-B\
--重命名节.data=.rodata,alloc,load,readonly,data,contents\
因此,在名为.rodata
的部分中,您将有一个包含
的对象文件。但是你可以给它取任何你想要的名字。然后使用链接器将机器代码链接到图像数据
符号名称也是为您创建的。另请参见手册页:
-B--二进制体系结构=bfdarch
将无体系结构的输入文件转换为对象文件时非常有用。在这种情况下,可以将输出架构设置为 达奇。如果输入文件具有已知的 达奇。您可以通过以下方式访问程序中的二进制数据: 引用由转换创建的特殊符号 过程这些符号称为_binary _objfile _start, _二进制文件和二进制文件大小。e、 g.您可以将图片文件转换为对象文件,然后使用 这些符号
如果您的整个代码都是纯代码(没有可执行头,没有重新定位…),那么您可以在代码末尾手动连接图像(当然还可以删除
GET splash.bin
)。例如,在Linux中,您可以执行cat-code-binary-image-binary>final-binary
谢谢所有试图帮助我的人。不幸的是,我没有让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
您现在要做的就是获取一个程序,用二进制include文件覆盖链接器创建的二进制文件,该文件从符号表中找到的地址开始。这取决于你想怎么做,有很多方法,我最后写了
然后我只调用snake.snake.symbols splash\u img splash.bin中的/as86\u binin,它将二进制include复制到我的链接汇编程序中
很抱歉现在回答了我自己的问题,但我觉得这是最好的方式。很不幸,bin86本身没有一个简单的二进制include宏。如果将来有其他人遇到这个问题,我希望这会对你有所帮助