【assembly】用汇编写的一个BMP图片读取器
;-----------------------------
;文件满足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图片读取器的更多相关文章
- 【Android】内存卡图片读取器,图库app
上一篇<[Android]读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示>(点击打开链接)在真机上測试非常有问题.常常遇到内存溢出.卡死的情况.由于如今真机上的内存上,2G ...
- 恶意软件开发——编写第一个Loader加载器
一.什么是shellcode loader? 上一篇文章说了,我们说到了什么是shellcode,为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shel ...
- 图片拾取器-PicPicker
最近报名参加了360前端星计划,想当一名前端实习生,学习更多更流行的前端知识.然后需要完成一个作业,才能进培训,进了培训还得看运气才能留下,流程不少.书归正传,请看: 课后作业题目 请从下面两个题目中 ...
- mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等
mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签 ...
- 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题
#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...
- 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
#include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...
- bmp图片格式及读取
C++读取bmp图片的例子 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include ...
- [转]opengl入门例题(读取bmp图片,并显示)
#include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...
- 用Delphi直接获取bmp图片的像素
用Delphi直接获取bmp图片的像素,并存储显示出.(此像素主要用在LED上显示).希望高手能给出代码啊!! function getImagePixels(f: string): Integer; ...
随机推荐
- 查看GCC的内置宏定义
开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就 ...
- 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...
- 让arch阻止某个软件包的升级
我更新了eclipse-java Mars版本的,感觉特别的卡,而且还有好多bug,不知道为什么,因此我去官网下载了luna版本的eclipse的安装包,不知道怎么下载的点击这里,然后安装luna版本 ...
- 编译安装 zbar 时两次 make 带来的惊喜
为了装 php 的条形码扩展模块 php-zbarcode,先装了一天的 ImageMagick 和 zbar.也许和我装的 Ubuntu 17.10 的有版本兼容问题吧,总之什么毛病都有,apt 不 ...
- Access中替代case when的方法 .
最近在做一个用Access的东东,其中用到了case when的方式,但是Access是不支持这种语法的,查询知道IIf和Swith可以作为替代,总结如下: IIf(expr, truepart, f ...
- 四、springcloud之服务调用Feign(二)
一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...
- Flask: Quickstart解读
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 从示例代码说起: from flask import Flask app = Flask(__name__) @app ...
- Windows Phone 8 获取设备名称
通过使用Microsoft.Phone.Info.DeviceStatus类,我们可以获取设备的一些信息,如设备厂商,设备名称等.通过Microsoft.Phone.Info.DeviceStatus ...
- python基础--shutil模块
shutil模块提供了大量的文件的高级操作. 特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 注意 即便是更高级别的文件复制函数(shutil.cop ...
- 在Eclipse中建立Maven工程