ITEEDU

第1章 Iczelion的Win32汇编教程

第2章 Iczelion的ODBC教程

第3章 Iczelion的VxD教程

第4章 Iczelion的PE教程

第5章 罗云彬的Win32汇编教程

第6章 Win32ASM经验点滴

第7章 X86汇编语言编程

第8章 加密解密

第9章 病毒的分析和防治

如何产生一个BMP文件

概述:

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

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