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~F7

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

       MOV AH,02H;显示

       INT 21H

       RET

DISP ENDP      

CODE   ENDS

       END START

posted on 2008-11-07 19:05  光影  阅读(488)  评论(0编辑  收藏  举报

导航