回 帖 发 新 帖 刷新版面

主题:一汇编题,请好心人帮忙

编写一个查找匹配字符串程序。
   要求:从键盘输入一个句子和一个关键字,在句子中查找该关键字,给出关键字在句子中的位置。
注:关键字应该是一个单词,位置也是“第×个单词”这样描述。涉及有若干个合适匹配的问题。算法基本上会,只是对汇编不够熟悉,而且时间紧迫,请好心人帮忙

回复列表 (共5个回复)

沙发

板凳


输入的句子中间不能有标点,单词之间用单个空格,句子结尾是标点。




data    segment
mess1    db    0dh,0ah,'please type in a sentence',0dh,0ah,'$'
mess2    db    0dh,0ah,'please type in the word ',0dh,0ah,'$'
mess3    db    0dh,0ah,'the word appares at     ',0dh,0ah,'$'

sntc    label    byte
max3    db    30
act    db    ?
max    db    30 dup(' ')

word1    label    byte    
max2    db    15
act1    db    ?
max1    db    15 dup(' ')


buffer    db    15 dup(' ')
posit    dw    0    
ten    db    10
counter    db    0
col    db    0
row    db    0
data    ends
;-------------------------------------------------------------------    
code     segment
    assume    cs:code,ds:data,es:data
main    proc    far

start:    
    mov    ax,data
    mov    ds,ax
    mov    es,ax

    lea    dx,mess1
    call    print
    lea    dx,sntc
    call    input
    lea    dx,mess2
    call    print
    lea    dx,word1
    call    input
    call    compare
    
    mov    ax,4c00h
    int    21h
main    endp

;-------------------------------------------------------------
;print the message

print    proc    near
    mov    ah,09h
    int    21h
    ret
print    endp
;-------------------------------------------------------------    
;input a sentence and a word1

input    proc    near
    mov    ah,0ah
    int    21h
    ret
input    endp
;-------------------------------------------------------------

compare    proc    near
    
    lea    si,act
    
    
trans1:    mov    counter,0     ;计数器
    inc    si        ;消除空格的影响
            
    
    cmp    act,0        ;程序的出口
    jz    exit
    lea    di,buffer
    dec    act        ;消除空格和最后标点的影响
trans:
    
    cld            
    
;moves a word1 to buffer
        
    movsb            ;把一个单词中的字符一个个的传给buffer
    inc    counter
    dec    act
    cmp    act,0
    je    finish
    cmp    byte ptr [si],' '    ;判断一个单词是否传输完毕
    jne    trans
        
finish:    
    inc    posit        ;比较buffer中的和想查找的单词
    
    mov    ch,0
    mov    cl,act1        ;首先判断二者字符个数是否相等
    cmp    cl,counter
    je    goon
    jmp    trans1        ;不相等就去传输下一个单词给buffer
    
goon:    push    si        ;相等就比较
    lea    si,buffer
    lea    di,max1
    repe    cmpsb
    pop    si
    jnz    trans1        ;不相同就传输下一个单词
    
    lea    dx,mess3    ;相同就输出
    call     print
    
    mov    ax,posit
    cmp    ax,10
        
    div    ten
    
    mov    cx,ax
    add    cx,3030h
    mov    dl,cl        ;可能是大于10的数
    mov    ah,2
    int    21h
    
    mov    dl,ch
    mov    ah,2
    int    21h
    jmp    trans1
exit:
    ret
compare    endp
;--------------------------------------------

;----------------------------------------------
code    ends
    end    start    
        





3 楼

谢谢谢谢谢谢,真好人阿!

4 楼

别客气,这个程序还可以做许多改进,
兄弟啊,要不你给我的帖子评个分,我好..........啊[em1]

5 楼

呵呵,已经评了,再次感谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册