使用汇编直接写屏
来源:互联网 发布:ipadpro绘图软件 编辑:程序博客网 时间:2024/05/16 05:29
直接写屏 挺有意思的,能直接访问显存地址。可以看看下面这个事例。
;功能:显示所按字符键的ASCII码
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
TOP LABEL WORD
SSEG ENDS
;
DSEG SEGMENT
MESS1 DB 'Please,press any key.',0DH,0AH,24H
MESS2 DB 'ASCII Code:'
MESS2_L=$-OFFSET MESS2
MESS3 DB 2 DUP(?)
MESS3_L=$-OFFSET MESS3
COLORB DB 00000001B,00000100B,00001110B,00000111B ;蓝,红,黄,白
COLORE LABEL BYTE
DSEG ENDS
;
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MESS1
MOV AH,9
INT 21H
AGAIN: MOV AH,1
INT 16H
JZ NEXT
MOV AH,0
INT 16H
JMP AGAIN
NEXT: MOV AH,0
INT 16H
CALL CHECKPRE
JNZ NEXT2
NEXT2: CALL ASCTOH1
MOV DI,OFFSET COLORE-1
MOV BL,DS:[DI]
MOV SI,OFFSET MESS2
MOV CX,MESS2_L
MOV DH,22
MOV DL,20
CALL SCREEN
MOV DI,OFFSET COLORB
MOV BL,DS:[DI]
MOV SI,OFFSET MESS3
MOV CX,MESS3_L
MOV DH,22
MOV DL,31
CALL SCREEN
JMP AGAIN
;
;子程序名:ASCTOH1
;功能:将压缩BCD码转成对应的ASCII码
;入口参数:AL=压缩BCD码
;出口参数:存入以MESS3为首地址的内存中
;说明:将调用子程序ASCTOH2
ASCTOH1 PROC
PUSH BX
PUSH CX
XOR BX,BX
MOV CX,2
SECOND: ROL AL,1
ROL AL,1
ROL AL,1
ROL AL,1
MOV AH,AL
CALL ASCTOH2
NEXTASC: MOV MESS3[BX],AH
INC BX
LOOP SECOND
POP CX
POP BX
RET
ASCTOH1 ENDP
;
;子程序名:ASCTOH2
;功能:将数字转成对应的ASCII码
;入口参数:AH=要转成ASCII的数字
;出口参数:AH=数字的ASCII码
ASCTOH2 PROC
AND AH,0FH
ADD AH,30H
CMP AH,'9'
JBE OK
ADD AH,7
OK: RET
ASCTOH2 ENDP
;
;子程序名:SCREEN
;功能:直接写屏
SCREEN PROC
MOV AX,0B800H
MOV ES,AX
MOV AL,80
MUL DH
XOR DH,DH
ADD AX,DX
ADD AX,AX
XCHG AX,BX
MOV AH,AL
JCXZ THEND
RAGAIN: MOV AL,[SI]
INC SI
MOV ES:[BX],AX
INC BX
INC BX
LOOP RAGAIN
THEND: RET
SCREEN ENDP
;
;子程序名:CHECKPRE
;功能:检测到ESC键,就退出
;入口参数:AL=检测到键的ACSII码
;出口参数:AL保持不变.ZF=0,非ESC键
CHECKPRE PROC
PUSH AX
ESCKEY=1BH
CMP AL,ESCKEY
JNZ RETEN ;是,返回DOS
MOV AH,4CH
INT 21H
RETEN: POP AX
RET
CHECKPRE ENDP
;
CSEG ENDS
END START
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
TOP LABEL WORD
SSEG ENDS
;
DSEG SEGMENT
MESS1 DB 'Please,press any key.',0DH,0AH,24H
MESS2 DB 'ASCII Code:'
MESS2_L=$-OFFSET MESS2
MESS3 DB 2 DUP(?)
MESS3_L=$-OFFSET MESS3
COLORB DB 00000001B,00000100B,00001110B,00000111B ;蓝,红,黄,白
COLORE LABEL BYTE
DSEG ENDS
;
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MESS1
MOV AH,9
INT 21H
AGAIN: MOV AH,1
INT 16H
JZ NEXT
MOV AH,0
INT 16H
JMP AGAIN
NEXT: MOV AH,0
INT 16H
CALL CHECKPRE
JNZ NEXT2
NEXT2: CALL ASCTOH1
MOV DI,OFFSET COLORE-1
MOV BL,DS:[DI]
MOV SI,OFFSET MESS2
MOV CX,MESS2_L
MOV DH,22
MOV DL,20
CALL SCREEN
MOV DI,OFFSET COLORB
MOV BL,DS:[DI]
MOV SI,OFFSET MESS3
MOV CX,MESS3_L
MOV DH,22
MOV DL,31
CALL SCREEN
JMP AGAIN
;
;子程序名:ASCTOH1
;功能:将压缩BCD码转成对应的ASCII码
;入口参数:AL=压缩BCD码
;出口参数:存入以MESS3为首地址的内存中
;说明:将调用子程序ASCTOH2
ASCTOH1 PROC
PUSH BX
PUSH CX
XOR BX,BX
MOV CX,2
SECOND: ROL AL,1
ROL AL,1
ROL AL,1
ROL AL,1
MOV AH,AL
CALL ASCTOH2
NEXTASC: MOV MESS3[BX],AH
INC BX
LOOP SECOND
POP CX
POP BX
RET
ASCTOH1 ENDP
;
;子程序名:ASCTOH2
;功能:将数字转成对应的ASCII码
;入口参数:AH=要转成ASCII的数字
;出口参数:AH=数字的ASCII码
ASCTOH2 PROC
AND AH,0FH
ADD AH,30H
CMP AH,'9'
JBE OK
ADD AH,7
OK: RET
ASCTOH2 ENDP
;
;子程序名:SCREEN
;功能:直接写屏
SCREEN PROC
MOV AX,0B800H
MOV ES,AX
MOV AL,80
MUL DH
XOR DH,DH
ADD AX,DX
ADD AX,AX
XCHG AX,BX
MOV AH,AL
JCXZ THEND
RAGAIN: MOV AL,[SI]
INC SI
MOV ES:[BX],AX
INC BX
INC BX
LOOP RAGAIN
THEND: RET
SCREEN ENDP
;
;子程序名:CHECKPRE
;功能:检测到ESC键,就退出
;入口参数:AL=检测到键的ACSII码
;出口参数:AL保持不变.ZF=0,非ESC键
CHECKPRE PROC
PUSH AX
ESCKEY=1BH
CMP AL,ESCKEY
JNZ RETEN ;是,返回DOS
MOV AH,4CH
INT 21H
RETEN: POP AX
RET
CHECKPRE ENDP
;
CSEG ENDS
END START
- 使用汇编直接写屏
- 使用CDirectScreenAcess进行直接写屏
- C/C++中调用直接用汇编写的函数
- 关于直接写屏
- DOS直接写屏
- 关于直接写屏
- 直接写屏
- Linux操作系统下使用FrameBuffer直接写屏
- WinCE5.0下直接写屏 -- 函数 CreateDIBSection() 的使用
- 直接通过framebuffer直接写屏
- 可以使用汇编来写Symbian程序
- 可以使用汇编来写Symbian程序
- 使用内嵌汇编写strcpy
- Linux下使用dosemu写汇编
- 直接写屏显示文字
- RGB24数据直接写屏
- WINCE实现直接写屏
- WINCE实现直接写屏
- WriteXml类(C#)
- pidgin登录QQ提示密码错误的解决办法
- 寻找我的linux学习方向
- 汇编指令
- DataGridView操作细则
- 使用汇编直接写屏
- 如何在treeview中利用数据动态生成树?
- Linux系统下JDK的安装及其配置方法介绍
- 主从表操作
- Ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb。
- 委托加事件:关联选单
- LoadRunner培训教程
- MFC应用程序中打开模式对话框的函数调用顺序
- MFC应用程序关闭窗口的顺序(非模态窗口)