我正在寻找一种方法来转换256色位图图像到ASM文件,其中包含许多DB
命令与字节序列。
我创建了一个256色、分辨率为320x200像素的位图。
我想一个程序,让我指定的位图转换。必须将图像转换为.ASM文件,转换为emu8086兼容的十进制或二进制或十六进制格式的字节字符串。
然后,我将加载转换后的文件(.ASM)到内存中(使用include命令),并通过为屏幕上的像素着色来读取每个字节。
生成的.ASM文件示例:
DB 10,15,24,32,...
DB 00AH,00FH,018H,020H,...
DB 00001010B,00001111B,00010010B,00100000B,...
我试图创建一个程序,读取.TXT文件并打印内容,但它没有工作。
我试图建立这个程序来转换位图文件在一个文本文件与。ASM扩展名和一个字符串的字节内。
org 100h
JMP START
INPUT DB "TEST.TXT", 0
OUTPUT DB "TEST.DB", 0
ERROR DB "FILE NOT FOUND$"
HANDLE DW ?
BUFFER DB 4 DUP(' ') ; i had found this command on internet but i don't know why i need to include it
START:
MOV AH,00H ; set video mode
MOV AL,03H ; 80x25 chars with 16 colors
INT 10H ; Interrupt
; --------------------
; Read the bitmap file
; --------------------
MOV AH,3DH ; Open the file
MOV AL,0 ; Only in read mode
MOV DX,OFFSET INPUT ; TEST.TXT
INT 21H ; interrupt
JC STOP ; If the file not exist print an error
MOV HANDLE,AX ; i had found this command on internet but i don't know why i need to include it
MOV BX,HANDLE
MOV DX,OFFSET BUFFER
MOV CX,0042H ; read 42 bytes
MOV AH,3FH
INT 21H
MOV HANDLE,0000H
READ:
MOV DL,[0124H] ; print first byte of txt file from 0124H memory location
MOV AH,02H ; print a char on screen
INT 21H ; Interrupt
; close the file
MOV AH,3EH
MOV BX,HANDLE
INT 21H
JMP EXIT
STOP:
MOV DX,OFFSET ERROR
MOV AH,9
INT 21H
EXIT:
ret
感谢所有回答我的人。
1条答案
按热度按时间dgsult0t1#
您需要它,因为您将需要使用一些内存缓冲区,您可以在其中存储(部分)用作输入的.BMP文件。
这个特殊的
db 4 dup(' ')
所做的是保留一小部分4字节的内存作为 BUFFER(从标签名称来看)。值4在这里很重要,因为它限制了您可以使用此缓冲区执行的操作。你的程序读取了0042 H字节,这比缓冲区可以容纳的要多得多。缓冲区溢出,对程序的影响将是灾难性的!希望这里有一个错字,但要知道0042 H和42字节不一样。它是66字节。
当打开一个文件时(就像你做的那样),DOS返回一个已打开文件的句柄。这是一个数字,DOS可以在所有后续的交互中识别该文件,您计划进行有关此文件。使用一个单词大小的数字要比不断地通过文件名(也可能包括路径)引用文件容易得多。
重置 HANDLE 变量后,就不应该再在CloseFile操作中使用它。
汇编者最清楚!使用缓冲区的名称并写入:
mov dl, BUFFER
。使用emu 8086时,方括号是可选的。我编写了一个演示程序,它将一个320 x200 256色的.BMP文件转换为一个充满
db
行的.TXT文件。这是你最终需要的一个很好的起点。这只是一个开始,因为:该程序在一台真正的MS-DOS机器上进行了测试。它跑得非常快,但我不知道有多快/慢emu 8086可以运行这个.
我的输出看起来像什么: