Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在as86/bin86中包含二进制文件_Linux_X86 16_As86 - Fatal编程技术网

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

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

我已经在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汇编程序包含图像文件中的二进制数据。我已经看过了,但是我找不到任何有效的

如果我尝试构建上面的代码,它不会给我任何错误,但是链接器生成的输出文件大小只有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宏。如果将来有其他人遇到这个问题,我希望这会对你有所帮助