回 帖 发 新 帖 刷新版面

主题:各位大虾看下这个程序哪错了

这是我编写的一个程序,功能是:输入两个字符串,判断所含字符是否相同,相同则输出:MATCH,不相同则输出:NOMATCH,我现在不懂的是如何给输入的字符串分配存储空间


DATA SEGMENT
     INFOR1 DB 0AH,0DH,"MATCH! $"
     INFOR2 DB 0AH,0DH,"NOMATCH! $"
     INFOR3 DB 0AH,0DH,"please input the first one: $"
     infor4 DB 0AH,0DH,"please input the second one: $"
     IBUF DB 7,0,6 DUP(?)
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      LEA DX,INFOR3
      MOV AH,09H
      INT 21H
      LEA  DX,IBUF
      MOV AH,0AH
      INT 21H
      MOV BX,DX
      PUSH BX
      LEA DX,INFOR4
      MOV AH,09H
      INT 21H
      LEA DX,IBUF
      MOV AH,0AH
      INT 21H
      POP BX
      CMP BX,DX
      JZ MATCH
      LEA DX,INFOR2
      MOV AH,09H
      INT 21H
      JMP PEND
MATCH:LEA DX,INFOR1
      MOV AH,09H
      INT 21H
PEND:MOV AH,4CH
     INT 21H
CODE ENDS
     END START

回复列表 (共3个回复)

沙发

改了下,如下,这个又错在哪了,我运行时,总在
NEXT: CMP DX,BX 
      JZ NEXT
死循环
DATA SEGMENT
     INFOR1 DB 0AH,0DH,"MATCH! $"
     INFOR2 DB 0AH,0DH,"NOMATCH! $"
     INFOR3 DB 0AH,0DH,"please input the first one: $"
     infor4 DB 0AH,0DH,"please input the second one: $"
     IBUF DB 7,0,6 DUP(?)
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      LEA DX,INFOR3
      MOV AH,09H
      INT 21H
      LEA  DX,IBUF
      MOV AH,0AH
      INT 21H
      MOV CL,IBUF+1 
      LEA SI,IBUF+2 
      LEA DX,INFOR4
      MOV AH,09H
      INT 21H
      LEA BX,IBUF
      MOV AH,0AH
      INT 21H
      MOV CH,IBUF+1
      LEA DI,IBUF+2
      CMP CH,CL
      JNZ NOMATCH
      MOV DX,[SI]
      MOV BX,[DI]
NEXT: CMP DX,BX 
      JZ NEXT
      JNZ NOMATCH
      INC SI
      INC DI
      DEC CL 
      JZ MATCH
NOMATCH:LEA DX,INFOR2
      MOV AH,09H
      INT 21H
      JMP PEND
MATCH:LEA DX,INFOR1
      MOV AH,09H
      INT 21H
PEND:MOV AH,4CH
     INT 21H
CODE ENDS
     END START           

板凳

;功能是:输入两个字符串,判断所含字符是否相同,相同则输出:MATCH,不相同则输出:NOMATCH

DATA SEGMENT
     INFOR1 DB 0AH,0DH,"MATCH! $"
     INFOR2 DB 0AH,0DH,"NOMATCH! $"
     INFOR3 DB 0AH,0DH,"please input the first one: $"
     infor4 DB 0AH,0DH,"please input the second one: $"
     string1 db 20,0,20 DUP(?)   ;用于输入第一个字符串,假设不超过20个
     string2 db 20,0,20 DUP(?)   ;用于输入第二个字符串
DATA ENDS
STACK SEGMENT STACK PARA 'STACK'
      DW 256 DUP(?)
STACK ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
      MOV DS,AX
      mov es,ax
      LEA DX,INFOR3
      MOV AH,09H
      INT 21H
      LEA  DX,string1
      MOV AH,0AH
      INT 21H
      LEA DX,INFOR4
      MOV AH,09H
      INT 21H
      LEA DX,string2
      MOV AH,0AH
      INT 21H
      mov al,string1[1]
      CMP al,string2[1] ;比较两次输入的字符数是否相等
      Jne NOMATCH       ;不相等则不匹配
      LEA SI,STRING1[2]
      LEA DI,STRING2[2]
      MOV CL,AL
      MOV CH,0
      REPE CMPSB        ;字符串比较
      JNZ NOMATCH
      LEA DX,INFOR1
      MOV AH,09H
      INT 21H
      JMP PEND
NOMATCH:LEA DX,INFOR2
      MOV AH,09H
      INT 21H
PEND:MOV AH,4CH
     INT 21H
CODE ENDS
     END START
;在MASM615下汇编通过无误,功能正确

3 楼

(1)从键盘读入一个字符 
    功能号:1    
    入口参数:无   
    出口参数:AL=输人字符的ASCII码
功能:等待从键盘读入一个字符,将字符的ASCII码送给AL,同时将该字符显示在屏幕上。
调用方法:
         MOV  AH,l    ;AH中存放的是功能号
         INT 21H
说明:在输入一个字符后,不需要键入回车。若只键入回车,则出口参数AL得到的是回车符的ASCII码0DH。
(2)显示一个字符
   功能号:2    
   入口参数:DL=要显示字符的ASCII码
   出口参数:无 
   功能:在当前光标位置显示DL中的字符,然后光标右移。
   调用方法示例:  下列指令序列用来显示字符’A’
MOV   DL,‘A’
MOV   AH,2
INT    2lH
(3)显示一个字符串 
功能号;9
入口参数;DS:DX=欲显示的字符串在内存的首地址。字符串必须以’$’作为结束标志,’$’不属于被显示的字符串。
出口参数:无
功能:在当前光标位置,显示由DS:DX所指的、以’$’为结束标志的字符串,然后光标右移。
调用方法示例:

STRING    DB  ‘Hello world!’,’$’

下列指令序列用来显示String中的字符串‘Hello world!’。
MOV  AX,SEG STRING 
MOV  DS,AX
LEA   DX,STRING
MOV  AH,9
INT   21H
(4)从键盘读入一个字符串
功能号:0AH
入口参数:DS:DX=输人缓冲区的首地址
输入缓冲区格式:第0个字节给出输入缓冲区最多能容纳的字符个数(1~255,包括回车符),由应用程序设置;第1个字节将存放实际输人的字符个数(不包括回车符),由系统在读入字符串后自动设置;从第2个字节开始存放实际输入的字符串,最后为回车符的ASCII码0DH。
出口参数;无
功能:从键盘读入一个字符串,存入由DS:DX所指的输入缓冲区。
说明:
•在输入字符串后,必须以回车结束。
•当输人的字符数达到了输入缓冲区所能容纳的字符个数减l时,随后的输入将不被系统接收,且响铃警告。
  调用方法示例:
……
    BUF  DB  80           ;定义输入缓冲区,最多容纳79个字符与1个回车符
         DB  ?            ;存放实际输入的字符个数,由系统自动设置
         DB  80 DUP (?)   ;存放实际输入的字符串
……
下列指令序列将从键盘读人字符串(长度<80,并存入输入缓冲区BUF中
   MOV AX,SEG BUF
   MOV DS,AX
   MOV DX,OFFSET BUF
   MOV AH,0AH
   INT 21H
假定的字符串为’ABC’,则输入缓冲区BUF的内容如下:
   BUF+1: 3        ; 输入字符个数为3
   BUF+2: 61H     ;’A’的ASCII码
   BUF+3: 62H     ;’B’的ASCII码
   BUF+4: 63H     ;’C’的ASCII码  
   BUF+5: 0DH     ;回车符的ASCII码  

我来回复

您尚未登录,请登录后再回复。点此登录或注册