CSDN网友老罗那有一个他自己做的程序
就是在DOS下读BMP文件,他是用C写的我在网上就没见过用汇编读取BMP文件的例子
能听到用C写的就不错啦。
你参照一下他的代码吧
http://user.7host.com/laoluo/myworks/index.html
就是在DOS下读BMP文件,他是用C写的我在网上就没见过用汇编读取BMP文件的例子
能听到用C写的就不错啦。
你参照一下他的代码吧
http://user.7host.com/laoluo/myworks/index.html
就是在DOS下读BMP文件,他是用C写的我在网上就没见过用汇编读取BMP文件的例子
能听到用C写的就不错啦。
你参照一下他的代码吧
http://user.7host.com/laoluo/myworks/index.html
可将C的代码转成汇编代码嘛。
assume cs:code,ds:code
org 100h
start:
jmp install;BMP 文件头定义
;---------------------------------------------------------------
BMP_HEAD DB 'BM' ;固定为 'BM'
D_FILE_LENGTH DD 640*480*3+36h ;文件总长度,包括文件头
D_RESERVED DD ? ;reserved
D_OFFSET DD 36h ;数据区开始位置
D_BISIZE DD 28h ;bit map info' head length
D_WIDTH DD 640 ;图形的宽度(单位象素)
D_HEIGHT DD 480 ;图形的高度(单位象素)
D_PLANES DW 1 ;图形的平面数
D_BIT DW 24 ;颜色位数
D_COMPRESS DD 0 ;压缩方式(0为不压缩)
D_SIZE DD 640*480*3 ;数据长度
D_XPPM DD 0c00h ;pixels per meter (x)
D_YPPM DD 0c00h ;pixels per meter (y)
D_CLRUSED DD 0 ;color used
D_CLRIMP DD 0 ;important color index
BMP_HEAD_END EQU THIS BYTE
;----------------------------------------------------------------
HANDLE DW ?
FILE_NAME DB 'test.bmp',0
LINE_BUF DB 640*3 dup (0)
D_RED DB 0ffh
D_GREEN DB 0
D_BLUE DB 0
install:
mov ah,3ch ;建立文件
xor cx,cx
mov dx,offset file_name
int 21h
jnb cre_ok
int 20h
cre_ok:
mov handle,ax
mov ah,40h ;写入文件头
mov bx,handle
mov cx,offset bmp_head_end-offset bmp_head
mov dx,offset bmp_head
int 21h
mov cx,480 ;写入 480 行数据
xor bp,bp
b_lop:
push cx
mov ax,bp
inc bp
cmp ax,160
jb b1
cmp ax,320
jb b2
b3:
sub ax,320
mov si,offset d_blue
mov di,offset d_red
jmp short b4
b2:
sub ax,160
mov si,offset d_green
mov di,offset d_blue
jmp short b4
b1:
mov si,offset d_red
mov di,offset d_green
b4:
mov cx,0ffh
mul cx
mov cx,160 ;160
div cx
mov byte ptr ds:[si],0ffh
sub byte ptr ds:[si],al
mov byte ptr ds:[di],al
mov cx,640
mov di,offset line_buf
cld
b_lop1:
mov al,d_red
stosb
mov al,d_green
stosb
mov al,d_blue
stosb
loop b_lop1
mov ah,40h
mov bx,handle
mov cx,640*3
mov dx,offset line_buf
int 21h
pop cx
loop b_lop
mov ah,3eh ;关闭文件
int 21h
int 20h
CODE ENDS
END START
分数不够,还不知道能不能回答问题。
刚好有一个以前写个小程序,心里想,应该可以蹭点分。
嘿嘿
以下代码文件头部分好象是来自罗云宾老前辈的网站。
其他到是自己瞎写的,也不知道是不是还能运行了。
你看看吧,要是有所帮助,那就好啦。
要是不行,别骂啊。
;赶到现在,只能实现显示一幅bmp文件.(固定的)
;还不能放大,正在改,
;还有,bmp文件的颜色表中有一个问题.
;它是按照3原色的.
;每种颜色的灰度有255种,
;可是,这在我目前学的asm中,
;我也只能调用bios来显示,
;我也没办法做到显示这么多的颜色(灰度)
;我只能显示16种颜色,
;在颜色的灰度方面,你还是得请前辈来修改了,
;先到这里,改好了,我再帖上去,
;另外,我显示的那幅bmp文件,不知道你有没有,
;还有,运行的时候,请切换到全屏幕状态下..
;我的mail是:
Code0 Segment
Assume CS:Code0,DS:Code0,SS:Code0
Main Proc Far
Start:
Mov AX,Code0
Mov DS,AX
Mov SS,AX
Jmp Begin
;BMP 文件头定义
;---------------------------------------------------------------
BMP_HEAD DB 'BM' ;固定为BM
D_FILE_LENGTH DD ? ;文件总长度,包括文件头
D_RESERVED DD 0 ;位图文件保留字,必须为0
D_OFFSET DD ? ;数据区开始位置
D_BISIZE DD 28H ;bit map info' head length
D_WIDTH DW 0,0 ;图形的宽度(单位象素)
D_HEIGHT DW 0,0 ;图形的高度(单位象素)
D_PLANES DW ? ;图形的平面数
D_BIT DW ? ;颜色位数
D_COMPRESS DD ? ;压缩方式(0为不压缩)
D_SIZE DD ? ;数据长度
D_XPPM DD ? ;pixels per meter (x)
D_YPPM DD ? ;pixels per meter (y)
D_CLRUSED DD ? ;color used
D_CLRIMP DD ? ;important color index
BMP_HEAD_END EQU THIS BYTE
;------------------------------------------------------
ColorTable DD 256 Dup (0) ;颜色表
AskFileName DB 'Please input a BMP file name:',10,13,36
ErrorOpenFile DB 'Can not open BMP file!',10,13,36
strTimes DB 'Please input the BMP file times',10,13,36
WaitKeyPress DB 'Press any key to Exit!',10,13,36
FileName DB 14,?,13 Dup (0)
FileCode DW 0
BMPTimes DB 0 ;放大的倍数
CurrentX DW 0 ;要写的象素的横坐标
CurrentY DW 0 ;要写的象素的纵坐标
DataBuf DB 640 Dup (0) ;一个扫描行的数据
DataLen DW 0
Begin:
Call ReadBMPData ;读取BMP文件的数据
Call GetTimes ;得到放大倍数
Call InitGrap ;初始化屏幕显示方式
Main0:
Call ReadData
Call DrawBMP ;画新的BMP图形 Cmp CurrentY,0
Jnz Main0
Lea DX,WaitKeyPress
Mov AH,9
Int 21H
Mov AH,1 ;等待按键
Int 21H
Mov AX,2
Int 10H ;恢复屏幕显示方式
Exit0:
Mov AH,4CH
Int 21H
Main EndPReadBMPData Proc Near
Call OpenBMPFile
Lea DX,BMP_HEAD
Lea CX,BMP_HEAD_END
Sub CX,DX ;文件头的长度
Mov BX,FileCode
Lea DX,BMP_HEAD
Mov AH,3FH
Int 21H ;读BMP文件头
Push D_BIT
Call ReadColorTable ;读彩色表
Ret
ReadBMPData EndPReadData Proc Near
Mov BX,FileCode
Lea DX,DataBuf
Mov CX,DataLen
Mov AH,3FH
Int 21H ;把bmp文件的图形数据读入缓冲区
Ret
ReadData EndPReadColorTable Proc Near
Pop AX
Pop BX
Push AX
Cmp BX,1
Jz Color1
Cmp BX,4
Jz Color4
Mov CX,256*4
Color0:
Mov BX,FileCode
Lea DX,ColorTable
Mov AH,3FH
Int 21H ;把bmp文件的颜色表读入缓冲区
Ret
Color1:
Mov CX,2*4
Jmp Color0
Color4:
Mov CX,16*4
Jmp Color0
ReadColorTable EndPInitGrap Proc Near
Mov AX,12H
Int 10H ;显示模式为640X480X16图形方式
Call InitVar
Ret
InitGrap EndPWritePirex Proc Near
Pop BX
Pop AX
Push BX
Push AX ;保存颜色值
Mov CX,CurrentX
Mov DX,CurrentY
Mov AH,0CH
Int 10H ;在指定的位置写一个象素
Inc CurrentX ;调整写象素的位置
Cmp BMPTimes,2
Jz Times2
Cmp BMPTimes,3
Jz Times3
Pop AX
Ret
Ret
Times2:Times3:WritePirex EndP
;分离一个位图色素字节
SplitByte Proc Near
Pop AX
Pop BX
Push AX
Mov DX,8 ;需要循环8次
Cmp D_BIT,1
Jz Split1
Cmp D_BIT,4
Jz Split4
And BX,0FH ;颜色值占8个bit
Push BX ;对显示的颜色进行了简化.只显示16种颜色.
Call WritePirex
Ret
Split1: ;颜色值占1个bit
Push DX
Shl BL,1
Jc Split2
Mov CX,7 ;不亮的颜色
Split3:
Push BX
Push CX
Call WritePirex
Pop BX
Pop DX
Dec DX
Jnz Split1
Split0:
Ret
Split2:
Mov CX,15 ;亮的颜色
Jmp Split3
Split4: ;颜色值占4个bit
Push BX
And BX,0FH ;先选择低四位颜色(这里可以换)
Push BX
Call WritePirex
Pop BX
And BX,0F0H ;再选择高四位颜色
Call WritePirex
Ret
SplitByte EndPDrawBMP Proc Near
Mov BX,0
Draw0:
Push BX
Lea DX,DataBuf
Add BX,DX
Push [BX]
Call SplitByte
Pop BX
Inc BX
Cmp BX,DataLen
Jnz Draw0
Ret
DrawBMP EndPOpenBMPFile Proc Near
Open0:
Lea DX,AskFileName
Mov AH,9
Int 21H ;询问文件名。
Lea DX,FileName
Mov AH,0AH
Int 21H ;得到文件名!
Mov BX,Word Ptr FileName+1
Xor BH,BH
Mov FileName+2+[BX],0 ;调整文件名!
Lea DX,FileName+2
Mov AX,3D00H
Int 21H ;打开文件!
Jnc Open1 ;打开成功
Lea DX,ErrorOpenFile
Mov AH,9
Int 21H
Jmp Open0
Open1:
Mov FileCode,AX
Ret
OpenBMPFile EndPGetTimes Proc Near
Lea DX,strTimes
Mov AH,9
Int 21H
Mov AH,1
Int 21H
And AL,0FH
Mov BMPTimes,AL
Ret
GetTimes EndPInitVar Proc Near
Mov AX,D_HEIGHT
Mov CurrentY,AX ;这里有漏洞
Mov AX,D_WIDTH ;一个扫描行的长度(单位象素)
Mov DX,D_WIDTH+2 ;这里可能有错误
Cmp D_BIT,1
Jz Init1
Cmp D_BIT,4
Jz Init4
Init0:
Mov DataLen,AX ;一个象素占一个字节(这里有漏洞)
Ret
Init1:
Mov CX,8
Div CX
Jmp Init0
Init4:
Mov CX,4
Div CX
Jmp Init0
InitVar EndP
Code0 EndS
End Start
分数不够,还不知道能不能回答问题。
刚好有一个以前写个小程序,心里想,应该可以蹭点分。
嘿嘿
以下代码文件头部分好象是来自罗云宾老前辈的网站。
其他到是自己瞎写的,也不知道是不是还能运行了。
你看看吧,要是有所帮助,那就好啦。
要是不行,别骂啊。
;赶到现在,只能实现显示一幅bmp文件.(固定的)
;还不能放大,正在改,
;还有,bmp文件的颜色表中有一个问题.
;它是按照3原色的.
;每种颜色的灰度有255种,
;可是,这在我目前学的asm中,
;我也只能调用bios来显示,
;我也没办法做到显示这么多的颜色(灰度)
;我只能显示16种颜色,
;在颜色的灰度方面,你还是得请前辈来修改了,
;先到这里,改好了,我再帖上去,
;另外,我显示的那幅bmp文件,不知道你有没有,
;还有,运行的时候,请切换到全屏幕状态下..
;我的mail是:
Code0 Segment
Assume CS:Code0,DS:Code0,SS:Code0
Main Proc Far
Start:
Mov AX,Code0
Mov DS,AX
Mov SS,AX
Jmp Begin
;BMP 文件头定义
;---------------------------------------------------------------
BMP_HEAD DB 'BM' ;固定为BM
D_FILE_LENGTH DD ? ;文件总长度,包括文件头
D_RESERVED DD 0 ;位图文件保留字,必须为0
D_OFFSET DD ? ;数据区开始位置
D_BISIZE DD 28H ;bit map info' head length
D_WIDTH DW 0,0 ;图形的宽度(单位象素)
D_HEIGHT DW 0,0 ;图形的高度(单位象素)
D_PLANES DW ? ;图形的平面数
D_BIT DW ? ;颜色位数
D_COMPRESS DD ? ;压缩方式(0为不压缩)
D_SIZE DD ? ;数据长度
D_XPPM DD ? ;pixels per meter (x)
D_YPPM DD ? ;pixels per meter (y)
D_CLRUSED DD ? ;color used
D_CLRIMP DD ? ;important color index
BMP_HEAD_END EQU THIS BYTE
;------------------------------------------------------
ColorTable DD 256 Dup (0) ;颜色表
AskFileName DB 'Please input a BMP file name:',10,13,36
ErrorOpenFile DB 'Can not open BMP file!',10,13,36
strTimes DB 'Please input the BMP file times',10,13,36
WaitKeyPress DB 'Press any key to Exit!',10,13,36
FileName DB 14,?,13 Dup (0)
FileCode DW 0
BMPTimes DB 0 ;放大的倍数
CurrentX DW 0 ;要写的象素的横坐标
CurrentY DW 0 ;要写的象素的纵坐标
DataBuf DB 640 Dup (0) ;一个扫描行的数据
DataLen DW 0
Begin:
Call ReadBMPData ;读取BMP文件的数据
Call GetTimes ;得到放大倍数
Call InitGrap ;初始化屏幕显示方式
Main0:
Call ReadData
Call DrawBMP ;画新的BMP图形 Cmp CurrentY,0
Jnz Main0
Lea DX,WaitKeyPress
Mov AH,9
Int 21H
Mov AH,1 ;等待按键
Int 21H
Mov AX,2
Int 10H ;恢复屏幕显示方式
Exit0:
Mov AH,4CH
Int 21H
Main EndPReadBMPData Proc Near
Call OpenBMPFile
Lea DX,BMP_HEAD
Lea CX,BMP_HEAD_END
Sub CX,DX ;文件头的长度
Mov BX,FileCode
Lea DX,BMP_HEAD
Mov AH,3FH
Int 21H ;读BMP文件头
Push D_BIT
Call ReadColorTable ;读彩色表
Ret
ReadBMPData EndPReadData Proc Near
Mov BX,FileCode
Lea DX,DataBuf
Mov CX,DataLen
Mov AH,3FH
Int 21H ;把bmp文件的图形数据读入缓冲区
Ret
ReadData EndPReadColorTable Proc Near
Pop AX
Pop BX
Push AX
Cmp BX,1
Jz Color1
Cmp BX,4
Jz Color4
Mov CX,256*4
Color0:
Mov BX,FileCode
Lea DX,ColorTable
Mov AH,3FH
Int 21H ;把bmp文件的颜色表读入缓冲区
Ret
Color1:
Mov CX,2*4
Jmp Color0
Color4:
Mov CX,16*4
Jmp Color0
ReadColorTable EndPInitGrap Proc Near
Mov AX,12H
Int 10H ;显示模式为640X480X16图形方式
Call InitVar
Ret
InitGrap EndPWritePirex Proc Near
Pop BX
Pop AX
Push BX
Push AX ;保存颜色值
Mov CX,CurrentX
Mov DX,CurrentY
Mov AH,0CH
Int 10H ;在指定的位置写一个象素
Inc CurrentX ;调整写象素的位置
Cmp BMPTimes,2
Jz Times2
Cmp BMPTimes,3
Jz Times3
Pop AX
Ret
Ret
Times2:Times3:WritePirex EndP
;分离一个位图色素字节
SplitByte Proc Near
Pop AX
Pop BX
Push AX
Mov DX,8 ;需要循环8次
Cmp D_BIT,1
Jz Split1
Cmp D_BIT,4
Jz Split4
And BX,0FH ;颜色值占8个bit
Push BX ;对显示的颜色进行了简化.只显示16种颜色.
Call WritePirex
Ret
Split1: ;颜色值占1个bit
Push DX
Shl BL,1
Jc Split2
Mov CX,7 ;不亮的颜色
Split3:
Push BX
Push CX
Call WritePirex
Pop BX
Pop DX
Dec DX
Jnz Split1
Split0:
Ret
Split2:
Mov CX,15 ;亮的颜色
Jmp Split3
Split4: ;颜色值占4个bit
Push BX
And BX,0FH ;先选择低四位颜色(这里可以换)
Push BX
Call WritePirex
Pop BX
And BX,0F0H ;再选择高四位颜色
Call WritePirex
Ret
SplitByte EndPDrawBMP Proc Near
Mov BX,0
Draw0:
Push BX
Lea DX,DataBuf
Add BX,DX
Push [BX]
Call SplitByte
Pop BX
Inc BX
Cmp BX,DataLen
Jnz Draw0
Ret
DrawBMP EndPOpenBMPFile Proc Near
Open0:
Lea DX,AskFileName
Mov AH,9
Int 21H ;询问文件名。
Lea DX,FileName
Mov AH,0AH
Int 21H ;得到文件名!
Mov BX,Word Ptr FileName+1
Xor BH,BH
Mov FileName+2+[BX],0 ;调整文件名!
Lea DX,FileName+2
Mov AX,3D00H
Int 21H ;打开文件!
Jnc Open1 ;打开成功
Lea DX,ErrorOpenFile
Mov AH,9
Int 21H
Jmp Open0
Open1:
Mov FileCode,AX
Ret
OpenBMPFile EndPGetTimes Proc Near
Lea DX,strTimes
Mov AH,9
Int 21H
Mov AH,1
Int 21H
And AL,0FH
Mov BMPTimes,AL
Ret
GetTimes EndPInitVar Proc Near
Mov AX,D_HEIGHT
Mov CurrentY,AX ;这里有漏洞
Mov AX,D_WIDTH ;一个扫描行的长度(单位象素)
Mov DX,D_WIDTH+2 ;这里可能有错误
Cmp D_BIT,1
Jz Init1
Cmp D_BIT,4
Jz Init4
Init0:
Mov DataLen,AX ;一个象素占一个字节(这里有漏洞)
Ret
Init1:
Mov CX,8
Div CX
Jmp Init0
Init4:
Mov CX,4
Div CX
Jmp Init0
InitVar EndP
Code0 EndS
End Start
速度比较慢,还以为发不上去,回答不了,发了2遍。
浪费可耻
南无阿弥驼浮善哉,,善哉
Thanks for your care of my site! :-)我还写过一个能读取BMP里面指定座标的程序(比如你想读取座标(100,100)的一些属性),我用它来进行图象识别处理(不过很粗糙),在我的网站的“老罗作品”的“混沌演示CAI系统”里面有包含到这个文件。