;-----------------------------
;文件满足256色调的
;-----------------------------
Stack    Segment
         Stk          db    65535    dup(?)
Stack    Ends
Data     Segment
         ImageBuffer  db    65078    dup(?)
         ImageSrc     db    'bitmap.bmp',0                 ;修改同目录下图片的文件名
         Eflag        db    ?
         OpenErrorMsg db    'file not found',24h
         Not256Color  db    'Not a 256 color bitmap',24h
         handle       dw    ?
Data     Ends
Code     Segment
         Assume cs:Code,ds:Data,ss:Stack
Start:
         mov ax,Data
         mov ds,ax
         mov di,0                ;修改读取开始的Y坐标
     mov si,0        ;修改读取开始的X坐标
         mov dx,offset ImageSrc
         push si
         push di
         push dx
         call Bitmap
         mov ax,0
         int 16h
         mov ax,4c01h
         int 21h
         
BitMap   Proc ;===========================================================================          push bp
         mov bp,sp
         sub sp,20
         push ax
         push bx
         push cx
         push dx
         push si
         push di
         push es
         mov dx,[bp+4]
         mov ax,3d00h
         int 21h           ;Open the bitmap file
         jnc OpenOk
         mov Eflag,0
Error:                     ;Show error message
         cmp Eflag,0
         jz  OpenError
         cmp Eflag,1
         jz  Not256
OpenError:
         mov dx,offset OpenErrorMsg
         jmp showtext
Not256:
         mov dx,offset Not256Color
         jmp ShowText
ShowText:
         mov ah,09h
         int 21h
         jmp exit
OpenOk: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                          ;
;        Read  first 4 byte of the file in order to get the file size      ;;;;;;;;;;;;
;                                                                          ;         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         ;;
                                                                                     ;;
         mov bx,ax                                                                   ;;
         mov handle,bx                                                               ;;
         mov dx,offset ImageBuffer                                                   ;;
         mov cx,4                                                                    ;;
         mov ax,3f00h                                                                ;;
         int 21h           ;Read the first 4 byte to memory                          ;;
         mov ax,3e00h                                                                ;;
         mov bx,handle                                                               ;;
         int 21h           ;Close the bitmap file                                    ;;
                                                                                     ;;
;====================================================================================;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                          ;     
;        Read The entire bitmap file to memory                             ;;;;;;;;;;;;
;                                                                          ;         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         ;;
                                                                                     ;;
         mov si,2                                                                    ;;
         mov cx,[si]       ;Save the bitmap file entire size to CX Register          ;;
         mov dx,[bp+4]     ;                                                         ;;
         mov ax,3d00h                                                                ;;
         int 21h           ;Open the bitmap file again                               ;;
         mov bx,ax                                                                   ;;
         mov handle,bx                                                               ;;
         mov dx,offset ImageBuffer                                                   ;;
         mov ax,3f00h                                                                ;;
         int 21h           ;Read the entire bitmap file to memory                    ;;
         mov ax,3e00h                                                                ;;
         mov bx,handle                                                               ;;
         int 21h           ;Close the bitmap file                                    ;;
                                                                                     ;;
;====================================================================================;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                          ;
;        Save Information to local variable                                ;;;;;;;;;;;;
;                                                                          ;         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;         ;;
                                                                                     ;;
         mov si,012h                                                                 ;;
         mov ax,[si]                                                                 ;;
         mov [bp-2],ax     ;Save BmpWidth                                            ;;
         mov [bp-4],ax     ;Save BmpOnScreenWidth                                    ;;
         mov [bp-6],ax     ;Save BytePerRow                                          ;;
         mov cl,4                                                                    ;;
         div cl                                                                      ;;
         cmp ah,0                                                                    ;;
         jz  NoDwAA        ;No Dword align adjust                                    ;;
         mov cl,4                                                                    ;;
         sub cl,ah                                                                   ;;
         add [bp-6],cl                                                               ;;
NoDwAA:                                                                              ;;
         mov cx,0                                                                    ;;
         mov [bp-8],cx     ;Save LeftCutWidth,Default = 0                            ;;
         mov si,016h                                                                 ;;
         mov ax,[si]                                                                 ;;
         mov [bp-10],ax    ;Save BmpHeight                                           ;;
         mov [bp-12],ax    ;Save BmpOnScreenHeight                                   ;;
         mov si,01ch                                                                 ;;
         mov ax,[si]                                                                 ;;
         mov [bp-14],ax    ;Save BitPerPixel                                         ;;
         mov si,0eh                                                                  ;;
         mov ax,[si]       ;Save bmpfileheader length                                ;;
         add ax,14                                                                   ;;
         mov [bp-16],ax    ;Save PaletteOffset                                       ;;
         mov si,0ah                                                                  ;;
         mov ax,[si]                                                                 ;;
         mov [bp-18],ax    ;Save ImgDataOffset                                       ;;
         ;mov [bp-20],0     ;Save RowOffset                                          ;;
                                                                                     ;;
;====================================================================================;; ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;                                                                                    
;        Seve the value to Local variable
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>          jmp CoorDinateX
exitzz:
         jmp exit
CoordinateX:         
         mov ax,[bp+6]     ;X coordinate
         push ax
         and ah,80
         pop ax
         jz  PositiveX     ;If X coordinate>=0,jump
         mov ax,[bp+6]
         push ax
         not ax
         inc ax
         mov [bp-8],ax     ;Save LeftCutWidth
         pop ax
         add ax,[bp-2]     ;X coordinate add BmpWidth
         jnc exitzz        ;Exit if X coordinate add BmpWidth < 0
         jz exitzz         ;Exit if X coordinate add BmpWidth = 0
         push ax
         mov cx,320
         sub cx,ax
         mov [bp-20],cx    ;Save RowOffset
         add ax,[bp-8]     
         mov [bp-4],ax     ;Save BmpOnScreenWidth + LeftCut
         pop ax
         mov cx,320
         cmp cx,ax
         jnc NoWOverf      ;No Width Overflow
         mov ax,[bp-8]
         add ax,320
         mov [bp-4],ax     ;Save BmpOnScreenWidth = 320 + LeftCutWidth
         mov ax,0
         mov [bp-20],ax
NoWOverf:
         mov ax,0
         mov [bp+6],ax
         jmp CoordinateY
PositiveX:
         cmp ax,320
         jnc exitzz
         mov cx,320
         sub cx,[bp-2]
         mov [bp-20],cx
         add ax,[bp-2]
         mov cx,320
         cmp cx,ax
         jnc CoordinateY
         mov ax,320
         sub ax,[bp+6]
         mov [bp-4],ax     ;Save OnScreenWidth
         mov cx,320
         sub cx,ax
         mov [bp-20],cx    ;SaveRowOffset
CoordinateY:
         mov ax,[bp+8]     ;Y coordinate
         push ax
         and ah,80
         pop ax
         jz PositiveY
         add ax,[bp-10]
         jnc exitzz1
         jz exitzz1
         mov [bp-10],ax    ;Save BmpHeight
         mov [bp-12],ax    ;Save OnScreenHeight
         mov cx,0
         mov [bp+8],cx
         mov cx,200
         cmp cx,ax
         jnc SetInt10      ;No Height Overflow
         mov cx,200
         mov [bp-12],cx
NoHOverf:        
         jmp SetInt10
exitzz1:
         jmp exit
PositiveY:
         cmp ax,200
         jnc exitzz1
         add ax,[bp-10]
         mov cx,200
         cmp cx,ax
         jnc SetInt10
         mov ax,200
         sub ax,[bp+8]
         mov [bp-12],ax ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> ;**************************************************************************************
;                                                                                    
;        Set the Palette register and copy image data to video buffer which
;        address start at A000:0000.
;
;************************************************************************************** SetInt10:
         mov ax,013h     
         int 10h          ;Set Video Mode to 13h
         mov dx,03c6h
         mov ax,0ffh
         out dx,ax
         mov si,[bp-16]
         mov di,0
         mov cx,256
SetPalette:        
         mov dx,03c8h
         mov ax,di
         out dx,al
         mov dx,03c9h
         mov al,byte ptr[si+2]
         push bx
         mov bl,63
         mul bl
         mov bl,0ffh
         div bl
         pop bx
         out dx,al
         mov al,byte ptr[si+1]
         push bx
         mov bl,63
         mul bl
         mov bl,0ffh
         div bl
         pop bx
         out dx,al
         mov al,byte ptr[si]
         push bx
         mov bl,63
         mul bl
         mov bl,0ffh
         div bl
         pop bx
         out dx,al
               add si,4
         inc di
         loop SetPalette
Showbmp:
         mov ax,0a000h    ;Video memory start address   
         mov es,ax
         mov ax,[bp+8]
         mov cx,320
         mul cx
         add ax,[bp+6]
         mov di,ax
vertical:
         cmp word ptr[bp-12],0
         jz exit
         dec word ptr[bp-10]
         dec word ptr[bp-12]
         mov ax,[bp-10]
         mul word ptr[bp-6]
         mov bx,ax
         add bx,[bp-18]
         mov si,0
         add si,[bp-8]
horizon:
         cmp si,word ptr[bp-4]
         jz horizonend
         mov al,[bx][si]
         mov es:[di],al
         inc si
         inc di
         jmp horizon
horizonend:
         add di,[bp-20]
         jmp Vertical
       
;************************************************************************************** exit:
         pop es
         pop di
         pop si
         pop dx
         pop cx
         pop bx
         pop ax
         add sp,20
         pop bp
         ret 6
Bitmap   endp
Code     Ends
         End Start

masm编译后
在同目录下放入.bmp图片文件
然后运行bitmap.exe

可以看到全屏显示了T00LS的logo了
按任意键可以退出

代码中修改文件名和从X、Y读取的地方我做了注释

【assembly】用汇编写的一个BMP图片读取器的更多相关文章

  1. 【Android】内存卡图片读取器,图库app

    上一篇<[Android]读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示>(点击打开链接)在真机上測试非常有问题.常常遇到内存溢出.卡死的情况.由于如今真机上的内存上,2G ...

  2. 恶意软件开发——编写第一个Loader加载器

    一.什么是shellcode loader? 上一篇文章说了,我们说到了什么是shellcode,为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shel ...

  3. 图片拾取器-PicPicker

    最近报名参加了360前端星计划,想当一名前端实习生,学习更多更流行的前端知识.然后需要完成一个作业,才能进培训,进了培训还得看运气才能留下,流程不少.书归正传,请看: 课后作业题目 请从下面两个题目中 ...

  4. mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等

    mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签 ...

  5. 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题

    #include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...

  6. 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题

    #include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...

  7. bmp图片格式及读取

    C++读取bmp图片的例子 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include ...

  8. [转]opengl入门例题(读取bmp图片,并显示)

    #include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...

  9. 用Delphi直接获取bmp图片的像素

    用Delphi直接获取bmp图片的像素,并存储显示出.(此像素主要用在LED上显示).希望高手能给出代码啊!! function getImagePixels(f: string): Integer; ...

随机推荐

  1. 对string 的操作

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  2. 64位linux安装32位校园网客户端

    下面的是ubuntu下和arch下的安装方法,ubuntu的转自网络, ubuntu: 下载客户端并解压 安装开发包 1 sudo -i 2 dpkg --add-architecture i386 ...

  3. 【codeforces】【比赛题解】#948 CF Round #470 (Div.2)

    [A]Protect Sheep 题意: 一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉. 可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的. 问是否能够保护所有的羊 ...

  4. collision

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAd0AAACYCAIAAAAuvaRSAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu

  5. Docker基础速成(一)

    Docker基础速成(一) 给亲爱的写的docker基础速成,按照步骤操作,实践出真知,希望有提纲挈领之功效 1.docker简介 Docker 轻量级容器,如图,类似于一个个集装箱,把复杂或者零散的 ...

  6. textarea保留换行和空格

    <style> pre {white-space: pre-wrap;} </style> //替换textare <pre class="feedback_q ...

  7. The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context,

    在iis7.0布署网站后运行的错误,大致意思是:数据保护操作是不成功的.这可能是由于没有为当前线程的用户加载用户配置文件的导致 解决办法: 先为自己的网站新建一个应用程序池,然后新建的应用程序池上右键 ...

  8. cocos2dx中调用TinyXml读取xml配置文件 || cocos2d-x 中跨平台tinyxml读取xml文件方式

    TiXmlDocument *doc = newTiXmlDocument; #if (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID) //Android平台tin ...

  9. HTTP Headers解析

    什么是HTTP Headers? 它包含了哪些内容? 利用requests.get()函数对豆瓣读书进行请求, 返回的r.headers如下所示: >>> import reques ...

  10. Centos之压缩和解压缩命令

    常用压缩格式:.zip .gz .bz2 常用压缩格式:.tar.gz  .tar.bz2 zip格式压缩 zip压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 [root@ ...