使用汇编直接写屏

来源:互联网 发布: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
原创粉丝点击