
一个比较字符串的汇编程序 大家看看哪里出错啦 全力加分!
代码如下:.modelsmall.386.STACK256.DATARed_on_black_modeTEXTEQU<movbl,00000100b>normal_mod...
代码如下:
.model small
.386
.STACK 256
.DATA
Red_on_black_mode TEXTEQU <mov bl,00000100b>
normal_mode TEXTEQU <mov bl,7>
MAX_SIZE EQU 100
request1 db 'Please enter a long string:',0dh,0ah,'$'
request2 db 'Please enter a short string:',0dh,0ah,'$'
result1 db 'Short string NOT FOUND in long string',0dh,0ah,'$'
result2 db 'Found!',0dh,0ah,'Result:',0dh,0ah,'$'
maxlen_l db MAX_SIZE
actlen_l db ?
long_str db MAX_SIZE dup (?)
maxlen_s db MAX_SIZE
actlen_s db ?
short_str db MAX_SIZE dup (?)
counter db 0
ENTERkey db 0dh,0ah,'$'
.CODE
START:
mov ax,@data
mov ds,ax
lea dx,request1
mov ah,09h
int 21h
lea dx,maxlen_l
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
lea dx,request2
mov ah,09h
int 21h
lea dx,maxlen_s
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
;请求输入两个字符串
lea si,long_str
lea di,short_str
movzx cx,actlen_l
movzx ax,actlen_s
sub cx,ax
inc cx
;外层的cx
cld
Search:
push si
push cx
movzx cx,actlen_s
;内层的cx=短字符串的长度
repe cmpsb
je Success
pop cx
pop si
inc si
loop Search
jmp Fail
Success:
lea dx,result2
mov ah,09h
int 21h ;输出“成功”
;接下来不是重点
sub esp,4
pop si
lea di,long_str
mov bx,si
movzx ax,actlen_s
add bx,ax
dec bx
;di指向长字符串头部,si指向长字符串中匹配短字符串部分的头部,bx指向长字符串中匹配短字符串部分的尾部
mov ah,actlen_l
out_put:
inc counter
cmp counter,ah
je End_position
cmp di,si
jb nor_mode
cmp di,bx
jg nor_mode
special_mode:
mov bh,0
mov cx,1
mov al,[si]
Red_on_black_mode
mov ah,09
int 10h
inc di
jmp out_put
nor_mode:
mov bh,0
mov cx,1
mov al,[di]
normal_mode
mov ah,09
int 10h
inc di
jmp out_put
Fail:
lea dx,result1
mov ah,09h
int 21h
End_position:
mov ax,4c00h
int 21h
END START
搜索匹配字符串,我的思路是先让短字符串的首部对准长字符串的首部,然后以短字符串长度为循环次数比较,若成功,则找到,若未找到匹配的,则将短字符串的首部对准长字符串的第二个字符,以此类推。 展开
.model small
.386
.STACK 256
.DATA
Red_on_black_mode TEXTEQU <mov bl,00000100b>
normal_mode TEXTEQU <mov bl,7>
MAX_SIZE EQU 100
request1 db 'Please enter a long string:',0dh,0ah,'$'
request2 db 'Please enter a short string:',0dh,0ah,'$'
result1 db 'Short string NOT FOUND in long string',0dh,0ah,'$'
result2 db 'Found!',0dh,0ah,'Result:',0dh,0ah,'$'
maxlen_l db MAX_SIZE
actlen_l db ?
long_str db MAX_SIZE dup (?)
maxlen_s db MAX_SIZE
actlen_s db ?
short_str db MAX_SIZE dup (?)
counter db 0
ENTERkey db 0dh,0ah,'$'
.CODE
START:
mov ax,@data
mov ds,ax
lea dx,request1
mov ah,09h
int 21h
lea dx,maxlen_l
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
lea dx,request2
mov ah,09h
int 21h
lea dx,maxlen_s
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
;请求输入两个字符串
lea si,long_str
lea di,short_str
movzx cx,actlen_l
movzx ax,actlen_s
sub cx,ax
inc cx
;外层的cx
cld
Search:
push si
push cx
movzx cx,actlen_s
;内层的cx=短字符串的长度
repe cmpsb
je Success
pop cx
pop si
inc si
loop Search
jmp Fail
Success:
lea dx,result2
mov ah,09h
int 21h ;输出“成功”
;接下来不是重点
sub esp,4
pop si
lea di,long_str
mov bx,si
movzx ax,actlen_s
add bx,ax
dec bx
;di指向长字符串头部,si指向长字符串中匹配短字符串部分的头部,bx指向长字符串中匹配短字符串部分的尾部
mov ah,actlen_l
out_put:
inc counter
cmp counter,ah
je End_position
cmp di,si
jb nor_mode
cmp di,bx
jg nor_mode
special_mode:
mov bh,0
mov cx,1
mov al,[si]
Red_on_black_mode
mov ah,09
int 10h
inc di
jmp out_put
nor_mode:
mov bh,0
mov cx,1
mov al,[di]
normal_mode
mov ah,09
int 10h
inc di
jmp out_put
Fail:
lea dx,result1
mov ah,09h
int 21h
End_position:
mov ax,4c00h
int 21h
END START
搜索匹配字符串,我的思路是先让短字符串的首部对准长字符串的首部,然后以短字符串长度为循环次数比较,若成功,则找到,若未找到匹配的,则将短字符串的首部对准长字符串的第二个字符,以此类推。 展开
3个回答
展开全部
LZ,看你的程序我有点晕.干脆来个大修改吧
已经编译通过了,你自己看看?
.model small
.386
.STACK 256
.DATA
MAX_SIZE EQU 100
request1 db 'Please enter a long string:',0dh,0ah,'$'
request2 db 'Please enter a short string:',0dh,0ah,'$'
result1 db 'Short string NOT FOUND in long string',0dh,0ah,'$'
result2 db 'Found!',0dh,0ah,'Result:',0dh,0ah,'$'
maxlen_l db MAX_SIZE
actlen_l db ?
long_str db MAX_SIZE dup (?)
maxlen_s db MAX_SIZE
actlen_s db ?
short_str db MAX_SIZE dup (?)
counter db 0
Lcounter dw 0 ;添加两个变量
Scounter dw 0
ENTERkey db 0dh,0ah,'$'
.CODE
START:
mov ax,@data
mov ds,ax
mov es,ax ;[di+bp]寻址时用到!
lea dx,request1
mov ah,09h
int 21h
lea dx,maxlen_l
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
lea dx,request2
mov ah,09h
int 21h
lea dx,maxlen_s
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
;请求输入两个字符串
lea si,long_str
lea di,short_str
movzx bx,actlen_l
mov Lcounter,bx ;保存长串个数
xor bx,bx;初始化bx,在循环中用到
movzx bp,actlen_s ;同上
mov Scounter,bp
xor bp,bp
_Begin:
cmp bx,Lcounter;是否匹配到了长串的末尾
jnb _out
cmp bp,Scounter;是否匹配到了短串的末尾
jnb _out
mov al,[si+bx]
cmp al,es:[di+bp]
jne _next
inc bx;两个字符相等,则继续向前匹配
inc bp
jmp _Begin
_next:
sub bx,bp;两个字符不相等,则重新初始化,继续匹配
inc bx
xor bp,bp
jmp _Begin
_out:
cmp bp,Scounter ;相等则查询到了
jne _end
lea dx,result2
mov ah,09h
int 21h ;输出“成功”
jmp End_position
_end:;不相等则匹配不成功!
lea dx,result1
mov ah,09h
int 21h
End_position:
mov ax,4c00h
int 21h
END START
已经编译通过了,你自己看看?
.model small
.386
.STACK 256
.DATA
MAX_SIZE EQU 100
request1 db 'Please enter a long string:',0dh,0ah,'$'
request2 db 'Please enter a short string:',0dh,0ah,'$'
result1 db 'Short string NOT FOUND in long string',0dh,0ah,'$'
result2 db 'Found!',0dh,0ah,'Result:',0dh,0ah,'$'
maxlen_l db MAX_SIZE
actlen_l db ?
long_str db MAX_SIZE dup (?)
maxlen_s db MAX_SIZE
actlen_s db ?
short_str db MAX_SIZE dup (?)
counter db 0
Lcounter dw 0 ;添加两个变量
Scounter dw 0
ENTERkey db 0dh,0ah,'$'
.CODE
START:
mov ax,@data
mov ds,ax
mov es,ax ;[di+bp]寻址时用到!
lea dx,request1
mov ah,09h
int 21h
lea dx,maxlen_l
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
lea dx,request2
mov ah,09h
int 21h
lea dx,maxlen_s
mov ah,0ah
int 21h
lea dx,ENTERkey
mov ah,09h
int 21h
;请求输入两个字符串
lea si,long_str
lea di,short_str
movzx bx,actlen_l
mov Lcounter,bx ;保存长串个数
xor bx,bx;初始化bx,在循环中用到
movzx bp,actlen_s ;同上
mov Scounter,bp
xor bp,bp
_Begin:
cmp bx,Lcounter;是否匹配到了长串的末尾
jnb _out
cmp bp,Scounter;是否匹配到了短串的末尾
jnb _out
mov al,[si+bx]
cmp al,es:[di+bp]
jne _next
inc bx;两个字符相等,则继续向前匹配
inc bp
jmp _Begin
_next:
sub bx,bp;两个字符不相等,则重新初始化,继续匹配
inc bx
xor bp,bp
jmp _Begin
_out:
cmp bp,Scounter ;相等则查询到了
jne _end
lea dx,result2
mov ah,09h
int 21h ;输出“成功”
jmp End_position
_end:;不相等则匹配不成功!
lea dx,result1
mov ah,09h
int 21h
End_position:
mov ax,4c00h
int 21h
END START
展开全部
找老师吧,朋友,没人知道
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
movzx cx,actlen_l
movzx ax,actlen_s
---
mov cx, offset actlen_l
mov ax, offset actlen_s
movzx ax,actlen_s
---
mov cx, offset actlen_l
mov ax, offset actlen_s
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询