汇编中判断字符串2是否是字符串1的子串

太阳是我搓圆的 2012-12-07 04:19:24
小弟刚学汇编,入门中。课题要求如题,判断字符串2是否是字符串1的字串。小弟的源码如下,但是始终输出的是no,改动了很多都还是有问题。求大神鉴定!并给出详细解释!谢谢






.model small
.stack
.data
sbuffer db 'How are you?$'
dbuffer db 'are$'
yes1 db 'yes$'
no1 db 'no$'
.code
.startup
mov si,offset sbuffer
mov di,offset dbuffer
cld
mov cx,10 ;比较10次
again: push cx
mov cx,3 ;字符串长度
push si ;si入栈
repz cmpsb ;开始比较
cmp cx,0 ;假如cx等于0,跳转到yes
jz yes
pop si ;si出栈
inc si ;指向下一个字符
mov di,offset dbuffer ;di初始化为第一个字符
pop cx ;cx出栈并且减1
dec cx
loop again ;循环
call no ;跳转到no

yes: mov dx,offset yes1
mov ah,9
int 21h
mov ah,4ch
int 21h

no: mov dx,offset no1
mov ah,9
int 21h
mov ah,4ch
int 21h

end
...全文
590 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigniyan 2012-12-17
  • 打赏
  • 举报
回复
pop cx ;cx出栈并且减1 dec cx //这里-1 这句不要 loop again ;循环 //loop 也会-1 如果加上dec cx的话 pop cx dec cx test cx,cx jnz again 下面就不用加loop again了
纯中文 2012-12-15
  • 打赏
  • 举报
回复
pop cx ;cx出栈并且减1 dec cx loop again ;循环   中间的 dec cx 应该去掉。即使不去掉,由于最后一次循环时 esi 正好指向 'are',repz cmpsb 是成功的。
子善旬 2012-12-08
  • 打赏
  • 举报
回复
[code=assembly] lea dx,str1 str_compare: cmp [dx],0 jz str_isnot_equ mov si,dx lea di,str2 cld repz cmpsb jz str_is_equ inc dx jmp str_compare str_is_not_equ: ...... str_is_equ: .... [/code]
  • 打赏
  • 举报
回复

比较字符串STR1和字符串STR2是否相同,如果不同,将STR1中不相等字符的地址送BX。两个字符串的长度均为200个字节。
        程序如下:(假定DS和ES已设置好)
        LEA  SI,STR1    ;SI←源串首地址
        LEA  DI,STR2    ;DI←目的串首地址
        MOV  CX,200     ;CX←串长度
        CLD              ;DF←0,增地址方向
        REPZ CMPSB       ;对两个串逐个字符进行比较,直到遇到不同的字符或比较完
        JZ   STOP        ;若所有字符都相同,则转STOP
        DEC  SI          ;否则,使SI指向不相等的字符(CMPS指令已对SI自动加1)
        MOV  BX,SI      ;BX←不相等单元的地址
  STOP:...

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧