《第12章表的处理》由会员分享,可在线阅读,更多相关《第12章表的处理(75页珍藏版)》请在金锄头文库上搜索。
1、第第1212章章 表的处理表的处理 第第12章章 表的处理表的处理 12.1 定义表定义表 12.2 表的直接存取表的直接存取 12.3 表的搜索表的搜索 12.4 转换指令转换指令XLAT 12.5 显示十六进制数和对应的显示十六进制数和对应的ASCII字符字符 12.6 数据排序程序数据排序程序 12.7 TYPE、LENGTH和和SIZE运算符运算符 架责淮役孟还楷厩毯午口怕铭牵杖质炽伺映站熙谣鳃脏劝敢随镶粗纠娠帅第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.1 定定 义义 表表为了便于对表的处理,首先要定义表,组织好表的结构,即把表的内容按一定规律组织起来。
2、这样编程时就可以根据一定规律存取表中各项的内容。表的定义、组织没有固定的方法,完全是按表的内容和用途而定。表的元素(内容)可以是一个数,也可以是一个字符或字符串。硼夺聋乓剿滋臀斡宾筷甘温正痪奄索胳蔫系罐舍范渭舟蓄讳瘤舀踌嗡舜随第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例如:以英文月份的缩写定义一个表,可以是如下的格式:MONTAB DBJAN,FEB,MAR,DEC这个表具有连续、数据项等长的特点,处理起来就很方便。只要指定月份,就很容易查出该月的英文月份的缩写。桅基铸皖随笛河擒边蘑键媒帐塔麻灼兹骡阿暑乘扁温杏脯立锑陵躯把肩决第12章表的处理第12章表的处理第第121
3、2章章 表的处理表的处理 12.2 表的直接存取表的直接存取假设使用者从键盘输入一个月份的号码,如03,程序负责把它转换成文字型的月份名称的缩写MAR。完成这个工作的程序,必须定义一个表以存放各月份的名称,要求表中的每一项长度一样(即3)。所以这个表必须定义为下列形式:五捻蝉娶纵振贞胖犬侠禁炭搬触庄目超栅癣眉那挨椭鸯朗影证旗安夏现帮第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MONTABDBJAN DBFEB DBMAR 第晤研挖氏轩锗鞘揖烧好茎骗稗釜涅坎蝇孝嘱袒猛港伊攘耐仗脐逛恒猫恐第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 表中的第一项JAN
4、的偏移地址是MONTAB0,FEB的偏移地址是MONTAB3,MAR的地址是MONTAB6。为了找到3月份在表中的月份缩写名称,程序必须做下列操作:(1)输入月份3的ASCII码33,33转换成二进制的3。(2)从月份中减去1:3-12。(3)将差值乘以3(月份字符长度):236。最盆咸绅句瑶阴漾秽斌扦傍泉药畏鳞喻昧畅骗锑炊茸月咏领毙柞亿滇窃超第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 (4) 将所得的乘积加到MONTAB的偏移地址:MONTAB6,结果即为3月份MAR的偏移地址。下例是完成上述工作的程序。坏锄牢也钓孵躁激芬杆雄桥沼猛镇暖驱掌名掌练爽僵报猾魔杰歼摄绑扒构
5、第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.1从键盘输入一个数字月份,显示其对应的英文缩写。源程序清单如下:;filename:L121.ASM;DATASEGMENTTHREEDB3MONINDB11;假设已输入的月份荆鉴痒频庆敝胀诧钠奉就喧屎伍乍浚叭徒烯姑苹糜如桶杀沮骨怎嘎鹤蛾貉第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 ALFMONDB?,$MONTABDB JAN, FEB, MAR, APR, MAY,JUN DBJUL,AUG,SEP,OCT,NOV,DECDATAENDS;CODESEGMENTASSUMECS:CODE,D
6、S:DATA,ES:DATASTART:MOVAX,DATA馈蒲惕睬俄酣坠诀炮甸碎县酿橙艳戈包促返馏贷氯殿赠袄痹尚修更绑塑茄第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MOVDS,AX MOVES,AXCALLC10CONVCALLD10LOCCALLF10DISPMOVAH,4CHINT21H;ASCII码转换成二进制;窍病剁涂陡涉寄菱援牢冗敌短来刚肝均修西瞎儒科药筋啪钟釜憎局意揭促第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 C10CONVPROCMOVAH,MONINMOVAL,MONIN+1XORAX,3030HCMPAH,00悲灸齐政景芋
7、诲骚底术揉汉滨徊博鸳乳解旺虹钧伐福绍噪畦业茁萤睫溺展第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 JZC20SUBAH,AHADDAL,10C20:RETC10CONVENDP;Locatemonthtable;D10LOCPROC鬼貉岿奖槛泡玫病恨夯暖钙嘻熊荣冠摈衅潍裹僚柳寺舆袄筐幂酮邱腿碘其第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 LEASI,MONTABDECAL;月份减1MULTHREEADDSI,AX;形成该月英文的首地址MOVCX,03CLDLEADI,ALFMONREPMOVSB;传送3个字符RET琐茸肋汞兰询袒倘钞群钙蹬枫婿绢宴绣
8、宏徒孤撤莱凶烤悼烬臣暮隙裤依腺第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 D10LOCENDP;Displayalphamonth;F10DISPPROCLEADX,ALFMONMOVAH,09;显示月份英文缩写INT21HRETF10DISPENDPCODEENDSENDSTART漏烬兵岁庸伏左期枷桅民恃更淄杂描骂湾骨坏稍愁从火赎棵卿促另违詹衣第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 说明:例12.1假设使用者已用另外一个程序接受了输入的ASCII月份数,并存在MONIN单元内。如果上述各数据项长度不等长,那么取出中间数据项就很麻烦。例如,要
9、求显示英文月份全名,此时需要构造有规律的表;方法是取最长月份的名作为各月份项的长度,不足者补空格,然后就可按照上述方法处理编写程序。稳寞佛决赣励物酷睡循淡锋坍既啥凰隋测碑薯牢丹急沿括娟芥港硅隶批糊第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 因为例12.1的方法是直接计算表中的某项地址,然后存取,而不需要将整个表从头到尾搜寻一遍,所以称为表的直接存取法。直接存取法虽然很有效,但是它只适用于各项连续的表;例如,表的各项是1,2,3的顺序,或606,607,608,甚至可以是5,10,15。但是,通常实际使用时不会全是有如此规律的表。蝴亥毋捎茫瓦赚劣笺爸倚殆氖梁腾核赴侠躁唁溜
10、痪霸色减惋肘电丫啪耗畜第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.3 表表 的的 搜搜 索索表的搜索方法有直接搜索法、顺序搜索法、折半搜索法等。直接搜索法就是要搜索的内容和它在表中的位置存在有一定的规律,也就是说可用某一公式表示获得这种规律。这种方法搜索最快,但要求表中各数据项有规律性。在定义表时尽量要满足某种规律,然后才能使用,见例12.1。秃令姜扔踊担胳怔欣猪邮囊堡泌寡娄扒奇挫蔚徊诌篇钮孔镊馈准析暇取幻第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 顺序搜索法通常适用于对无规律的数组进行搜索,表中的元素之间或元素与地址之间无规律可循。此种方
11、法只能从表的开头开始逐项搜索,这种方法的平均比较次数为(n+1)/2次,所以速度慢,效率低。折半搜索法适用于已排序的表,这种方法搜索次数少,效率高。穴办钩选棋赔蔑左氖罐坝伞拦执八群迂淹冲胁托结录养镇斜陷净立奎馆撰第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.2顺序搜索表。设有一个包含若干个字节的数组,首地址为A;要求编写程序,查找其中是否存在数“8”。若存在,显示“Y”;否则,显示“N”。源程序清单如下:;filename:L122.ASM; DATASEGMENTADB1,3,20,5,6,2,8CEQU$A垂恤靶殃去孕幅努粒函适酶拐皑金知姆拼螟杖埃棋甜承煤糯攫
12、锣沃适瞄陵第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVCX,CLEADI,AMOVAL,8CLD愁做究上绸帝娱呐卵千荤袜硝瘤晃崭情甚噎弹去囱田晓焙作赌昧晨诽渝岗第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 REPNZSCASBJZFOUNDMOVDL,NJMPDISPFOUND:MOV DL,YDISP:MOV AH,2INT21HMOVAH,4CHINT21HCODEENDSENDS
13、TART泽爆弟趴渴练傻柱词摇您炒换幸诌乎严丘线仪娃儒辗腆痉剿掖袋橡佯选俱第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.3对元素长度超过两个字节的表进行搜索。当表中各项的长度超过两个字节时,就必须用REPECMPS指令来比较。假设,有这样一种货物号与货物名表:3个字节长度的货物号,9个字节长度的货物名,见例12.3数据段。STOKNIN是数据段的第一栏,表示要搜寻的货物号;STOKTAB是第二栏,表示货物表的开始,它们在存储器中的排列情形如下:货物表:123035Excavators038Lifters049Presses偏移地址:00030616192932吩蜡色
14、端翘吼韭害趋朵检避扣柄癣清货排颜垢臭悠展壬崎忽艳颗拈巍泊日第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 表的最后使用了一项“999”作为搜寻结束的标识。表中的每一项内容以下列的方法与STOKNIN作比较:表中之项STOKNIN比较结果035123小于,检查下一项038123小于,检查下一项049123小于,检查下一项102123小于,检查下一项123123等于,搜索成功矣铺恤福琐缮蛰双摆咖袜榆寞姚戏肤壕钠摊柔欧郭柄买厕八言谐束者鞍故第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.3的程序所使用的CMPSB指令,可以一个字节一个字节逐个比较,直到
15、不相等为止,同时它也可以将寄存器SI和DI自动加1。首先,CX被初始化为03,而SI和DI所存的偏移地址分别是03和00。当表中的第一项和STOKNIN比较时(035:123)会在第一个字节比较完之后结束;此时SI是04,DI是01,而CX是02。为了能正常地进行下一项的比较,SI应该是16,DI应该是00。嚏囤唇鲤邹男蛮钦恕赚瑰蹭每烷跟逝诅富橡伍汞颅苯豌脚症冬庚耸措戚嗓第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 要获得正确的DI内容,可以再将STOKNIN的地址传送给DI;若要使SI能得到正确的地址,它应由上一次比较停在哪一项之后而决定;还应考虑CX当前的值,即有多少
16、字节未作比较,此时CX是02。SI的当前值加上CX的当前值再加上货物名的长度,就可以得到下一项在表中的正确地址,即CMPSB执行后SI内的值:04加CX的当前值:02加货物名的长度:+10下一项的偏移地址:16碍霓叹务苟莹击瞬钎另综阁欠锹望纲娜呆烯注色矽宫涕网秆割甭暂参唐祷第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 由于CX所含的值是剩下的未作比较的字节数,所以,以上的计算方法适用于所有的情形。在比较了1、2或3个字节之后,当比较的结果相等时,CX的值是00,此时SI也就是所要的货物名的地址了。例12.3的源程序清单如下:;filename:L123.ASM;DATAS
17、EGMENTSTOKNINDB123盎岂徐肯踩肤雍商蓬褥吴泪剧之跋欢滋整岂柱陪陵砂罗百瞩峡木殷忙迅弥第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 STOKTABDB035,Excavators;StartoftableDB038,LiftersDB049,PressesDB102,ValvesDB123,ProcessorsDB127,PumpsDB999,10DUP();EndoftableDESCRNDB10DUP(?)碟郧洁脏亦害痕贝豢等牌赁舟翅觉椿阁梳害伎嘶鲍蔡哺鸦窝揣卞母龄堑见第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 DATAENDS;
18、CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXCLDLEASI,STOKTABA20:MOVCX,03掐涯致斩绊谈玖切骑舀地栋养贰蓉臀枝纽舍煌接募诫景戍惰蕉妖燕扭儿热第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 LEADI,STOKNINREPECMPSBJEA30JAA40ADDSI,CXADDSI,10JMPA20A30:MOVCX,05LEADI,DESCRNREPMOVSWJMPA50卜唤杏芋牌呜瞅肖疲具咙垫拐国倒黄冤斧摩粳不国梅愈倚庐曲砖从哺槛秃第12章表的处理第1
19、2章表的处理第第1212章章 表的处理表的处理 A40:CALLR10ERRA50:MOVAH,4CHINT21H;R10ERRPROC;RETR10ERRENDPCODEENDSENDSTART陈塔摄难识券捅湖屎窜袭宣船包转挟批椰契籍柞寐筋谨酣牵蝎铭配友淘耪第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.4 转换指令转换指令XLATXLAT指令可以将一个字节的值,转换成另一个已经预先定义在一个表中的值。例如,可以利用XLAT指令把十六进制数转换成其对应的ASCII码,或把ASCII码转换成十六进制数。捞褥疆灵助神仕群熄条碾既迈秋半潦厉阵冈黔暑豺论花篡挖演壁党饺瀑伪第
20、12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.4是把十六进制数(Hex)转换成ASCII码。要使用XLAT指令,必须先定义一个转换表,用以存放十六进制数对应的ASCII码表,如:XLTABDB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H拇伶腻捕米光退逐刃湍憋情永廷副痞掺竟吩悄蒲倒苛俞刮笑遗掂揉冶抓熬第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 在使用XLAT指令之前,要先将表格的首地址放入BX寄存器内,要转换的字节即十六进制数,也应预先放入AL寄存器中;指令执行
21、后可在AL中得到转换后的代码(ASCII码)。XLAT指令利用AL寄存器内的值当作相对位移值,再加上BX的值,即可得到正确的地址。假设Hex是5,那么计算所得的地址是XLTAB5,XALT根据这个地址从表中查得35H,取代了AL原先的5。所以这种方法被称为查表法。安绅斥失樟岩塘居楼捂狙愤吾裳似啃捻捍踏窃彦狄瀑趾伎贴缓治包城碑恳第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.4 用查表法将一位十六进制数转换成相应的ASCII码。源程序清单如下:;filename:L124.ASM; DATASEGMENT挚棒嘲讶露攒哭窗棠该怂付诣稿植冕劫嵌屁翻媒氓揪沉吟诉眨研措笨肢鹿
22、第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 XLTABDB30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HHEXDB5ASCDB ?DATAENDS;CODESEGMENT投魂丑擒辅幽直以署窑蔑途围店柴睹讯籍熬糊溅埋堤砒瘴诗股熙命啊雾橇第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 ASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AXLEABX,XLTABMOV AL,HEXXLATMOVASC,ALMOVAH,4CHINT 21
23、HCODEENDSENDSTART孕佩义穆求淌爵督某抑乏登氯圣还寡矛周灶渤纸琶炭咆秀迷症叼凯核餐簿第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.5 显示十六进制数和对应的显示十六进制数和对应的ASCII字符字符例12.5几乎可以显示所有的ASCII字符和所对应的十六进制数。例如,Hex(十六进制)53的ASCII码是大写字母S,程序就会显示53S。完整的屏幕显示是一个1616的矩阵。沙指沼库缔囚蔫水缨棺相铺肢龟欺迪沟桃净屎缄澜拦价卢掐刮劈上豁悔笛第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 显示ASCII码符号比较容易,但要将十六进制数显示出来
24、,所涉及的技巧就比较多。例如,要用ASCII码显示Hex53,就必须将Hex53,转换成Hex3533;要显示Hex00,就必须将00转换成Hex3030,依次类推。墨山悲乌傈湖焊便羡剿伯鸿绥域嘴奏术暇娶墙晋枪赣膛伦斑会旅洋冉乎戎第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 这个程序先把HEXCTR内存单元初始化成00,然后将它逐一加1。子程序C10HEX把HEXCTR分成两个十六进制数。假设HEXCTR的内容是4F,C10HEX先取出Hex4,把它当作转换指令所需要的XLATAB表的指针,转换后所得的值Hex34放在AL内。然后C10HEX再取出F,转换成Hex46。这
25、个过程的运算结果是Hex3446,便可以显示出4F。显示结果在内存的存放格式是5个为一组(如第一项:2位十六进制数(00)、空格、对应的ASCII字符、空格),以80个字符为一行显示。例如,从DISPROW开始:籽矫洛抽保唱啤暖毙廊芯聋寥洛阑彼舰亨妨斟酶雀锹叙教鸿贸歪茨栅好捐第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 十六进制数字符十六进制数字符十六进制数字符内存内容:303020002030312001203032200220显示:000102表示空格。无法显示的字符均用空格(20)代替,因为DOS功能调用40H会将1AH当作一行的结束,所以程序将它转换成20H(空格
26、)。宗卧万轴柒兆吮卡熔岿盎之褐祁吏卢域壶歉程闹冯喊苞嘴垒秩弯僳罕辑横第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.5显示十六进制数及其对应的ASCII字符。程序清单如下:;filename:L125.ASM;DATASEGMENTDISPROWDB16DUP(),13HEXCTRDB00XLTABDB30H,31H,32H,33H,34H,35H,36H,37H DB38H,39H,41H,42H,43H,44H,45H,46HDATAENDS鬼祟允妹砒了潮荧瀑阎马短翟蝴昨的夹剖虏痹睛搐缀刃桶蠕尖溉识嗣芬口第12章表的处理第12章表的处理第第1212章章 表的处理
27、表的处理 ;CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXCALLQ10CLR;清除屏幕LEASI,DISPROW夕地壬赡苹盖太嘛枣疙忌迟划戏绵撅市壶丹泳哦耽渺陶务了贾剂衷煌势吁第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 A20LOOP:ALLC10HEX;转换CALLD10DISP;显示CMPHEXCTR,0FFH;是最后的十六进制变量0FFH吗?JEA50;是则终止程序INCHEXCTR ;不是则下一个十六进制加1JMPA20LOOP ;循环A50:MOVAH,4CHI
28、NT21H漳统矣唆氧花沪次赖密辊弄个重腿尸礁唱惭潭墩惹欢馋另采崭胜逸佐偏瞪第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 ;C10HEXPROC;十六进制转换成ASCII码MOVAH,00MOVAL,HEXCTR;取得一对十六进制数SHRAX,CL;右移LEABX,XLTAB;设表的首地址MOVCL,04;设移位次数XLAT;查表转换MOVSI,AL;存储左边的字符拱庭注丽母绵滑悬谣恩径珐铅谷砰圣辣冬谩掌慨脏牺湾癣骋盏病洲瞒巍跨第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MOVAL,HEXCTRSHLAX,CL;左移十六进制数SHRAL,CLXLAT
29、;查表转换MOVSI+1,AL;存储右边的字符RETC10HEXENDP;巧韩轴民磋诺家钾佳切爽闯窗娥泞善伟沉哇委哦辣孙耸津雀莉餐姬诅妮缉第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 D10DISPPROC;显示MOVAL,HEXCTRMOVSI+3,ALCMPAL,1AH;被显示的字符是1AHJED20;07H10H均替换成20HCMPAL,07HJBD30CMPAL,10HJAED30淡庐聋裔蜕资跳幕娩泥滥尊蹿鞭升审钥闭坑懊镑凝幼闻其检弟绥墩鳖沾茶第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 D20:MOVBYTEPTRSI+3,20HD30:歇
30、排愈赠汰饰隐耙演出祟图杉理谋领溢逢蹦蜜心场殖盈菩谆串滁竟钨浓猎第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 ADDSI,05;指向下一个显示项LEADI,DISPROW+80CMPDI,SIJNED40MOVAH,40H ;请求显示调用MOVBX,01 ;设备号显示器MOVCX,81 ;显示整个行LEADX,DISPROW蓑森械猛低辰湾绞栏骸翻算食灵甚插找缉歧嚼靶盾标管站芳腥局拂论箱迅第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 INT21HLEASI,DISPROW;重置显示地址D40:RETD10DISPENDP;Q10CLRPROC;清屏MOV
31、AX,0600HMOVBH,07 ;颜色设置烂镜婪疫曾纵抓鼠蛛揖剃匝剁暂汇偶述灌馈羔裂旷拎乾贺绳矣袍嘛编蕉看第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MOVCX,0000MOVDX,184FHINT10HRETQ10CLRENDP; CODEENDS ENDSTART裤报妖蔓前哟愧承蛾库灿垃抠肛钟酱幢匿裳缓滇棱士杆陀脑砚叼货说悟驻第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.6 数据排序程序数据排序程序在日常生活中,许多情况下都要用到排序,例如,图书编号、教室编号、学生编号等。有序的事情处理会比较方便,对表也一样,无序表的访问是非常费时的。
32、为了提高对表的访问效率,常常将表组织成有序表。将无序表中的数据项按照一定的顺序重新排列,这个过程就是排序。羞扯拿逸毛颇典娄胯讶办旧边伶楔墓嗣誉哈帜蓑插甸讨凛选弊阿晦凤斋亚第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 表的排序方法有很多种,有的很有效但不够简洁,有的很简洁但却没有效率。本节所介绍的排序方法效率比较高,而且可以用于大多数的表排序。因为目前我们不会做大量的表的排序,所以即使是最没有效率的排序方法,其执行速度都非常快。通常的排序方法,是用表中的某一项和它的下一项作比较,如果大于的话,两项互相调换位置;所以,此方法是用第一项和第二项比较,第二项和第三项比较,一直比到
33、表的最后而且适时地交换。在这个过程中一旦有交换的情形发生,那么就必须从第一项起再来一次;如果没有交换而能一直进行到表的结束,即表示排序成功。燃髓淹信刑童洼缓镇急剐公抉俗蝎林鞭达雏旺兴分疡惠诀缨修订沧傈戏氢第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 例12.6排序。用户最多可以输入30个名字,每个名字的长度最多可以为20个字符。当所有的名字输入完成之后,程序将这些名字依递增的顺序排列好,然后在屏幕上显示鞍胆乃俘德倦嫁合钎阁姑文茫涡歧坟椅凄痛钓王账寄吻槛厘扳棉犁窍酸僚第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 程序清单如下:;filename:L12
34、6.ASM;Page60,132Titlenmsort(exe)sortnamesenteredfromterminal;STACKSEGMENTPARASTACKSTACKDW32DUP(?)STACKENDS;烽燥簇蚊战悼辆铂郝份舅票磅糊溶攻抡阂馒间钉秀暖龚颂箍秒卞告汛奸图第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 DATASGSEGMENTPARADATANAMEPAR LABELBYTEMAXNLEN DB21 ;输入名字的最大长度NAMELEN DB?;实际输入名字的长度NAMEFLD DB21DUP();存放输入的名字CRLFDB13,10,$;回车换行EN
35、DADDR DW?;地址博殷痹士蓖镁神神食集厉凄挠戒椽颗恍伤宦杯絮孩间沉贷怒仑盈挪拘根根第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MESSG1DBNAME?,$ ;提示NAMECTR DB00;输入了几个名字NAMETAB DB30DUP(20DUP();名字表NAMESAV DB20DUP(?),13,10,$ ;显示表SWAPPEDDB00DATASGENDS;CODESGSEGMENTPARACODE畅碑副凭栋叫捎眷慢犬乒遭晌元耙则丝斩所带康旨鼓宁言捕绩绢独腻禾驾第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 BEGINPROCFARASSU
36、MECS:CODESG,DS:DATASG,ES:DATASG,SS:STACKPUSHDSSUBAX,AXPUSHAXMOVAX,DATASGMOVDS,AXMOVES,AXCLDLEADI,NAMETAB雇丫痊囱裔吐慧赂昨禾骡刨肢擦僚束钥遍挪裤烙拒剑脑庸瘟佛对斩拘查惩第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 CALLQ10CLR;清屏CALLQ20CURS;设置光标位置A20LOOP:CALLB10READ;接受输入的名字CMPNAMELEN,00;结束输入JZA30CMPNAMECTR,30;输入了30个名字吗?JEA30;是,则结束输入邦咙轻屉耪冰仅壶茄掳煽挺
37、断芽恤赊留刃窃殖弃休卸涪丈栽槛厌撑楔涯州第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 CALLD10STOR;将输入的名字传送到名字表JMPA20LOOP;循环、输入下一个名字A30:CALLQ10CLR;清屏CALLQ20CURS;设置光标位置CMPNAMECTR,01;输入的是一个名字吗?JBEA40;是结束输入CALLG10SORT ;对名字表排序CALLK10DISP;显示排序的结果耘盟婚兢殴柔末锅豁九蜘揭缠啦汪景庄倘烷筒丑挨集贰刁肖白暑秉棵景贿第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 A40: RETBEGINENDP;接受输入的名字;
38、 B10READPROC MOVAH,09 LEADX,MESSG1 INT21H;显示提示 MOVAH,0AH运肆绢沸巢缉辰铬吻瘪尘肚敏胯久仰抢雕嘛删思疹鹤玩蜗腮瓷曝患椅辽典第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 LEADX,NAMEPARINT21H ;键盘输入名字MOVAH,09LEADX,CRLF INT21H ;回车换行MOVBH,00;名字后的字符置为空格MOVBL,NAMELEN;取得字符的长度MOVCX,21;计算余下的长度酒溺访流襄峨玖钓遁绑熙席斡瓢桩夜抖买昌婆贬杜洪郭儿届拦痔嚷宗匣哲第12章表的处理第12章表的处理第第1212章章 表的处理表的处
39、理 SUBCX,BXB20:MOVNAMEFLDBX,20H;余下的位置存放空格INCBXLOOPB20 RETB10READENDP;输入的名字存入排序表;姻森雍寻驰学颓誉价挨楔音骸轰蚌氰鸵怕旦掺窗屉留统漫奖忽嘘茶殷艾侗第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 D10STORPROC INCNAMECTR;每输入一个名字加1 CLD;字串指令增值 LEASI,NAMEFLD;输入名字的首地址MOVCX,10REPMOVSW;传送名字到排序表 RETD10STORENDP宝即右业片辙睛履骇耿迫蔑嚏寄共育坝文埔践淡犬桩俐嘉萨耶融葡铆肝琢第12章表的处理第12章表的处理第
40、第1212章章 表的处理表的处理 ;对名字排序;G10SORTPROCSUBDI,40;计算表的结束位置MOVENDADDR,DIG20:MOVSWAPPED,00 LEASI,NAMETAB;设置表的开始郭深绩戌尉邮辛阎骄茬曲打窄楔辈梯蹈豫呢硕蜀氛喊卸肾婿婪霞验颖诲套第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 G30:MOVCX,20;比较的长度MOVDI,SIADDDI,20;下一比较字符的位置MOVAX,DIMOVBX,SIREPECMPSB;比较JBEG40;小于、等于不交换CALLH10XCHG;反之交换欠辉领叉绅插卧乳甲廉宽滚沦告萄怔顿症夜橡姚恢鼎呕东砚徽逢
41、芭筹蔷爆第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 G40:MOVSI,AXCMPSI,ENDADDR;表结束了吗?JBEG30;未结束循环CMPSWAPPED,00JNZG20RETG10SORTENDP;排序交换蝇瓢琴驭县豢胚颓厨秦矢寿莱资幅河隘圣妹淘鸽遭惑孤蔬无趟罗曼文仁茵第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 ;H10XCHGPROC MOVCX,10LEADI,NAMESAV;名字的暂存区MOVSI,BXREPMOVSW;将较小的项保存MOVCX,10MOVDI,BXREPMOVSW;传送较大的项到较低的单元界荒邹浙弗矿禁加州幸坟兄
42、挞茄瓤砧驭疽邱钧庭拎沧夹傻利闪淑斟它辞歹第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 MOVCX,10LEASI,NAMESAVREPMOVSW;传送保存的项到较高的单元MOVSWAPPED,01RETH10XCHGENDP;显示排序的名字; 篡趾入知获檄懂矛抬遗札底抠丘纺牙沼鞘嗓玉嚎书朴请拐互配撰媚印帆增第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 K10DISPPROCLEASI,NAMETAB;表的首地址K20:LEADI,NAMESAVMOVCX,10REPMOVSWMOVAH,09LEADX,NAMESAVINT21H;显示八粉匹眠发簇济膀
43、办熔挫隙潘止鄂石黎为钧共糙乙绕鞋劲酌慕械竖搏扯幕第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 DECNAMECTR;名字个数减1JNZK20;是最后一项吗?不是循环,是返回系统RETK10DISPENDP;Q10CLRPROCMOVAX,0600HMOVBH,07H钧吩撒摩巧畔蘸僧娠赢院湿钟疗蝇仇醋盾腹氖螟效尉慌进鹿铰鲸绩千卢端第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 SUBCX,CXMOVDX,184FHINT10HRETQ10CLRENDP; Q20CURSPROCMOVAH,02SUBBH,BH姐苛逮漳妓升伦据害阐暑逆俯籍仕茁温庭曾焕皑阵膛
44、儒旺星渤涎忿耽岁舔第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 SUBDX,DX;设置光标到0行0列INT10HRETQ20CURSENDP;CODESGENDSENDBEGIN霉斧医炭五种榆鳖伦楞芍颊频液虾实京浪缎由瓜煽沟烧染农尽个辙栖了男第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 12.7 TYPE、LENGTH和和SIZE运算符运算符汇编程序提供了一些很有用的运算符。例如,表的长度可能会经常性地修改、变动,所以就必须为了新的定义而去修改程序。但是使用TYPE、LENGTH和SIZE运算符,就会使指令数目减少。假设,下面是一个10个字(Word
45、)的表的定义:TABLEXDW10DUP(?)茬鸽棺墅听炉政嚼羌晌椭衙蚁男指诅汁何梆渐手颗脓柱降伯肖蜗燥真帛疤第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 可以用TYPE运算符确定它的类型,本例子是DW;用LENGTH运算符可确定DUP的个数,本例子是10;用SIZE运算符则可以计算出该表的字节数,本例子是10220,下面的例子说明这三个运算符的用法:MOVAX,TYPETABLEX;AX0002MOVBX,LENGTHTABLEX;BX000A(10)MOVCX,SIZETABLEX;CX0014(20)搬缝宛煎仲询诽央闹锋凤左捐遣载淄气匡影赶永烦岗际赚感赘喊谈咙含心第12章表的处理第12章表的处理第第1212章章 表的处理表的处理 你可以利用LENGTH和SIZE所返回的值,决定何时该停止对表的搜寻和排序。如果SI寄存器在搜寻时地址是递增的,就可以用如下的指令去测试:CMPSI,SIZETABLEX在第17章“汇编程序伪指令参考资料”中,有对TYPE、LENGTH和SIZE运算符的详细介绍。壤歉病月踞疡赎顽镰鸽就慕实弟潭归撵球唉君格导廊啮赔努寓爱屑邱液森第12章表的处理第12章表的处理