例10.6 用键盘输入任意一字符串,分类统计该字符串中每个数字和字母的出现次数。
| 解: | |||
| .MODEL SMALL | |||
| .DATA | |||
| 
       N = 80  | 
  |||
| 
       Buff  | 
    DB N, ?, N DUP(?) | ||
| 
       Num  | 
    DW 36 DUP(0) | ;每个字用于存放'0'~'9','A'~'Z'出现的个数 | |
| .CODE | |||
| 
       .STARTUP  | 
  |||
| 
       LEA  | 
    DX, Buff | ||
| 
       MOV  | 
    AH, 0AH | ||
| 
       INT  | 
    21H | ;输入一个字符串 | |
| 
       XOR  | 
    CH, CH | ||
| 
       MOV  | 
    CL, Buff+1 | ;CX=输入字符串的个数 | |
| 
       LEA  | 
    SI, Buff+2 | ||
| 
       XOR  | 
    BX, BX | ||
| 
       .REPEAT  | 
  |||
| 
       MOV  | 
    BL, [SI] | ;考虑下面的思考题 | |
| 
       INC  | 
    SI | ||
| 
       .IF BL>='0' && BL<='9'  |                          
    ;分类统计'0'~'9'中的每个数字的个数 | ||
| 
       SUB  | 
    BL, '0' | ||
| 
       ADD  | 
    BX, BX | ||
| 
       INC  | 
    Num[BX] | ||
| 
       .CONTINUE  | 
  |||
| 
       .ENDIF  | 
  |||
| 
       .IF BL>='a' && BL<='z'  |                          
  |||
| 
       SUB  | 
    BL, 20H | ;小写变大写 | |
| 
       .ENDIF  | 
  |||
| 
       .IF BL>='A' && BL<='Z'  |                          
    ;分类统计'A'~'Z'中的每个字母的个数 | ||
| 
       SUB  | 
    BL, 'A'-10 | ||
| 
       ADD  | 
    BX, BX | ||
| 
       INC  | 
    Num[BX] | ||
| 
       .ENDIF  | 
  |||
| 
       .UNTILCXZ  | 
  |||
| 
       .EXIT 0  |                          
  |||
| 
       END  | 
  |||
思考题:在本例中,用指令“MOV BL, [SI]”来把当前检测的字符存入BL,当然,我们也可以用AL来代替BL,有关指令要作相应的改动,但这样做,会更方便吗?希望读者能知道:为什么要用BL,而不用AL?