直接寫屏 挺有意思的,能直接存取顯存地址。可以看看下面這個案例。
;功能:顯示所按字元鍵的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