读书人

人名排序程序有关问题大神

发布时间: 2012-06-19 14:45:20 作者: rapoo

人名排序程序问题,请教各位大神
这是温冬婵、沈美明老师写的IBM PC汇编语言程序设计中的一道例题,程序的目的是实现对从键盘输入的30个人名按照其对应的ASCII进行升序排列,源码如下:
;NAME_SORT--EX6_11
;**************************************************
.model small
.stack 40h
;**************************************************
.data ;define data segment
namepar label byte ;name parameter list:
maxnlen db 21 ;max. length
namelen db ? ;no. chars entered
namefld db 21 dup(?) ;name
crlf db 13,10,'$'
endaddr dw ?
messg1 db 'Name?','$'
messg2 db 'Sorted names:',13,10,'$'
namectr db 0
nametab db 30 dup(20 dup(' ')) ;name table
namesav db 20 dup(?),13,10,'$'
swapped db 0
;**************************************************
.code ;define code segment
;--------------------------------------------------
begin proc far ;main part of program
;set DS and ES register to current data segment
mov ax,@data ;data segment addr
mov ds,ax ;into DS register
mov es,ax ;and ES register

;MAIN PART OF PROGRAM GOES HERE
cld
lea di,nametab
a20loop:
call b10read ;accept name
cmp namelen,0 ;any more names?
jz a30 ;no,go to sort
cmp namectr,30 ;30 names entered?
je a30 ;yes,go to sort
call d10stor ;store entered name in table
jmp a20loop ;end of input
a30:
cmp namectr,1 ;one or no name entered?
jbe a40 ;yes,exit
call g10sort ;sort stored names
call k10disp ;display sorted names
a40:
mov ax,4c00h ;terminate
int 21h

begin endp ;end of main part of program
;--------------------------------------------------
; Accept name as input:
b10read proc near

mov ah,09
lea dx,messg1 ;display prompt
int 21h

mov ah,0ah
lea dx,namepar ;accept name
int 21h

mov ah,09
lea dx,crlf ;return/linefeed
int 21h
;
mov bh,0 ;clear chars after name
mov bl,namelen ;get count of chars
mov cx,21
sub cx,bx ;calc remaining length
b20:
mov namefld[bx],20h ;set to blank
inc bx
loop b20
ret
b10read endp
;--------------------------------------------------
; Store name in table:
d10stor proc near
inc namectr ;add to number of name
cld
lea si,namefld


mov cx,10
rep movsw ;move name to table
ret
d10stor endp
; Sort names in table:
g10sort proc near
sub di,40 ;set up stop address
mov endaddr,di
g20:
mov swapped,0
lea si,nametab ;set up start of table
g30:
mov cx,20 ;length of campare
mov di,si
add di,20 ;next name for compare
mov ax,di
mov bx,si
repe cmpsb ;compare name to next
jbe g40 ;no exchange
call h10xchg ;exchange
g40:
mov si,ax
cmp si,endaddr ;end of table
jbe g30 ;no,continue
cmp swapped,0 ;any swaps?
jnz g20 ;yes,continue
ret ;no,end of start
g10sort endp
;--------------------------------------------------
; Exchange table entries:
h10xchg proc near
mov cx,10
lea di,namesav
mov si,bx
rep movsb ;mov lower item to save
;
mov cx,10
mov di,bx
rep movsw ;mov higher item to lower
;
mov cx,10
lea si,namesav
rep movsw ;mov higher to higher item
mov swapped,1 ;signal that exchange made
ret
h10xchg endp
;--------------------------------------------------
; Display sorted names:
k10disp proc near

mov ah,9 ;display prompt
lea dx,messg2
int 21h

lea si,nametab
k20: lea di,namesav ;initialize start of table
mov cx,10
rep movsw
mov ah,9
lea dx,namesav
int 21h ;display
dec namectr ;is this last one?
jnz k20 ;no,loop
ret ;yes,exit
k10disp endp
;--------------------------------------------------
;**************************************************
end begin
我的问题是源码中的变色部分的namelen的作用是否是判断人名输入是否结束?如果是,程序中涉及对namelen的仅有子程序b10read中的mov bl,namelen和主程序中的cmp namelen,0(见变色部分),请问namelen的这一功能是如何实现的?namelen的作用不是判断人名输入是否结束,请问它的功能是什么,又是如何实现的?恳请各位大神赐教,谢谢!


[解决办法]
不看代码前后的内容?第一个地方,是判定是否输入了人名,即提示输入名字时,直接按回车的话,返回的结果就是该项为 0,所以后面就转去进行排序了,不再对输入内容进行处理。第二个地方,看后面的代码不就知道其作用了,用空格将输入的名字填充到指定的长度,这样比较操作就会简单些。

读书人网 >汇编语言

热点推荐