首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

关于键盘输入字符串的有关问题

2012-03-02 
关于键盘输入字符串的问题有道题目:从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并

关于键盘输入字符串的问题
有道题目:从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。

以下为小弟的程序:

STACK   SEGMENT
            DB   200(?)
STACK   ENDS
DATA   SEGMENT
SUM   DB   ?
BUF   DB   "PLASE   INPUT   A   CHARACTER   STRING:$ "
BUF1   DB   30
          DB   ?
          DB   30   DUP(?)
BUF2   DB   0AH,0DH, "(SUM)= "
BUF3   DB   4   DUP(?)
DATA   ENDS
CODE   SEGMENT
          ASSUME   DS:DATA,CS:CODE,SS:STACK
BEGIN:MOV   AX,DATA
            MOV   DS,AX
            MOV   AH,9
            LEA   DX,BUF
            INT   21H
            MOV   AH,10
            LEA   DX,BUF1
            INT   21H
            XOR   CL,CL
            LEA   SI,BUF1+2
COMP:MOV   DL,[SI]
          CMP   DL, "$ "
          JZ   DISPLAY
          CMP   DL,30H
          JB   CHAR
          CMP   DL,39H
          JA   CHAR
          INC   SI
          JMP   COMP
CHAR:INC   SI
          INC   CL
          JMP   COMP
DISPLAY:MOV   SUM,CL
                LEA   DI,BUF3
                MOV   SUM,AL
                MOV   CL,4
                SHR   AL,CL
                OR   AL,30H
                MOV   BUF3,AL
                INC   DI
                AND   AL,0FH
                OR   AL,30H
                CMP   AL,3AH
                JB   STORE
                ADD   AL,07H
STORE:AND   AL,0FH
            MOV   BUF3,AL
            INC   DI
            MOV   BYTE   PTR[DI], 'H '
            INC   DI
            MOV   BYTE   PTR[DI], '$ '
            MOV   AH,9
            LEA   DX,BUF2+4
            INT   21H
            MOV   AH,4CH
            INT   21H
CODE   ENDS
          END   BEGIN



运行结果:
输入前为:PLASE   INPUT   A   CHARACTER   STRING:
键盘键入abcd$后按回车的结果为:UM)=     HNPUT   A   CHARACTER   STRING:abcd$

请问哪里错了,如何修改,谢谢

[解决办法]
...
COMP:MOV DL,[SI]
CMP DL, "$ "
JZ DISPLAY

cmp dl, 0dh ;*+ 为了防止没用按规定输入 '$ ' 结束字符
jz display ;*+

CMP DL,30H
JB CHAR
CMP DL,39H
JA CHAR
INC SI
JMP COMP
CHAR:INC SI
INC CL
JMP COMP
DISPLAY:MOV SUM,CL
LEA DI,BUF3
mov al, sum ;* MOV SUM,AL
MOV CL,4
SHR AL,CL
OR AL,30H
MOV BUF3,AL
INC DI
mov al, sum ;*+ 需要重新读取 sum, 因为上面的操作破坏了原来的值
AND AL,0FH
OR AL,30H
CMP AL,3AH
JB STORE
ADD AL,07H
STORE: ;*- AND AL,0FH ;
MOV BUF3[1],AL ;*
INC DI
MOV BYTE PTR[DI], 'H '
INC DI
MOV BYTE PTR[DI], '$ '
MOV AH,9
LEA DX,BUF2 ;*- +4
...
[解决办法]
我覺得樓主的程序有一個地方值得改進:既然用到了輸入字符串的10號子功能,(由樓主所定義的:
BUF1 DB 30
DB ?
DB 30 DUP(?)

那在循環時完全可以根據buf1+1中的數據來確定cx的值!!這樣在循環體中只需要將字符串的數據逐個與30H~~39H之間比較,若條件符合則將計數器值sum加1(特別注明:樓主將sum初值定為?是一個不確定值,實際上既然是計數,顯然應該從0開始)!!

热点排行