lslin 发表于 2013-8-8 10:10:42

源操作数表示的意思。mov eax,BITMAPFILEHEADER.bfOffBits [esi]

本帖最后由 lslin 于 2013-11-14 09:03 编辑

_CreateDIBitmap      proc   _hWnd,_lpFileData

            local    @lpBitmapInfo,@lpBitmapBits

            local    @dwWidth,@dwHeight

            local    @hDc,@hBitmap



            pushad

            mov      @hBitmap,0

            mov      esi,_lpFileData

            mov      eax,BITMAPFILEHEADER.bfOffBits

            add      eax,esi

            mov      @lpBitmapBits,eax

            add      esi,sizeof BITMAPFILEHEADER

            mov      @lpBitmapInfo,esi

            .if      BITMAPINFO.bmiHeader.biSize == sizeof BITMAPCOREHEADER

                     movzxeax,BITMAPCOREHEADER.bcWidth

                     movzxebx,BITMAPCOREHEADER.bcHeight

            .else

                     mov   eax,BITMAPINFOHEADER.biWidth

                     mov   ebx,BITMAPINFOHEADER.biHeight

            .endif

            mov      @dwWidth,eax

            mov      @dwHeight,ebx

;********************************************************************

; 建立空的 Bitmap Object

;********************************************************************

            invoke   GetDC,_hWnd

            push   eax

            invoke   CreateCompatibleDC,eax

            mov      @hDc,eax

            pop      eax

            push   eax

            invoke   CreateCompatibleBitmap,eax,@dwWidth,@dwHeight

            mov      @hBitmap,eax

            invoke   SelectObject,@hDc,@hBitmap

            pop      eax

            invoke   ReleaseDC,hWinMain,eax

;********************************************************************

; 将文件内容设置到建立的 Bitmap 中

;********************************************************************

            invoke   SetDIBitsToDevice,@hDc,0,0,@dwWidth,@dwHeight,\

                     0,0,0,@dwHeight,\

                     @lpBitmapBits,@lpBitmapInfo,DIB_RGB_COLORS

            .if      eax == 0

                     invoke DeleteObject,@hBitmap

                     mov @hBitmap,0

            .endif

            invoke   DeleteDC,@hDc

            popad

            mov      eax,@hBitmap

            ret



_CreateDIBitmap      endp

这是书上的子程序,mov      eax,BITMAPFILEHEADER.bfOffBits
这个BITMAPFILEHEADER.bfOffBits 是什么意思,
当然结构体是在前面已经定义好了的。
BITMAPFILEHEADER STRUCT

bfType         WORD       ?    ;文件标识,必须是“BM”

bfSize         DWORD   ?    ;文件长度

bfReserved1      WORD      ?    ;0

bfReserved2      WORD      ?    ;0

bfOffBits      DWORD   ?    ;位图像素数据在文件中的起始位置

BITMAPFILEHEADER   ENDS

知道的帮我解答一下,

Dardy 发表于 2013-8-9 01:19:46

用dup定义了结构体数组
[esi]指向你要引用的元素的首地址
页: [1]
查看完整版本: 源操作数表示的意思。mov eax,BITMAPFILEHEADER.bfOffBits [esi]