问答题 已知两组字符串,各有50个字符。找出同在两串中的字符存于第三组字符串中。并统计串长存于SL单元中。
【正确答案】DATA  SEGMENT
     A DB'A23HJL4KJ6LJ7L5L56JKJLLJK75KJ2Lafbgmn...'
     B DB'CJKR9TYY38CNSDGFAZBVEWOK;afhgju75J2Lafbgmn…'
     C DB 100DUP(?)
     D DB 50
   TOTALDB    0
   DIFF DB    1
   DATA ENDS
   CODE SEGMENT
     ASSUME CS: CODE,DS: DATA
   START: MOV  AX,DATA
          MOV  DS,AX
          MOV  SI,OFFSET A
          MOV  DI,OFFSET B
   CCA:   MOV  CX,50
   XXX:   MOV  AL,[SI]
   CBA:   CMP  AL,[DI]
          JZ   FSM    ;在B串中发现和A串相同的字符
          INC  DI    ;修改指针,在B串中查找下一个字符
          LOOP CBA
          INC  SI    ;修改指针,取下一个字符
          CMP  SI,50-1   ;判断A串是否结束
          JNZ  CCA    ;没有结束,继续查找
   FSM:   CALL FSM1
                   ;在B串中查找相同的字符
   MOV    CX,50   ;B串中有50个字符
          LEA DI,B    ;取B串的首地址
   FBB:   CMP AL,[DI]    ;在B串中再查找相同的字符
          JNZ FBC    ;没找到,转移
          INC DIFF    ;找到,将DIFF加1,B串中不再删除字符
   FBC:   INC DI
          LOOP FBB
                 ;将AB串中相同的字符存入C串中,同时修改串的长度
          MOV  DL,DIFF
   FCC:   MOV  [C+TOTAL],AL    ;将相同的字符存入C串中
          INC  C
          DEC  DIFF
          JNZ  FCC    ;判断存入的字符是否达到DIFF个
          ADD  TOTAL,DL    ;累计串长
          MOV  DIFF,01   ;DIFF重新置1
          MOV  CX,BX    ;将A串剩余长度送CX,为下一次寻址做准备
          JZ   OVER
          MOV  SI,00H    ;恢复指针到A串首
          MOV  DI,00H    ;恢复B串首指针
          JMP  XXX
   OVER:  MOV  AH,4CH
          INT  21H
   CODE ENDS
   FSM1 PROC
   FSM2: MOV BX,SI    ;保存找到字符的地址,删除前面字符
         MOV SI,0
   CAA:  MOV AL,[BX+SI]    ;将该字符前移BX位到第一位置
         MOV [SI],AL
         INC  SI
         CMP  [BX+SI],50   ;判断前移是否结束
         JNZ  CAA
         MOV  CX,50
         SUB  CX,BX    ;求出第一个串中剩余字符的个数
         MOV  SI,0
         MOV  AL,[SI]    ;取数,查找两串中都有的字符
   CAB:  INC  SI
         CMP  AL,[SI]
         JNZ  CBB
         INC  DIFF    ;将DIF、F内容加1,表示找到一个相同的字符
         JMP  FSM2
   CBB:  LOOP CAB    ;判断串长是否达到尾部。否,则继续查找
         RET
         ENDP
   END START
【答案解析】字符一般是以ASCⅡ码的形式存放在内存中的,而且同在两串中的字符最多不会超过50个。从第一个串中选定一个字符,查看在第二个串中是否也存在相同的字符。如果存在,便存于第三个串中。否则,将第一个串中所有和选定字符相同的字符直接删除,以简化后续的比较和判断。