DOS及BIOS中断调用实验

1.实现简单的人机对话功能

STACKA SEGMENT

DB 100 DUP(?)

STACKA ENDS

DATA SEGMENT

MESS1 DB 'WHAT IS YOUR NAME?','$'

MESS2 DB 'HOW OLD ARE YOU?','$'

BUF1 DB 20

DB ?

DB 20 dup(?)

BUF2 DB 15

DB ?

DB 15 dup(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKA

MAIN PROC FAR

START: PUSH DS

MOV AX,0

PUSH AX

MOV AX,DATA

MOV DS,AX

 

MOV DX,OFFSET MESS1

MOV AH,9

INT 21H

 

MOV DX,OFFSET BUF1

MOV AH,0AH

INT 21H

 

MOV DX,OFFSET MESS2

MOV AH,9

INT 21H

 

MOV DX,OFFSET BUF2

MOV AH,0AH

INT 21H

 

RET

MAIN ENDP

CODE ENDS

END START

2.键盘输入判断

STACKA SEGMENT

DB 100 DUP(?)

STACKA ENDS

DATA SEGMENT

MESSER DB 'ERROR',0AH,0DH,'$'

MESSRI DB 'RIGHT',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKA

START:

MOV AX,DATA

MOV DS,AX

 

READ1: MOV AH,01H;读入第一个字符

INT 21H

CMP AL,30H

JL ERROR1;比'0'小报错

CMP AL,39H

JG ERROR1;比'9'大报错

 

READ2: MOV AH,01H;读入第二个字符

INT 21H

CMP AL,41H

JL ERROR2;比'A'小报错

CMP AL,7AH

JG ERROR2;比'z'大报错

CMP AL,5AH;与'Z'比较

JG NEXT

JMP RIGHT;正确,数字+大写字母

NEXT: CMP AL,61H;与'a'比较

JL ERROR2

JMP RIGHT;正确,数字+小写字母

 

ERROR1:MOV DX,OFFSET MESSER;显示错误信息

MOV AH,09H

INT 21H

JMP READ1;返回第一个出错处

 

ERROR2:MOV DX,OFFSET MESSER;显示错误信息

MOV AH,09H

INT 21H

JMP READ2;返回第二个出错处

 

RIGHT: MOV DX,OFFSET MESSRI;显示正确信息

MOV AH,09H

INT 21H

 

MOV AH,4CH;返回DOS

INT 21H

CODE ENDS

END START

3.分类统计字符个数

STACKA SEGMENT

DB 100 DUP(?)

STACKA ENDS

DATA SEGMENT

STRING DB 50,?,50 DUP(?)

DIGIT DB ?

LETTER DB ?

OTHER DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKA

START:

MOV AX,DATA

MOV DS,AX

 

LEA DX,STRING;读入字符串

MOV AH,0AH

INT 21H

LEA SI,STRING;初始化指针

INC SI;指针指向字符个数存放单元

MOV CH,0

MOV CL,[SI];设置循环次数

MOV AH,0;AH DH DL三个计数器清零

MOV DX,0

 

LL: INC SI;指针后移

MOV AL,[SI];取数

 

CMP AL,30H;与'0'比较

JL OTHERS

CMP AL,39H;与'9'比较

JG CHAR

INC AH;数字计数器加1

JMP NEXT

 

CHAR: CMP AL,41H;与'A'比较

JL OTHERS

CMP AL,7AH;与'z'比较

JG OTHERS

CMP AL,5AH;与'Z'比较

JG DAXIE

INC DH;字母计数器加1

JMP NEXT

DAXIE: CMP AL,61H;与'a'比较

JL OTHERS

INC DH;其他字符计数器加1

JMP NEXT

OTHERS: INC DL

NEXT: LOOP LL

 

MOV DIGIT,AH;存结果

MOV LETTER,DH

MOV OTHER,DL

 

MOV DL,0AH;换行     

MOV AH,02H

INT 21H

 

MOV BL,DIGIT;显示数字的个数

CALL DISP

 

MOV BL,LETTER;显示字母的个数

CALL DISP

 

MOV BL,OTHER;显示其他字符的个数

CALL DISP

 

MOV AH,4CH

INT 21H

DISP PROC NEAR

MOV DL,BL

SHR DL,1;右移四位,取高位,TASM中可用SHR DL,4

SHR DL,1

SHR DL,1

SHR DL,1

ADD DL,30H;加30H,变成ASCII码    

MOV AH,02H;显示

INT 21H

MOV DL,BL

AND DL,0FH;取低位

CMP DL,9

JBE NEXT1

ADD DL,7;A~F加7

NEXT1: ADD DL,30H;加30H,变成ASCII码     

MOV AH,02H;显示

INT 21H

RET

DISP ENDP

CODE ENDS

END START

posted on 2008-11-09 12:50  光影  阅读(357)  评论(0编辑  收藏  举报

导航