首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-06-19 
人名排序程序问题,请教各位大神这是温冬婵、沈美明老师写的IBM PC汇编语言程序设计中的一道例题,程序的目的

人名排序程序问题,请教各位大神
这是温冬婵、沈美明老师写的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,所以后面就转去进行排序了,不再对输入内容进行处理。第二个地方,看后面的代码不就知道其作用了,用空格将输入的名字填充到指定的长度,这样比较操作就会简单些。

热点排行