CSDN网友老罗那有一个他自己做的程序
就是在DOS下读BMP文件,他是用C写的我在网上就没见过用汇编读取BMP文件的例子
能听到用C写的就不错啦。
你参照一下他的代码吧
http://user.7host.com/laoluo/myworks/index.html

解决方案 »

  1.   

    CSDN网友老罗那有一个他自己做的程序
    就是在DOS下读BMP文件,他是用C写的我在网上就没见过用汇编读取BMP文件的例子
    能听到用C写的就不错啦。
    你参照一下他的代码吧
    http://user.7host.com/laoluo/myworks/index.html
      

  2.   

    不好意思,上面“能听到用C写的就不错啦。“应是“能找到用C写的就不错啦。“
    可将C的代码转成汇编代码嘛。
      

  3.   

    帮VBIN,UP一下,他说他无法再留言啦。
      

  4.   

    概述:     BMP 文件是一种常用的图像文件格式,本文的例子程序产生一个简单的 640x480 24 bit 颜色的 BMP 文件。BMP 文件的格式分两部分,第一部分为文件头,具体定义见源程序,第二部分为数据区,紧接着文件头存放。源程序:code segment
    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
      

  5.   

    好久不来csdn的asm了。
    分数不够,还不知道能不能回答问题。
    刚好有一个以前写个小程序,心里想,应该可以蹭点分。
    嘿嘿
    以下代码文件头部分好象是来自罗云宾老前辈的网站。
    其他到是自己瞎写的,也不知道是不是还能运行了。
    你看看吧,要是有所帮助,那就好啦。
    要是不行,别骂啊。
    ;赶到现在,只能实现显示一幅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
      

  6.   

    好久不来csdn的asm了。
    分数不够,还不知道能不能回答问题。
    刚好有一个以前写个小程序,心里想,应该可以蹭点分。
    嘿嘿
    以下代码文件头部分好象是来自罗云宾老前辈的网站。
    其他到是自己瞎写的,也不知道是不是还能运行了。
    你看看吧,要是有所帮助,那就好啦。
    要是不行,别骂啊。
    ;赶到现在,只能实现显示一幅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
      

  7.   

    不好意思,我是用代理上csdn的。
    速度比较慢,还以为发不上去,回答不了,发了2遍。
    浪费可耻
    南无阿弥驼浮善哉,,善哉
      

  8.   

    To vBin(彬):
    Thanks for your care of my site! :-)我还写过一个能读取BMP里面指定座标的程序(比如你想读取座标(100,100)的一些属性),我用它来进行图象识别处理(不过很粗糙),在我的网站的“老罗作品”的“混沌演示CAI系统”里面有包含到这个文件。