汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-08 11:09] 习题4.23

写一个产需实现如下功能:先从键盘输入一个较长的字符串和一个较短的字符串。然后判断较短的字符串是否是较长的字符串的字串。最后显示提示说明判断结果。

答:
;----------------------------------------------------;
assume        cs:code,ds:data
data        segment
input1        db        "Input long string:$"     ;提示信息
input2        db        "Input short string:$"    ;
str1        db        20 dup (0)                ;预留长串空间
str2        db        10 dup (0)                ;预留短串空间
buff        db        (lengthof str2+1) dup (0) ;缓冲区暂存
msg1        db        'Found!$'                 ;提示信息
msg2        db        'No found!$'              ;
data        ends
code        segment
start:
        mov ax,data
        mov ds,ax
;显示第一条信息
        mov dx,offset input1
        mov ah,9
        int 21h
;输入长串
        mov di,offset str1
        call input        
;回车
        call crlf
;显示第二条信息
        mov dx,offset input2
        mov ah,9
        int 21h
;输入短串
        mov di,offset str2
        call input
;回车
        call crlf
;计算循环次数
        mov cl,str1          ;长串长度
        mov ch,str2          ;短传长度
        sub cl,ch            ;相减加1得到循环次数
        and cx,0fh           ;
        inc cx                     ;
        mov bx,offset str1+1 ;长串首地址 
s:        push cx              ;保存主循环计数器
        mov si,bx            ;内循环首地址
        mov di,offset buff   ;将字符放入buff暂存
        mov cl,str2          ;内循环次数
s1:        mov al,[si]          ;开始传送字符
        mov [di],al
        inc si
        inc di
        loop s1
;开始等长字符串比较
        push si             ;保存地址指针
        push di             ;
        mov si,offset buff  ;设新的源、目的地址指针
        mov di,offset str2+1;
        mov cx,lengthof buff;循环次数
        call comp           ;调用comp子程序
        jc xd               ;有进位则表示相等
        pop di              ;恢复原地址指针
        pop si              ;

        inc bx              ;指向长串下一个字符
        pop cx              ;恢复主循环计数器
        loop s
;显示NoFound信息
        mov dx,offset msg2
        mov ah,9
        int 21h
        jmp done
;显示Found信息
xd:        mov dx,offset msg1
        mov ah,9
        int 21h
;程序结束
done:        mov ah,4ch
        int 21h
;子程序:input
;功能:向存储单元输入字符
;入口参数:DS:DI
;出口参数:DS:DI
;说明:DS:DI首地址存放字符串长度
input        proc
        mov cx,0
_in:        mov ah,1
        int 21h
        cmp al,0dh
        jz ok
        mov [di+1],al
        inc di
        inc cx
        jmp _in
ok:        sub di,cx
        mov [di],cl
        ret
input        endp

;子程序:换行

crlf        proc
        mov dl,0dh
        mov ah,2
        int 21h
        mov dl,0ah
        mov ah,2
        int 21h
        ret
crlf        endp

;子程序:comp
;功能:比较两个等长字符串是否相等
;入口参数:DS:SI=源串首地址;DS:DI=目的串首地址
;出口参数:如果两串相等,置进位标志。

comp        proc
        clc
_cmp:        mov al,[si]
        cmp al,[di]
        jnz ol
        inc si
        inc di
        loop _cmp
        stc
        ret
ol:        ret
comp        endp
;
code        ends
end        start

;----------------------------------------------------;
这个程序费了两天的时间, 没有做输入容错处理。 下面的题越来越难!解决问题的方法不是问题, 用代码实现起来, 还是有困难, 唉 ,还得努力呀!!!
评论次数(0)  |  浏览次数(707)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码