人名排序问题
;例 6.11 人名排序的程序实现
;***********************************************************
.MODELSMALL
.STACK40H
;***********************************************************
.DATA;定义DATA数据段
NAMEPARLABELBYTE
MAXLENDB21
NAMELENDB?;名字长度,未设初值
NAMEFLDDB21 DUP(?);定义NAMEFLD为21字节长,未设置初值
CRLFDB13,10,'$'
ENDADDRDW?;定义ENDADDR类型为字,初值未设定
MESSG1DB'Name?','$';定义MESSG1为字符串Name?
MESSG2DB'Sorted name:',13,10,'$';定义MESSG2为字符串Sorted name:
NAMECTRDB0;名字计数器,初始设为0
NAMETABDB30 DUP(20 DUP(' '));长度30,每个可存储20字节的字符串
NAMESAVDB20 DUP(?),13,10,'$';这个变量用来暂存名字
SWAPPEDDB0
;***********************************************************
.CODE;定义代码段
;------------------------
BEGINPROCFAR;主程序开始
MOVAX,@DATA;将DATA地址传给AX
MOVDS,AX;将AX值传给DS和ES
MOVES,AX
CLD;DF设为0
LEADI,NAMETAB;将NAMETAB的有效地址传给DI
A20LOOP:
CALLB10READ;调用B10READ子程序,用来接收输入的人名
CMPNAMELEN,0;两数比较
JZA30;等于0时,转到A30
CMPNAMECTR,30;再将NAMECTR和30进行比较
JEA30;若等于30则转移到A30
CALLD10STOR;调用子程序D10STOR,存储名字到NAMETAB中
JMPA20LOOP; 转移到A20LOOP循环,读入名字,直到不输入或计数器到了30为止
A30:
CMPNAMECTR,1;比较
JBEA40;小于或者等于1,转移到A40
CALLG10SORT;调用G10SORT,人名排序
CALLK10DISP;调用K10DISP,显示人名
A40:MOVAX,4C00H;将值4C00赋值给AX
INT21H
BEGINENDP;主程序结束
;------------------------------------------------
B10READPROCNEAR;子程序B10READ
MOVAH,09
LEADX,MESSG1;将MESSG1的有效地址传送给DX
INT21H;显示MESSG1:Name?
MOVAH,0AH
LEADX,NAMEPAR;将NAMEPAR的有效地址传送给DX
INT21H
MOVAH,09
LEADX,CRLF;将CRLF的有效地址传送给DX
INT21H;显示CRLF中的内容(换行)
MOVBH,0
MOVBL,NAMELEN;将NAMELET传送给BL
MOVCX,21;21(16进制里的15)
SUBCX,BX;CX-BX并将值返回给CX
B20:MOVNAMEFLD[BX],20H
INCBX;BX加1??
LOOPB20;循环执行B20
RET;子程序返回
B10READENDP;退出
;------------------------------------------------
D10STORPROCNEAR;子程序D10STOR
INCNAMECTR;计数器加1
CLD;方向标志DF设置为0
LEASI,NAMEFLD;将NAMEFLD的有效地址传送给源地址寄存器SI
MOVCX,10
REPMOVSW;重复执行字传送10次串操作MOVSW
RET;子程序返回
D10STORENDP;退出
;------------------------------------------------
G10SORTPROCNEAR;子程序G10SORT:冒泡排序的实现
SUBDI,40;DI减40(16进制里的28)
MOVENDADDR,DI
G20:MOVSWAPPED,0
LEASI,NAMETAB;将NAMETAB的有效地址传送给SI
G30:MOVCX,20
MOVDI,SI
ADDDI,20;DI加20(即16进制的14)
MOVAX,DI
MOVBX,SI
REPECMPSB
JBEG40;如果CF或ZF等于1则转移到G40??
CALLH10XCHG;调用子程序H10XCHG(交换名字)
G40:MOVSI,AX
CMPSI,ENDADDR;比较SI和ENDADDR
JBEG30;小于或等于时,转移到G30
CMPSWAPPED,0;比较SWAPPED和0
JNZG20;若不等于转移到G20
RET;子程序返回
G10SORTENDP;退出
;------------------------------------------------
H10XCHGPROCNEAR;子程序H10XCHG(交换两个名字)
MOVCX,10;10(即A传给CX)
LEADI,NAMESAV
MOVSI,BX
REPMOVSW;重复执行串操作直到CX=0
MOVCX,10
MOVDI,BX
REPMOVSW;重复执行10次串操作MOVSW
MOVCX,10
LEASI,NAMESAV;将NAMESAV的有效地址传送给SI
REPMOVSW;重复执行10次串操作MOVSW
MOVSWAPPED,1;1传给SWPPED
RET;子程序返回
H10XCHGENDP;退出
;------------------------------------------------
K10DISPPROCNEAR;子程序K10DISP(显示排序后的名字)
MOVAH,09
LEADX,MESSG2;将MESSG2的有效地址传送给DX
INT21H ;显示MESSG2:即字符串:'Sorted name:'
LEASI,NAMETAB;将NAMETAB的有效地址传送给SI
K20:LEADI,NAMESAV;将NAMESAV的有效地址传送给DI
MOVCX,10
REPMOVSW;重复执行10次串操作MOVSW
MOVAH,9
LEADX,NAMESAV;将NAMESAV的有效地址传送给DX
INT21H ;显示NAMESAV名字数据
DECNAMECTR;计数器--
JNZK20;NAMECTR不等于0,仍转至K20
RET;子程序返回
K10DISPENDP;退出
;------------------------------------------------
;************************************************
ENDBEGIN;程序结束
请问,在第一个子程序中 的namelen的值是怎么得到的?[color=#FF0000][/color][color=#FF0000][/color]
[解决办法]
namelen 相当于一个全局变量
那里都可以用
[解决办法]
[解决办法]
[解决办法]
[解决办法]
看不太懂