【正确答案】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个。从第一个串中选定一个字符,查看在第二个串中是否也存在相同的字符。如果存在,便存于第三个串中。否则,将第一个串中所有和选定字符相同的字符直接删除,以简化后续的比较和判断。