一个比较字符串的汇编程序 大家看看哪里出错啦 全力加分!

代码如下:.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
搜索匹配字符串,我的思路是先让短字符串的首部对准长字符串的首部,然后以短字符串长度为循环次数比较,若成功,则找到,若未找到匹配的,则将短字符串的首部对准长字符串的第二个字符,以此类推。
展开
 我来答
木想高16
2009-02-13 · TA获得超过3602个赞
知道小有建树答主
回答量:1222
采纳率:0%
帮助的人:1217万
展开全部
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
文轩诗梦dx
2009-02-10 · TA获得超过1551个赞
知道小有建树答主
回答量:262
采纳率:0%
帮助的人:247万
展开全部
找老师吧,朋友,没人知道
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天气雷达
2009-02-11 · TA获得超过289个赞
知道小有建树答主
回答量:154
采纳率:0%
帮助的人:220万
展开全部
movzx cx,actlen_l
movzx ax,actlen_s
---
mov cx, offset actlen_l
mov ax, offset actlen_s
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式