第12章表的处理-ppt课件_第1页
第12章表的处理-ppt课件_第2页
第12章表的处理-ppt课件_第3页
第12章表的处理-ppt课件_第4页
第12章表的处理-ppt课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第1212章章 表的处理表的处理 第第12章章 表的处置表的处置 12.1 定义表定义表 12.2 表的直接存取表的直接存取 12.3 表的搜索表的搜索 12.4 转换指令转换指令XLAT 12.5 显示十六进制数和对应的显示十六进制数和对应的ASCII字符字符 12.6 数据排序程序数据排序程序 12.7 TYPE、LENGTH和和SIZE运算符运算符 第第1212章章 表的处理表的处理 12.1 定定 义义 表表 为了便于对表的处置,首先要定义表,组织好表的构造,即把表的内容按一定规律组织起来。这样编程时就可以根据一定规律存取表中各项的内容。表的定义、组织没有固定的方法,完全是按表的内容

2、和用途而定。表的元素(内容)可以是一个数,也可以是一个字符或字符串。第第1212章章 表的处理表的处理 例如:以英文月份的缩写定义一个表,可以是如下的格式: MONTAB DBJAN, FEB, MAR,DEC 这个表具有延续、数据项等长的特点,处置起来就很方便。只需指定月份,就很容易查出该月的英文月份的缩写。第第1212章章 表的处理表的处理 12.2 表的直接存取表的直接存取 假设运用者从键盘输入一个月份的号码,如03,程序担任把它转换成文字型的月份称号的缩写MAR。完成这个任务的程序,必需定义一个表以存放各月份的称号,要求表中的每一项长度一样(即3)。所以这个表必需定义为以下方式:第第1

3、212章章 表的处理表的处理 MONTAB DB JAN DB FEB DB MAR 第第1212章章 表的处理表的处理 表中的第一项JAN的偏移地址是MONTAB0,FEB的偏移地址是MONTAB3,MAR的地址是MONTAB6。为了找到3月份在表中的月份缩写称号,程序必需做以下操作: (1) 输入月份3的ASCII码33,33转换成二进制的3。 (2) 从月份中减去1:3-12。 (3) 将差值乘以3(月份字符长度):236。 第第1212章章 表的处理表的处理 (4) 将所得的乘积加到MONTAB的偏移地址:MONTAB6,结果即为3月份MAR的偏移地址。 下例是完成上述任务的程序。第第

4、1212章章 表的处理表的处理 例12.1 从键盘输入一个数字月份,显示其对应的英文缩写。 源程序清单如下: ; filename:L121. ASM ; DATA SEGMENT THREE DB 3 MONIN DB 11 ;假设已输入的月份 第第1212章章 表的处理表的处理 ALFMON DB ?, $MONTAB DB JAN, FEB, MAR, APR, MAY, JUN DB JUL, AUG, SEP, OCT, NOV, DECDATA ENDS; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA第

5、第1212章章 表的处理表的处理 MOV DS,AX MOV ES,AX CALL C10CONV CALL D10LOC CALL F10DISP MOV AH,4CH INT 21H ; ASCII码转换成二进制; 第第1212章章 表的处理表的处理 C10CONV PROC MOV AH,MONIN MOV AL,MONIN+1 XOR AX,3030H CMP AH,00第第1212章章 表的处理表的处理 JZ C20 SUB AH,AH ADD AL,10C20: RETC10CONV ENDP; Locate month table; D10LOC PROC第第1212章章 表的处

6、理表的处理 LEA SI,MONTAB DEC AL ;月份减1 MUL THREE ADD SI,AX ;构成该月英文的首地址 MOV CX,03 CLD LEA DI,ALFMON REP MOVSB ;传送3个字符 RET第第1212章章 表的处理表的处理 D10LOC ENDP; Display alpha month; F10DISP PROC LEA DX,ALFMON MOV AH,09 ;显示月份英文缩写 INT 21H RETF10DISP ENDP CODE ENDS END START第第1212章章 表的处理表的处理 阐明:例12.1假设运用者已用另外一个程序接受了输入

7、的ASCII月份数,并存在MONIN单元内。 假设上述各数据项长度不等长,那么取出中间数据项就很费事。例如,要求显示英文月份全名,此时需求构造有规律的表;方法是取最长月份的名作为各月份项的长度,缺乏者补空格,然后就可按照上述方法处置编写程序。第第1212章章 表的处理表的处理 由于例12.1的方法是直接计算表中的某项地址,然后存取,而不需求将整个表从头到尾搜索一遍,所以称为表的直接存取法。 直接存取法虽然很有效,但是它只适用于各项延续的表;例如,表的各项是1,2,3 的顺序,或606,607,608,甚至可以是5,10,15 。但是,通常实践运用时不会全是有如此规律的表。第第1212章章 表的

8、处理表的处理 12.3 表表 的的 搜搜 索索 表的搜索方法有直接搜索法、顺序搜索法、折半搜索法等。 直接搜索法就是要搜索的内容和它在表中的位置存在有一定的规律,也就是说可用某一公式表示获得这种规律。这种方法搜索最快,但要求表中各数据项有规律性。在定义表时尽量要满足某种规律,然后才干运用,见例12.1。第第1212章章 表的处理表的处理 顺序搜索法通常适用于对无规律的数组进展搜索,表中的元素之间或元素与地址之间无规律可循。此种方法只能从表的开头开场逐项搜索,这种方法的平均比较次数为(n+1)/2次,所以速度慢,效率低。 折半搜索法适用于已排序的表,这种方法搜索次数少,效率高。 第第1212章章

9、 表的处理表的处理 例12.2 顺序搜索表。设有一个包含假设干个字节的数组,首地址为A;要求编写程序,查找其中能否存在数“8。假设存在,显示“Y;否那么,显示“N。 源程序清单如下:; filename:L122.ASM; DATA SEGMENT A DB 1,3,20,5,6,2,8CEQU $A第第1212章章 表的处理表的处理 DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,C LEA DI, A MOV AL,8 CLD 第第1212章

10、章 表的处理表的处理 REPNZSCASB JZ FOUND MOV DL,N JMP DISPFOUND:MOV DL,YDISP:MOV AH,2 INT 21H MOV AH,4CH INT 21HCODE ENDS END START第第1212章章 表的处理表的处理 例12.3 对元素长度超越两个字节的表进展搜索。 当表中各项的长度超越两个字节时,就必需用REPE CMPS指令来比较。假设,有这样一种货物号与货物名表:3个字节长度的货物号,9个字节长度的货物名,见例12.3数据段。STOKNIN是数据段的第一栏,表示要搜索的货物号;STOKTAB是第二栏,表示货物表的开场,它们在存储

11、器中的陈列情形如下: 货物表: 123 035 Excavators 038 Lifters 049 Presses 偏移地址: 00 03 06 16 19 29 32第第1212章章 表的处理表的处理 表的最后运用了一项“999作为搜索终了的标识。表中的每一项内容以以下的方法与STOKNIN作比较: 表中之项 STOKNIN 比较结果 035 123 小于,检查下一项 038 123 小于,检查下一项 049 123 小于,检查下一项 102 123 小于,检查下一项 123 123 等于,搜索胜利第第1212章章 表的处理表的处理 例12.3的程序所运用的CMPSB指令,可以一个字节一个

12、字节逐个比较,直到不相等为止,同时它也可以将存放器SI和DI自动加1。 首先,CX被初始化为03,而SI和DI所存的偏移地址分别是03和00。当表中的第一项和STOKNIN比较时(035:123)会在第一个字节比较完之后终了;此时SI是04,DI是01,而CX是02。为了能正常地进展下一项的比较,SI应该是16,DI应该是00。 第第1212章章 表的处理表的处理 要获得正确的DI内容,可以再将STOKNIN的地址传送给DI;假设要使SI能得到正确的地址,它应由上一次比较停在哪一项之后而决议;还应思索CX当前的值,即有多少字节未作比较,此时CX是02。SI的当前值加上CX的当前值再加上货物名的

13、长度,就可以得到下一项在表中的正确地址,即 CMPSB执行后SI内的值: 04 加CX的当前值: 02 加货物名的长度: + 10 下一项的偏移地址: 16第第1212章章 表的处理表的处理 由于CX所含的值是剩下的未作比较的字节数,所以,以上的计算方法适用于一切的情形。在比较了1、2或3个字节之后,当比较的结果相等时,CX的值是00,此时SI也就是所要的货物名的地址了。 例12.3的源程序清单如下: ; filename:L123.ASM ; DATA SEGMENT STOKNIN DB 123 第第1212章章 表的处理表的处理 STOKTAB DB 035, Excavators ;S

14、tart of table DB 038, Lifters DB 049, Presses DB 102, Valves DB 123, Processors DB 127, Pumps DB 999, 10 DUP( ) ;End of tableDESCRN DB 10 DUP(?)第第1212章章 表的处理表的处理 DATA ENDS; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX CLD LEA SI,STOKTAB A20: MOV CX,03第第1212章章 表的

15、处理表的处理 LEA DI,STOKNIN REPE CMPSB JE A30 JA A40 ADD SI,CX ADD SI,10 JMP A20A30: MOV CX,05 LEA DI,DESCRN REP MOVSW JMP A50第第1212章章 表的处理表的处理 A40: CALL R10ERRA50: MOV AH,4CH INT 21H ; R10ERR PROC ; RETR10ERR ENDPCODE ENDS END START第第1212章章 表的处理表的处理 12.4 转换指令转换指令XLAT XLAT指令可以将一个字节的值,转换成另一个曾经预先定义在一个表中的值。例

16、如,可以利用XLAT指令把十六进制数转换成其对应的ASCII码,或把ASCII码转换成十六进制数。第第1212章章 表的处理表的处理 例12.4是把十六进制数(Hex)转换成ASCII码。要运用XLAT指令,必需先定义一个转换表,用以存放十六进制数对应的ASCII码表,如: XLTAB DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H第第1212章章 表的处理表的处理 在运用XLAT指令之前,要先将表格的首地址放入BX存放器内,要转换的字节即 十六进制数,也应预先放入AL存放器中;指令执行后可在AL中得到

17、转换后的代码(ASCII码)。XLAT指令利用AL存放器内的值当作相对位移值,再加上BX的值,即可得到正确的地址。假设Hex是5,那么计算所得的地址是XLTAB5,XALT根据这个地址从表中查得35H,取代了AL原先的5。所以这种方法被称为查表法。第第1212章章 表的处理表的处理 例12.4 用查表法将一位十六进制数转换成相应的ASCII码。 源程序清单如下:; filename:L124.ASM; DATA SEGMENT 第第1212章章 表的处理表的处理 XLTAB DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44

18、H,45H,46HHEX DB 5ASC DB ?DATA ENDS; CODE SEGMENT第第1212章章 表的处理表的处理 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOVDS,AX LEA BX,XLTAB MOV AL,HEX XLAT MOV ASC,AL MOV AH,4CH INT 21H CODE ENDSEND START第第1212章章 表的处理表的处理 12.5 显示十六进制数和对应的显示十六进制数和对应的ASCII字符字符 例12.5几乎可以显示一切的ASCII字符和所对应的十六进制数。例如,Hex (十六进制) 53的AS

19、CII码是大写字母S,程序就会显示53 S。完好的屏幕显示是一个1616 的矩阵。第第1212章章 表的处理表的处理 显示ASCII码符号比较容易,但要将十六进制数显示出来,所涉及的技巧就比较多。例如,要用ASCII码显示Hex 53,就必需将Hex 53,转换成Hex 35 33;要显示Hex 00,就必需将00转换成Hex 3030,依次类推。 第第1212章章 表的处理表的处理 这个程序先把HEXCTR内存单元初始化成00,然后将它逐一加1。子程序C10HEX把HEXCTR分成两个十六进制数。假设HEXCTR的内容是4F,C10HEX先取出Hex 4,把它当作转换指令所需求的XLATAB

20、表的指针,转换后所得的值Hex 34放在AL内。然后C10HEX再取出F,转换成Hex 46。这个过程的运算结果是Hex 34 46,便可以显示出4F。显示结果在内存的存放格式是5个为一组(如第一项:2位十六进制数(00)、空格、对应的ASCII字符、空格),以80个字符为一行显示。例如,从DISPROW开场:第第1212章章 表的处理表的处理 十六进制数 字符 十六进制数 字符 十六进制数 字符 内存内容:30 30 20 00 20 30 31 20 01 20 30 32 20 02 20 显 示:0 0 0 1 0 2 表示空格。无法显示的字符均用空格(20)替代,由于DOS功能调用4

21、0H会将1AH当作一行的终了,所以程序将它转换成20H(空格)。第第1212章章 表的处理表的处理 例12.5 显示十六进制数及其对应的ASCII字符。程序清单如下:; filename:L125.ASM; DATA SEGMENT DISPROWDB 16 DUP( ),13HEXCTR DB 00XLTAB DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46HDATA ENDS第第1212章章 表的处理表的处理 ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA S

22、TART: MOV AX,DATA MOV DS,AX MOV ES,AX CALL Q10CLR ;去除屏幕 LEA SI,DISPROW第第1212章章 表的处理表的处理 A20LOOP: ALL C10HEX ;转换 CALL D10DISP ;显示 CMP HEXCTR,0FFH ;是最后的十六进制变量0FFH吗? JE A50 ;是那么终止程序 INC HEXCTR ;不是那么下一个十六进制加1 JMP A20LOOP ;循环 A50: MOV AH,4CH INT 21H第第1212章章 表的处理表的处理 ; C10HEX PROC ;十六进制转换成ASCII码 MOV AH,00

23、 MOV AL,HEXCTR ;获得一对十六进制数 SHR AX,CL ;右移 LEA BX,XLTAB ;设表的首地址 MOV CL,04 ;设移位次数 XLAT ;查表转换 MOV SI,AL ;存储左边的字符第第1212章章 表的处理表的处理 MOV AL,HEXCTR SHL AX,CL ;左移十六进制数 SHR AL,CL XLAT ;查表转换 MOV SI+1,AL ;存储右边的字符 RET C10HEX ENDP; 第第1212章章 表的处理表的处理 D10DISP PROC ;显示 MOV AL,HEXCTR MOV SI+3,AL CMP AL,1AH ;被显示的字符是1AH

24、 JE D20 ;07H10H均交换成20H CMP AL,07H JB D30 CMP AL,10H JAE D30 第第1212章章 表的处理表的处理 D20: MOV BYTE PTR SI+3,20H D30:第第1212章章 表的处理表的处理 ADD SI,05 ;指向下一个显示项 LEA DI,DISPROW+80 CMP DI,SI JNE D40 MOV AH,40H ;恳求显示调用 MOV BX,01 ;设备号显示器 MOV CX,81 ;显示整个行 LEA DX,DISPROW第第1212章章 表的处理表的处理 INT 21H LEA SI,DISPROW ;重置显示地址

25、D40: RET D10DISP ENDP; Q10CLR PROC ;清屏 MOV AX,0600H MOV BH,07 ;颜色设置第第1212章章 表的处理表的处理 MOV CX,0000 MOV DX,184FH INT 10H RET Q10CLR ENDP; CODE ENDS END START第第1212章章 表的处理表的处理 12.6 数据排序程序数据排序程序 在日常生活中,许多情况下都要用到排序,例如,图书编号、教室编号、学生编号等。有序的事情处置睬比较方便,对表也一样,无序表的访问是非常费时的。为了提高对表的访问效率,经常将表组织成有序表。将无序表中的数据项按照一定的顺序重

26、新陈列,这个过程就是排序。第第1212章章 表的处理表的处理 表的排序方法有很多种,有的很有效但不够简约,有的很简约但却没有效率。本节所引见的排序方法效率比较高,而且可以用于大多数的表排序。由于目前我们不会做大量的表的排序,所以即使是最没有效率的排序方法,其执行速度都非常快。 通常的排序方法,是用表中的某一项和它的下一项作比较,假设大于的话,两项互相互换位置;所以,此方法是用第一项和第二项比较,第二项和第三项比较,不断比到表的最后而且适时地交换。在这个过程中一旦有交换的情形发生,那么就必需从第一项起再来一次;假设没有交换而能不断进展到表的终了,即表示排序胜利。第第1212章章 表的处理表的处理

27、 例12.6 排序。用户最多可以输入30个名字,每个名字的长度最多可以为20个字符。当一切的名字输入完成之后,程序将这些名字依递增的顺序陈列好,然后在屏幕上显示第第1212章章 表的处理表的处理 程序清单如下:; filename:L126.ASM; Page 60,132Title nmsort(exe) sort names entered from terminal; STACK SEGMENT PARA STACK STACK DW 32 DUP (?)STACK ENDS; 第第1212章章 表的处理表的处理 DATASG SEGMENT PARA DATANAMEPAR LABEL

28、 BYTEMAXNLEN DB 21 ;输入名字的最大长度NAMELEN DB ? ;实践输入名字的长度NAMEFLD DB 21 DUP( );存放输入的名字 CRLF DB 13,10, $ ;回车换行ENDADDR DW ? ;地址第第1212章章 表的处理表的处理 MESSG1 DB NAME?, $ ;提示NAMECTR DB 00 ;输入了几个名字NAMETAB DB 30 DUP(20 DUP( ) ;名字表NAMESAV DB 20 DUP(?),13,10, $ ;显示表SWAPPED DB 00DATASG ENDS; CODESG SEGMENT PARA CODE第第1

29、212章章 表的处理表的处理 BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,ES:DATASG,SS:STACK PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX CLD LEA DI,NAMETAB第第1212章章 表的处理表的处理 CALL Q10CLR ;清屏 CALL Q20CURS ;设置光标位置 A20LOOP: CALL B10READ ;接受输入的名字 CMP NAMELEN,00 ;终了输入 JZ A30 CMP NAMECTR,30 ;输入了30个名字吗? JE A3

30、0 ;是,那么终了输入第第1212章章 表的处理表的处理 CALL D10STOR ;将输入的名字传送到名字表 JMP A20LOOP ;循环、输入下一个名字A30: CALL Q10CLR ;清屏 CALL Q20CURS ;设置光标位置 CMP NAMECTR,01 ;输入的是一个名字吗? JBE A40 ;是终了输入CALL G10SORT ;对名字表排序 CALL K10DISP ;显示排序的结果 第第1212章章 表的处理表的处理 A40: RETBEGIN ENDP; 接受输入的名字; B10READPROC MOV AH,09 LEA DX,MESSG1 INT 21H ;显示提

31、示 MOV AH,0AH第第1212章章 表的处理表的处理 LEA DX,NAMEPAR INT 21H ;键盘输入名字 MOV AH,09 LEA DX,CRLF INT 21H ;回车换行 MOV BH,00 ;名字后的字符置为空格 MOV BL,NAMELEN ;获得字符的长度 MOV CX,21 ;计算余下的长度第第1212章章 表的处理表的处理 SUB CX,BX B20: MOV NAMEFLDBX,20H ;余下的位置存放空格 INC BX LOOP B20 RETB10READENDP; 输入的名字存入排序表; 第第1212章章 表的处理表的处理 D10STORPROC INC

32、 NAMECTR ;每输入一个名字加1 CLD ;字串指令增值 LEA SI,NAMEFLD ;输入名字的首地址 MOV CX,10 REP MOVSW ;传送名字到排序表 RETD10STOR ENDP第第1212章章 表的处理表的处理 ; 对名字排序; G10SORTPROC SUB DI,40 ;计算表的终了位置 MOV ENDADDR,DIG20: MOV SWAPPED,00 LEA SI,NAMETAB ;设置表的开场第第1212章章 表的处理表的处理 G30: MOV CX,20 ;比较的长度 MOV DI,SI ADD DI,20 ;下一比较字符的位置 MOV AX,DI MOV BX,SI REPE CMPSB ;比较 JBE G40 ;小于、等于不交换 CALL H10XCHG ;反之交换第第1212章章 表的处理表的处理 G40: MOV SI,AX CMP SI,ENDADDR ;表终了了吗? JBE G30 ;未终了循环 CMP SWAPPED,00 JNZ G20 RETG10SORT ENDP ; 排序交换第第1212章章 表的处理表的处理 ; H10XCHG PROC MOV CX,10 LEA DI,NAMESAV ;名字的暂存区 MOV SI,BX REP MOVSW ;将较小的项保管 MOV CX,10 MOV DI,BX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论