目的:
从键盘上输入一行字符,如果这行字符比前一次输入的一行字符长度长,则保存该行字符,然后继续输入另一行字符;如果它比前一次输入的行短,则不保存这行字符。按下‘$’输入结束,最后将最长的一行字符显示出来。
设计思路:
设计子函数compare用于每次输入后缓冲区与存储器字符串作比较。若缓冲区字符串长度不大于存储区中字符串长度,则提前退出函数,若是大于,则利用cld、rep movsb语句,利用es:di与ds:si进行字符转移。
程序代码:
assume cs:code,ds:data,es:data ;es、ds同时和data绑定用于数据传送
data segment
string db 0 ;存放字符的个数
db 80 dup(?),0dh,0ah,'$' ;存放前一次输入的字符串,兼作显示缓冲区
buffer db 80 ;输入字符串的缓冲区,最多输入80个字符
db ?
db 80 dup(?)
data ends
code segment
main proc far:
start:
mov ax,data
mov ds,ax
mov es,ax
loopc:
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
int 21h
lea dx,buffer
mov ah,0ah
int 21h
mov al,buffer[2]
cmp al,'$'
jz print
call compare
jmp loopc
print:
lea dx,string[1]
mov ah,09h
int 21h
mov ax,4c00h
int 21h
main endp
compare proc near:
mov al,buffer[1]
cmp al,string
jbe exit ;缓冲区字符串长度不大于string的长度,则跳过
mov string,al
lea si,buffer[2] ;字符传递
lea di,string[1]
mov cl,buffer[1] ;此处用cx做循环计数由于类型不匹配,会出错
sub ch,ch
cld ;si,di递增
rep movsb ;字节传送
exit:
ret
compare endp
code ends
end start