📄 compare.asm
字号:
DATAS SEGMENT
buffer1 label byte
buffer1maxlen db 51
buffer1len db ?
buffer1fld db 51 dup(?)
buffer2 label byte
buffer2maxlen db 51
buffer2len db ?
buffer2fld db 51 dup(?)
cstring1 db 0ah, 0dh, 'Please Input the String:$'
cstring2 db 0ah, 0dh, 'Input the substring:$'
cstring3 db 0ah, 0dh, 'Match At '
cstring3_s db 0,0,'$'
cstring4 db 0ah, 0dh, 'No match!$'
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
mov AX, DATAS
mov ds, AX
mov DX, OFFSET cstring1
mov ah,09h
int 21h
mov ax, seg buffer1
mov eS, ax
mov dx, offset buffer1 ;将主串放入buffer1
mov ah, 0ah
int 21h
mov DX, OFFSET cstring2
mov ah, 09h
int 21h
mov ax, seg buffer2
mov ds, ax
mov dx, offset buffer2 ;将子串放入buffer2
mov ah, 0ah
int 21h
lea di, buffer1fld
lea si, buffer2fld
mov ch,0h
mov cl, [buffer1len]
mov al, [buffer2len]
sub cl, al
inc cl
inc cl
CLD
s:
mov al, ds:[si] ;查找第一个字符匹配
REPNE SCAS byte ptr ES:[DI]
jcxz dismatch
push cx ;存游标位置
mov cl, [buffer2len]
inc si
repe cmpsb byte ptr DS:[SI], byte ptr ES:[DI] ;匹配剩下位置,不对则退出,恢复现场
jcxz match
mov al, [buffer2len] ;Context Switch
sub al, cl
mov cl , al
sub si, cx
dec si
sub di, cx ;恢复原现场
pop cx
jmp short s
match: ;计算并输出匹配位置
mov ax, di
sub ax, offset buffer1fld
mov bl, [buffer2len]
sub al, bl
mov cl, 4
mov ah, al
shr al, cl ;al存低四位
mov bl, ah ;bl存高四位
and bl, 00001111B ; mask off
;转换为ASCII码
add al,30H
cmp al,39H
js next1
add al,07H
next1:
add bl, 30h
cmp bl, 39H
js next2
add bl,07H
next2:
mov [cstring3_s], al
mov 1[cstring3_s], bl
mov DX, OFFSET cstring3
mov ah, 09h
int 21h
jmp short over
dismatch: ; 不匹配:-(
mov DX, OFFSET cstring4
mov ah, 09h
int 21h
over: ; 退出
MOV AH,4CH
INT 21H
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -