修改程序,汇编语言。键盘输入一个包含若干个 ‘*’ 的字符串 ; 5个子程序,显示菜单,显示1-4操作,分别为,将字符串前,中,后的*,所有的*去掉,输入5程序退出


DATAS SEGMENT
    string db 100, ? , 100 dup(?)
    string2 db 100, ? , 100 dup(?)
    temp db 0ah, 0dh, '$'
    info db 'input : $'
    info0 db 'select: $'
    m0 db 'please select an operation: ', 0ah, 0dh, '$'
    m1 db '1. remove previous *', 0ah, 0dh, '$'
    m2 db '2. remove mid *', 0ah, 0dh, '$'
    m3 db '3. remove hinder *', 0ah, 0dh, '$'
    m4 db '4. remove all *', 0ah, 0dh, '$'
    m5 db '5. exit', 0ah, 0dh, '$'
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
    MOV AX, DATAS
    MOV DS, AX
    ; 键盘输入一个包含若干个 ‘*’ 的字符串
    ; 5个子程序,显示菜单,显示1-4操作,分别为,将字符串前,中,后的*,所有的*去掉,输入5程序退出
    ; 菜单
    call meau
    ; 输入字符串
    call pin
lop:
    lea dx, info0
    mov ah, 09h
    int 21H

    ; 输入操作
    mov ah, 01h
    int 21H

    ; 换行
    lea dx, temp
    mov ah, 09h
    int 21H

    cmp al, 31h
    je l1
    cmp al, 32h
    je l2
    cmp al, 33h
    je l3
    cmp al, 34h
    je l4
    cmp al, 35h
    je ex0

l1:
    call func1
    jmp lop

l2:
    call func2
    jmp lop

l3:
    call func3
    jmp lop

l4:
    call func4
jmp lop

ex0:
    call func_and
    ; 输出字符串
    call pout
    jmp exit

; 将去掉*后的字符串合并
func_and proc
    ; si 为 string 第一个字符的偏移地址
    mov al, 2
    mov ah, 0
    mov si, ax

    ; di 为 string2 第一个字符位置的偏移地址
    mov al, 2
    mov ah, 0
    mov di, ax

    mov cl, string + 1
    mov ch, 0

lopp:
    cmp string[si], 0
    je exx
    mov al, string[si]
    mov string2[di], al
    inc di
exx:
    inc si
loop lopp

    mov string2[di], '$'

ret
func_and endp

; 功能1,去掉前面的*
func1 proc
    mov al, 2
    mov AH, 0
    mov si, ax
lop1:
    cmp string[si], '*'
    jne ex1
    mov string[si], 0
    inc si
jmp lop1
ex1:
ret
func1 endp

; 功能2,去掉中间的*
func2 proc
    mov al, 2
    mov ah, 0
    mov si, ax
    ; 找第一个非*的位置
lop2:
    cmp string[si], '*'
    jne ex2
    inc si
jmp lop2
ex2:

    ; 找最后一个非*的位置
    mov al, string + 1
    add al, 1
    mov ah, 0
    mov di, ax
lop22:
    cmp string[di], '*'
    jne ex22
    dec di
jmp lop22
ex22:
    mov cx, di
    sub cx, si
lop222:
    cmp string[si], '*'
    jne e0
    mov string[si], 0
e0:
    inc si
loop lop222
ret
func2 endp

; 功能3,去掉后面的*
func3 proc
    mov al, string + 1
    add al, 1
    mov AH, 0
    mov si, ax
lop3:
    cmp string[si], '*'
    jne ex3
    mov string[si], 0
    dec si
jmp lop3
ex3:
ret
func3 endp

; 功能4,去掉全部的*
func4 proc
    call func1
    call func2
    call func3
ret
func4 endp

; 菜单
meau proc
    lea dx, m0
    mov ah, 09h
    int 21H

    lea dx, m1
    mov ah, 09h
    int 21H

    lea dx, m2
    mov ah, 09h
    int 21H

    lea dx, m3
    mov ah, 09h
    int 21H

    lea dx, m4
    mov ah, 09h
    int 21H

    lea dx, m5
    mov ah, 09h
    int 21H
ret
meau endp

; 字符串输出
pout proc
    lea dx, string2 + 2
    mov ah, 09h
    int 21h
    ret
pout endp

; 字符串输入
pin proc
    lea dx, info
    mov ah, 09h
    int 21h

    lea DX, string
    mov ah, 0ah
    int 21h

    lea dx, temp
    mov ah, 09h
    int 21h

    mov al, string + 1
    add al, 2
    mov ah, 0
    mov si, ax
    mov string[si], '$'

    ret
pin endp

exit:
    mov AH, 4CH
    INT 21H

CODES ENDS
    END START

怎样才能让程序运行时,在菜单上选择1-4,然后回车直接输出结果,输入5时,退出程序呀?谢谢大家!