卖向日葵的 发表于 2012-12-4 20:52:05

代码题~

有点长{:5_109:}要求1、        从键盘输入两个字符串:A串,例如’software’;B串,例如’school of software engineering’;
2、        判断A在B中是否存在,如果存在,输出“FOUND”,反之,输出“NOT FOUND”;
3、        (确定一个B串中多处存在A串的例子),用一个C串去替换A串(A与C长度不一样,取代所有相同的串),替换后的结果在显示器上显示。

实现了前两个功能,差第三个。我想问缓冲区最多可以定义几个?只有di和si可以指向缓冲区吗??
第三个给个思路{:5_93:}
      DATASEGMENT

   BUFFERADB      32          ;两段缓冲区,为什么是32???
            DB      0
            DB      32 DUP(0)
   BUFFERBDB      32
            DB      0
            DB      32 DUP(0)
   BUFFERCDB      32
            DB      0
            DB      32 DUP(0)
   BUFFERDDB      32
            DB      0
            DB      32 DUP(0)
         PROMPTSTRINGADB      'input A string:',0AH,0DH,'$'       ;输出语句
         PROMPTSTRINGBDB      'input B string:',0AH,0DH,'$'
         PROMPTSTRINGCDB      'input C string TO replace A :',0AH,0DH,'$'
       PROMPTSTRINGENTERDB      0AH,0DH,'$' ;回车换行结束?




FOUNDSTRINGDB      'FOUND IT',0AH,0DH,'$'

          NOTFOUNDSTRINGDB      'NOT FOUND IT',0AH,0DH,'$'

      DATAENDS

      CODESEGMENT
            ASSUME    CS:CODE,DS:DATA

      START:
;input A B string
            MOV       DX,DATA
            MOV       DS,DX

            MOV       DX,OFFSET PROMPTSTRINGA ;
            MOV       AH,09H      ;功能号代表字符串输出
            INT       21H         ;dos功能调用in 21h
            MOV       DX,SEG BUFFERA          ;字符串输入,获得段地址
            MOV       DS,DX
            MOV       DX,OFFSET BUFFERA
            MOV       AH,0AH
            INT       21H

            MOV       DX,OFFSET PROMPTSTRINGENTER
            MOV       AH,09H
            INT       21H



            MOV       DX,OFFSET PROMPTSTRINGB
            MOV       AH,09H
            INT       21H
            MOV       DX,SEG BUFFERB
            MOV       ES,DX
            MOV       DX,OFFSET BUFFERB
            MOV       AH,0AH
            INT       21H

            MOV       DX,OFFSET PROMPTSTRINGENTER
            MOV       AH,09H
            INT       21H



            MOV       DX,OFFSET PROMPTSTRINGENTER
            MOV       AH,09H
            INT       21H
            MOV       DX,OFFSET PROMPTSTRINGC
            MOV       AH,09H
            INT       21H
            MOV       DX,SEG BUFFERC
            MOV       ES,DX
            MOV       DX,OFFSET BUFFERC
            MOV       AH,0AH
            INT       21H

            MOV       DX,OFFSET PROMPTSTRINGENTER
            MOV       AH,09H
            INT       21H

            MOV       DX,SEG BUFFERD


;look for if A in B
            MOV       SI,OFFSET BUFFERA       ;获得字符串A的偏移地址
            MOV       DI,OFFSET BUFFERB
            ADD       SI,02H      ;指向
            ADD       DI,01H      ;the same
            PUSH      SI          ;干嘛push啊??
            PUSH      DI

            MOV       BX,ES:;字符串B长度
            MOV       BH,00H      ;干嘛的?因为是输的是字节?

            MOV       CX,DS:          ;为什么-1? 第2字节将存放实际输入抵符个数
            MOV       CH,00H
            PUSH      CX          ;A的长度?   第二层循环次数
      AGAIN:
            POP       CX          ;   循环开始了????
            POP       DI
            INC       DI          ;
            POP       SI

            PUSH      SI          ;
            PUSH      DI
            PUSH      CX
      REPZCMPSB               ;字符串比较
            JZ      FOUND       ;判断是否结束
            SUB       BL,01H      ;B-1后的长度
            JZ      NOTFOUND    ;         
    JMP       AGAIN
      FOUND:MOV       DX,OFFSET FOUNDSTRING
            MOV       AH,09H
            INT       21H

            JMP       ENDPRO

   NOTFOUND:MOV       DX,OFFSET NOTFOUNDSTRING
            MOV       AH,09H
            INT       21H
;USE C TO REPLACE A






   ENDPRO:MOV       AX,4C00H
            INT       21H

      CODEENDS
            END       START
页: [1]
查看完整版本: 代码题~