黄强汇编第6章数值与非数值程序设计_第1页
黄强汇编第6章数值与非数值程序设计_第2页
黄强汇编第6章数值与非数值程序设计_第3页
黄强汇编第6章数值与非数值程序设计_第4页
黄强汇编第6章数值与非数值程序设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 在汇编语言程序设计中,常常遇到数值运算问题和非数值处理在汇编语言程序设计中,常常遇到数值运算问题和非数值处理问题。其中常见的数值运算是加、减、乘、除四则运算。相比来讲,问题。其中常见的数值运算是加、减、乘、除四则运算。相比来讲,使用汇编语言完成数值运算远比使用高级语言难以实现。因为汇编使用汇编语言完成数值运算远比使用高级语言难以实现。因为汇编语言的指令语句所提供的运算位数是有限的,且每条指令的功能是语言的指令语句所提供的运算位数是有限的,且每条指令的功能是有限的。数值运算有定点数运算和浮点数运算。由于数的表达方式有限的。数值运算有定点数运

2、算和浮点数运算。由于数的表达方式不同,它们的运算方法也不同。随着计算机的发展,非数值处理如不同,它们的运算方法也不同。随着计算机的发展,非数值处理如代码转换、字符处理、表处理、代码转换、字符处理、表处理、 检索排序等的使用已经超过了数值检索排序等的使用已经超过了数值运算程序设计,因而也是我们重点掌握的内容。运算程序设计,因而也是我们重点掌握的内容。 本章以定点数运算为主介绍数值程序设计,并以代码、字符、本章以定点数运算为主介绍数值程序设计,并以代码、字符、表等的处理介绍非数值程序设计。表等的处理介绍非数值程序设计。v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计

3、设计高等高等教教育出版社育出版社6.1 6.1 数值运算程序设计数值运算程序设计6.1.1 6.1.1 定点数的运算定点数的运算 在计算机中,无论数据、指令、符号等,均用二进制代码表在计算机中,无论数据、指令、符号等,均用二进制代码表示。因此数据也用二进制代码表示。前面讲过,根据小数点位置的示。因此数据也用二进制代码表示。前面讲过,根据小数点位置的变化情况,将数据分为定点数和浮点数。定点数分为有符号数和无变化情况,将数据分为定点数和浮点数。定点数分为有符号数和无符号数。有符号数利用最高位来表示数的正、负;用符号数。有符号数利用最高位来表示数的正、负;用0 0表示正数,表示正数,用用1 1表示负

4、数。对于负数应以其补码形式给出。而无符号数,则不表示负数。对于负数应以其补码形式给出。而无符号数,则不须符号位。最高位仍然用来表示数值。须符号位。最高位仍然用来表示数值。 对于加、减法运算,有、无符号数均使用同样的加、减运算指对于加、减法运算,有、无符号数均使用同样的加、减运算指令。但程序员应明确所进行的运算是有符号数还是无符号数,以避令。但程序员应明确所进行的运算是有符号数还是无符号数,以避免出现错误。而乘、除法运算则区分有符号数和无符号数的运算指免出现错误。而乘、除法运算则区分有符号数和无符号数的运算指令,在编程时应充分注意。由于本书讨论的数值运算为定点数运算,令,在编程时应充分注意。由于

5、本书讨论的数值运算为定点数运算,因此,如无特别说明,以下运算都是指定点数的运算。因此,如无特别说明,以下运算都是指定点数的运算。返回本章首页返回本章首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.1.2 6.1.2 加法运算加法运算 定点数的表示范围虽不如浮点数大,但可使用多字节来定点数的表示范围虽不如浮点数大,但可使用多字节来表示数据。而多字节运算可以保证数据运算的精度。表示数据。而多字节运算可以保证数据运算的精度。 在进行定点数加法运算程序设计时,要用足够多的字节在进行定点数加法运算程序设计时,要用足够多的字节数表示运

6、算数的大小,以避免运算结果产生溢出而造成错误。数表示运算数的大小,以避免运算结果产生溢出而造成错误。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例例6.1 6.1 】 在以在以DAT0DAT0和和DAT1DAT1开始的缓冲区中各有一组二开始的缓冲区中各有一组二进制数,低字节放在低地址,高字节放在高地址。其字节长进制数,低字节放在低地址,高字节放在高地址。其字节长度都为度都为1010,编程求其和,结果存于,编程求其和,结果存于DAT2DAT2开始的缓冲区。开始的缓冲区。 分析:本题显然属于多字节二进制

7、数加法,为确保运算分析:本题显然属于多字节二进制数加法,为确保运算结果的精度结果的精度, ,使用多字节定点加法运算。程序中用加法指令实使用多字节定点加法运算。程序中用加法指令实现字节相加运算,而多字节相加则用循环程序实现。首先从现字节相加运算,而多字节相加则用循环程序实现。首先从低字节开始加,每循环一次完成一个字节的相加运算,然后低字节开始加,每循环一次完成一个字节的相加运算,然后再进行高字节加法运算,依次类推。循环次数即参加运算的再进行高字节加法运算,依次类推。循环次数即参加运算的字节数。需要注意的是,高字节相加时应考虑低字节相加可字节数。需要注意的是,高字节相加时应考虑低字节相加可能的进位

8、。程序如下:能的进位。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社【例例6.2 6.2 】在以在以DAT0DAT0和和DAT1DAT1开始的缓冲区中各有一组压缩的开始的缓冲区中各有一组压缩的BCDBCD数,数,其字节长度为其字节长度为8 8,低位数位于低地址,编程求其和,结果存于,低位数位于低地址,编程求其和,结果存于DAT2DAT2开开始的缓冲区。始的缓冲区。 分析:本题同例分析:本题同例6.16.1类似,也属于多字节二进制数加法,只不过类似,也属于多字节二进制数加法,只不过参与运算的是压缩的参与运算的是压缩的BC

9、DBCD数,同样使用多字节加法运算完成。程序如数,同样使用多字节加法运算完成。程序如下:下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 可以看出,压缩可以看出,压缩BCDBCD数的加法运算与二进制数加法运算所用的数的加法运算与二进制数加法运算所用的方法是基本相同的,只不过方法是基本相同的,只不过BCDBCD数的运算要用数的运算要用DAADAA指令进行十进制指令进行十进制调整。对于非压缩的调整。对于非压缩的BCDBCD数,其加法运算同上面的方法一致,只是数,其加法运算同上面的方法一致,只是调整指令换成了调整指令换成了AAAAA

10、A。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.1.3 6.1.3 减法运算减法运算 加减法运算除指令本身不同外,程序结构几乎是完全相加减法运算除指令本身不同外,程序结构几乎是完全相同的。对于较大的数据,同样采用多字节运算,以保证结果同的。对于较大的数据,同样采用多字节运算,以保证结果的正确性。多字节减法运算也要考虑低字节向高字节的借位,的正确性。多字节减法运算也要考虑低字节向高字节的借位,故应用带借位减法指令故应用带借位减法指令SBBSBB实现。实现。 减法运算同样要考虑有符号数的溢出问题,程序中

11、应做减法运算同样要考虑有符号数的溢出问题,程序中应做专门的处理。而无符号数也要考虑被减数向进位标志专门的处理。而无符号数也要考虑被减数向进位标志CFCF的借的借位情况,以表明最终结果的正负。位情况,以表明最终结果的正负。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.3 6.3 】在以】在以DAT0DAT0和和DAT1DAT1开始的缓冲区中各有一组二进开始的缓冲区中各有一组二进制无符号数,低字节放在低地址,高字节放在高地址。其字节制无符号数,低字节放在低地址,高字节放在高地址。其字节长度都为长

12、度都为8 8,编程求其差,结果存于,编程求其差,结果存于DAT2DAT2开始的缓冲区。(注:开始的缓冲区。(注:不考虑借位)。不考虑借位)。 分析:本题属于多字节二进制数减法,使用多字节减法运分析:本题属于多字节二进制数减法,使用多字节减法运算完成。程序如下:算完成。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.4 6.4 】在以】在以DAT0DAT0和和DAT1DAT1开始的缓冲区中各有一组开始的缓冲区中各有一组8 8位位非压缩的非压缩的BCDBCD数,低位数位于低地址,编程求其差,结果显示数,低位数位

13、于低地址,编程求其差,结果显示在屏幕上。在屏幕上。 分析:本题属于多字节分析:本题属于多字节BCDBCD数减法运算,同样使用以上的数减法运算,同样使用以上的程序结构完成。程序如下:程序结构完成。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.1.4 6.1.4 乘法运算乘法运算 乘法指令对于有符号乘法运算和无符号乘法运算是不同的,乘法指令对于有符号乘法运算和无符号乘法运算是不同的,这在编程时应充分注意。不超过一个字长度的乘法运算可直接这在编程时应充分注意。不超过一个字长度的乘法运算可直接用乘法指令完成。但多字节乘法运

14、算较为复杂,需用循环程序用乘法指令完成。但多字节乘法运算较为复杂,需用循环程序实现。此外,乘除法指令本身也比加减法运算复杂,指令执行实现。此外,乘除法指令本身也比加减法运算复杂,指令执行前后有关寄存器的变化情况也是要掌握的基本问题。前后有关寄存器的变化情况也是要掌握的基本问题。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.5 6.5 】在内存字单元】在内存字单元W1W1和字节单元和字节单元B1B1各有一个有符号数各有一个有符号数为为-128H-128H和和0A1H0A1H,求其乘积,结果存入

15、,求其乘积,结果存入W2W2开始的单元中。开始的单元中。 分析:本题为一个分析:本题为一个1616位有符号数同一个位有符号数同一个8 8位有符号数进行乘位有符号数进行乘法运算。由于乘数与被乘数的位数应该相同,故将法运算。由于乘数与被乘数的位数应该相同,故将8 8位的有符号位的有符号数进行字节扩展,使之变成数进行字节扩展,使之变成1616位的有符号数,再进行乘法运算。位的有符号数,再进行乘法运算。程序如下:程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.6 6.6 】在以】在以DATDAT为首地址的缓冲区中有

16、一个为首地址的缓冲区中有一个6 6个字节个字节的二进制无符号数,将其与字节单元的二进制无符号数,将其与字节单元B1B1中的一位无符号数相中的一位无符号数相乘,结果存入乘,结果存入RSLTRSLT开始的缓冲区。开始的缓冲区。 分析:本题的实现并不复杂,只需将分析:本题的实现并不复杂,只需将6 6个字节的数据作为个字节的数据作为被乘数,其每一个字节依次与被乘数,其每一个字节依次与B1B1中的乘数相乘再保存结果即中的乘数相乘再保存结果即可。只是乘数每次与较高字节的乘积还要加上低位的进位,可。只是乘数每次与较高字节的乘积还要加上低位的进位,就象普通的乘法运算一样。程序如下:就象普通的乘法运算一样。程序

17、如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 本例是多位被乘数与一位乘数相乘,有关被乘数与乘数本例是多位被乘数与一位乘数相乘,有关被乘数与乘数都是多字节的情况,可用类似的方法解决。本例中二进制数都是多字节的情况,可用类似的方法解决。本例中二进制数乘法运算的方法同样适用于其它进制,非压缩的乘法运算的方法同样适用于其它进制,非压缩的BCDBCD数乘法运数乘法运算也可以使用本方法,只是每次乘法运算完毕后都要用算也可以使用本方法,只是每次乘法运算完毕后都要用AAMAAM进进行相应的十进制调整。下面举例说明。行相应的十进制调整。下

18、面举例说明。v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.7 6.7 】在以】在以DATDAT为首地址的缓冲区中有一个为首地址的缓冲区中有一个6 6位非压位非压缩的缩的BCDBCD数,低位数位于低地址,将其与字节单元数,低位数位于低地址,将其与字节单元B1B1中非压中非压缩的缩的BCDBCD数相乘,结果存入数相乘,结果存入RSLTRSLT开始的缓冲区。要求用子程开始的缓冲区。要求用子程序完成非压缩序完成非压缩BCDBCD数的乘法运算。数的乘法运算。 分析:本题同例分析:本题同例6.66.6的编程方法是相似的,只是牵

19、涉到的编程方法是相似的,只是牵涉到子程序设计。我们用子程序设计。我们用BCDMBCDM子程序完成乘法运算,子程序与主子程序完成乘法运算,子程序与主程序之间采用寄存器和存储单元传递参数。程序如下:程序之间采用寄存器和存储单元传递参数。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.86.8】在】在B1B1和和B2B2单元分别有一个两位压缩的单元分别有一个两位压缩的BCDBCD数,数,求其乘积,结果存入求其乘积,结果存入RSLTRSLT开始的缓冲区。要求用子程序完成开始的缓冲区。要求用子程序完成压缩压缩BCDB

20、CD数的乘法运算。数的乘法运算。 分析:对于压缩分析:对于压缩BCDBCD数的乘法运算,并没有专门的十进数的乘法运算,并没有专门的十进制调整指令,故不能直接用两数相乘的方法。但我们知道,制调整指令,故不能直接用两数相乘的方法。但我们知道,一个被乘数一个被乘数m m乘以乘数乘以乘数n n相当于被乘数相当于被乘数m m累加累加n n次。而压缩次。而压缩BCDBCD数的加法运算有相应的十进制调整指令,所以本题可用数的加法运算有相应的十进制调整指令,所以本题可用BCDBCD数累加的方法完成。由于两位数累加的方法完成。由于两位BCDBCD数相乘结果可能为数相乘结果可能为3 3位位BCDBCD数,故保留两

21、个字节存储单元用于存储乘积。程序如下数,故保留两个字节存储单元用于存储乘积。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计 程序中每一次加减法运算后面都跟着一条十进制调整程序中每一次加减法运算后面都跟着一条十进制调整指令,以确保压缩指令,以确保压缩BCDBCD数运算的结果正确无误。数运算的结果正确无误。汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.2 6.2 数据处理程序设计数据处理程序设计6.2.1 6.2.1 数据处理简介数据处理简介 早期的计算机主要用于数学运算,因而经常进行各种数值运算早期的计算机主要用于数学运算,因而经常进行各种数值运算程序设计。随着

22、计算机的发展,计算机的应用领域得到了很大拓展,程序设计。随着计算机的发展,计算机的应用领域得到了很大拓展,在许多领域算术运算已不再是计算机的主要功能。比如在多媒体、在许多领域算术运算已不再是计算机的主要功能。比如在多媒体、通信、控制等领域,虽然也要进行一定的数学运算,但计算机更多通信、控制等领域,虽然也要进行一定的数学运算,但计算机更多的要进行一些数据处理,如大小写字母之间的转换,不同进制数据的要进行一些数据处理,如大小写字母之间的转换,不同进制数据之间的相互转换,数据与之间的相互转换,数据与ASCIIASCII码之间的相互转换,字符与字符串的码之间的相互转换,字符与字符串的处理,表格数据的处

23、理及检索排序等,统称为非数值处理。处理,表格数据的处理及检索排序等,统称为非数值处理。 非数值处理往往也包含着一定的数值运算或逻辑运算,但它与非数值处理往往也包含着一定的数值运算或逻辑运算,但它与数值运算的程序设计方法是不同的,下面分别介绍。数值运算的程序设计方法是不同的,下面分别介绍。返回本章首页返回本章首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.2.2 6.2.2 代码转换代码转换1 1不同进制数据与不同进制数据与ASCIIASCII码的相互转换码的相互转换 计算机中的数据是以二进制形式存在的,该数据要显示计算机中

24、的数据是以二进制形式存在的,该数据要显示到屏幕上,必须首先转换为到屏幕上,必须首先转换为ASCIIASCII码。码。ASCIIASCII码表共包含码表共包含128128个个字符,其中使用最多的是十进制数据字符字符,其中使用最多的是十进制数据字符0 09 9和和2626个英文字个英文字母的大小写字符等,而十六进制数据有关的字母通常为大写母的大小写字符等,而十六进制数据有关的字母通常为大写字母字母A AF F。通过前面的学习,我们知道,字符。通过前面的学习,我们知道,字符0 09 9的的ASCIIASCII码码为该数据加上为该数据加上30H30H,十六进制数据字符,十六进制数据字符A AF F的的

25、ASCIIASCII码等于该码等于该数据加上数据加上37H37H。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.11 6.11 】编写一个子程序,将入口参数】编写一个子程序,将入口参数ALAL中的二进制中的二进制数以十六进制形式显示到屏幕上。数以十六进制形式显示到屏幕上。 分析:由于分析:由于4 4位二进制数据就是一位十六进制数据,因位二进制数据就是一位十六进制数据,因而它们之间不需转换。但该数据包含两个十六进制数据,因而它们之间不需转换。但该数据包含两个十六进制数据,因此必须单独转换为此必

26、须单独转换为ASCIIASCII码,然后再显示。本题只需按照上码,然后再显示。本题只需按照上面介绍的方法编程即可。程序如下:面介绍的方法编程即可。程序如下:;子程序名:;子程序名:SDISPSDISP;功能:将;功能:将ALAL中的二进制数据以十六进制中的二进制数据以十六进制;形式显示到屏幕上。;形式显示到屏幕上。;入口参数:;入口参数:AL=AL=二进制数据二进制数据;出口参数:无;出口参数:无v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 由本题可以看出,不管十进制或十六进制,在计算机中由本题可以看出,不管十进制或十六进制,

27、在计算机中都以二进制形式存在,要在屏幕上以十六进制显示,只需将都以二进制形式存在,要在屏幕上以十六进制显示,只需将数据每数据每4 4位二进制作为一个十六进制字符显示即可。如果以二位二进制作为一个十六进制字符显示即可。如果以二进制形式显示,则将该数据的每一位(进制形式显示,则将该数据的每一位(0 0或或1 1)转换为)转换为ASCIIASCII码,码,但要以十进制形式显示,则必须将该数据转换为十进制数据,但要以十进制形式显示,则必须将该数据转换为十进制数据,并将每一位十进制字符转换为并将每一位十进制字符转换为ASCIIASCII码再显示。其方法我们在码再显示。其方法我们在第四章已做过介绍。第四章

28、已做过介绍。 以上是将二进制数据转换为以上是将二进制数据转换为ASCIIASCII码的方法。有时侯我们码的方法。有时侯我们需要将键盘上键入字符的需要将键盘上键入字符的ASCIIASCII码转换为对应的二进制编码,码转换为对应的二进制编码,方法是与例方法是与例6.116.11相逆的过程。即:相逆的过程。即:“0”0”“9”9”的的ASCIIASCII码码(30H30H39H39H)减去)减去30H30H即是其对应的二进制数据;即是其对应的二进制数据;“A”A”“F”F”的的ASCIIASCII码(码(41H41H46H46H)减去)减去37H37H即是即是0AH0AH0FH0FH。v第第6 6章

29、章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社2 2二进制数据与二进制数据与BCDBCD数的相互转换数的相互转换 在程序设计中,经常遇到这样的问题:输入数据为在程序设计中,经常遇到这样的问题:输入数据为BCDBCD数,数,并且要进行算术运算,结果以并且要进行算术运算,结果以BCDBCD形式输出。此时可用形式输出。此时可用BCDBCD直直接运算的方法,但也可以首先将接运算的方法,但也可以首先将BCDBCD数转换为二进制数并以二数转换为二进制数并以二进制数据运算,结果再转换为进制数据运算,结果再转换为BCDBCD数输出。尤其是多字节数输出。尤其是

30、多字节BCDBCD数的运算,更适于使用这种方法。因此,二进制数据与数的运算,更适于使用这种方法。因此,二进制数据与BCDBCD数数之间的转换方法也是需要掌握的。下面首先看一下之间的转换方法也是需要掌握的。下面首先看一下BCDBCD数到二数到二进制数的转换方法。进制数的转换方法。v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.12 6.12 】在内存】在内存BUFFBUFF单元开始存放着一个单元开始存放着一个4 4个字节非压个字节非压缩的缩的BCDBCD数(高位数位于低地址),编程将其转换为二进制数,数(高位数位于低地

31、址),编程将其转换为二进制数,结果存入结果存入RSLTRSLT单元。单元。 分析:本题实际上就是将十进制数转换为二进制数,方分析:本题实际上就是将十进制数转换为二进制数,方法是将每位法是将每位BCDBCD数乘以其权所得到的乘积再累加起来,这就是数乘以其权所得到的乘积再累加起来,这就是所求的二进制结果。程序如下:所求的二进制结果。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 本题是非压缩的本题是非压缩的BCDBCD数转换为二进制数,该方法比较简数转换为二进制数,该方法比较简单,因为计算机运算的结果本身就是二进制,所以不

32、需经过单,因为计算机运算的结果本身就是二进制,所以不需经过专门的转换。本方法同样适用于压缩的专门的转换。本方法同样适用于压缩的BCDBCD数转换为二进制数转换为二进制数。当然,数。当然,BCDBCD数转换为二进制数也可以用其它的方法,如数转换为二进制数也可以用其它的方法,如除除2 2取余等。取余等。 至于二进制数转换为至于二进制数转换为BCDBCD数的方法,基本上是上面方法数的方法,基本上是上面方法的逆过程。即采用除的逆过程。即采用除1010取余或每位二进制数乘以其权所得到取余或每位二进制数乘以其权所得到的乘积再累加的方法。由于这些方法在前面已做过介绍,故的乘积再累加的方法。由于这些方法在前面

33、已做过介绍,故不再赘述。不再赘述。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社6.2.3 6.2.3 字符处理字符处理 随着计算机的发展,字符或字符串的处理越来越成为程序设计随着计算机的发展,字符或字符串的处理越来越成为程序设计的重要内容。在文字的处理、识别、翻译等领域,都会用到大量的的重要内容。在文字的处理、识别、翻译等领域,都会用到大量的字符处理,如字符的查找、比较、统计、拷贝、添加、删除等。字符处理,如字符的查找、比较、统计、拷贝、添加、删除等。 对于字符或字符串的操作,对于字符或字符串的操作,8

34、086/80888086/8088提供了专门的串操作指提供了专门的串操作指令。串操作指令一般使用令。串操作指令一般使用DSDS:SISI寻址源操作数,而用寻址源操作数,而用ESES:DIDI寻址目寻址目的操作数。在设定的操作数。在设定DFDF的值(的值(0 0或或1 1)后,地址指针会在指令执行完毕)后,地址指针会在指令执行完毕后自动增减。串操作指令前面加上重复段前缀后就可以对字符串自后自动增减。串操作指令前面加上重复段前缀后就可以对字符串自动进行操作。动进行操作。 在字符处理中串操作指令不是唯一的选择,我们也可以用其它在字符处理中串操作指令不是唯一的选择,我们也可以用其它的指令来替代串操作指

35、令,如传送类或比较类指令等。编程时可以的指令来替代串操作指令,如传送类或比较类指令等。编程时可以根据情况选择合适的指令。根据情况选择合适的指令。返回本节首页返回本节首页v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.13 6.13 】在以】在以BUFFBUFF为首地址的字缓冲区中存放着一个字符串,为首地址的字缓冲区中存放着一个字符串,以以“* *”作为结束,编程统计该字符串长度,结果保存到作为结束,编程统计该字符串长度,结果保存到LENTHLENTH单元。单元。 分析:本题只需用关键字符分析:本题只需用关键字符“*

36、*”依次与每一个字符进行比较,依次与每一个字符进行比较,遇到遇到“* *”结束比较。比较的次数就是字符串的长度。程序如下:结束比较。比较的次数就是字符串的长度。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 【例【例6.14 6.14 】自】自BUFFBUFF开始的内存单元中开始的内存单元中, ,存有一个存有一个ASCIIASCII码字符串,码字符串,长度为长度为COUNTCOUNT。统计其中含有多少个字符串。统计其中含有多少个字符串“OK”OK”,将统计的结果保,将统计的结果保存到存到RSLTRSLT单元。单元。 分

37、析:本题虽也属于字符串长度统计,但其统计对象是字符串分析:本题虽也属于字符串长度统计,但其统计对象是字符串中的一个子串中的一个子串“OK”OK”,因而要复杂一些。方法如下:首先在字符串,因而要复杂一些。方法如下:首先在字符串中寻找第一个字符中寻找第一个字符“O”O”,找到后再判断其相邻的下一个字符是否为,找到后再判断其相邻的下一个字符是否为“K”K”,是则统计一次;否则还要判断该字符是否为,是则统计一次;否则还要判断该字符是否为“O”O”,直至所,直至所有字符比较完毕。程序如下:有字符比较完毕。程序如下:v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编语言程序设计设计高等高等教教育出版社育出版社 本题一定要注意字符串中出现本题一定要注意字符串中出现“OOK”OOK”的情况,第一的情况,第一个字符为个字符为“O”O”,但第二个字符不是,但第二个字符不是“K”K”,此时一定要对,此时一定要对第二个字符再判断一次,看其是否为字符第二个字符再判断一次,看其是否为字符“O”O”,然后再判,然后再判断第三个字符是否为断第三个字符是否为“K”K”,依次类推。,依次类推。v第第6 6章章 数值与非数值程序设计数值与非数值程序设计汇编语汇编

温馨提示

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

评论

0/150

提交评论