汇编语言中的字符串、代码转换.ppt
《汇编语言中的字符串、代码转换.ppt》由会员分享,可在线阅读,更多相关《汇编语言中的字符串、代码转换.ppt(62页珍藏版)》请在三一办公上搜索。
1、第5章 汇编语言程序中的字符串、代码转换与列表,开 始,5.1 汇编语言的字符串5.2 数据的分类和统计程序,返回本章目录,5.1 汇编语言的字符串,字符串及其操作指令5.1.2 字符串的运算,返回本节,1.字符串的定义及表示方法,现代计算机应用中,字符串在编辑加工,词法分析,符号处理等方面得到越来越广泛的应用。在设计具体的应用程序中,亦经常要使用各种字符串。因此,在非数值的数据处理过程中,字符及字符串的处理是一个重要的方面。一般地讲,字符串指一串字符,或者说,是字符的有限序列。如:6AN7BH,用ASCII码表示,并存储在连续的存储单元中,每个字符占一个字或一个字节。用比较专业的术语来说,字
2、符串是一种特殊的线性表,它的数据元素仅由一个字符组成。一个字符串中包含的字符个数,称为这个字符串的长度。长度为零的字符串称为空串,它不包含任何字符。字符串通常用单引号或双引号括起来,例如:(1)”X1”(2)ABC,字符串及其操作指令,字符串所能包含的字符,依赖于具体机器的字符集。目前世界上应用最广的字符集是ASCII码字符集。存储字符串的方法也就是存储列表的一般方法。最简单最普遍的方法是顺序存储,还有链接存储等,这里仅讨论顺序存储的字符串。字符串的表示在80868088宏汇编语言中,可以借助数据定义语句DB(因一个ASCII码是7位)来定义,字符串的特征表示一般有两种,一种是在字符串的尾部用
3、00H作标记,另一种是在字符串的前面空出一个单元,放置字符串的长度。例:STRI DB I am a student,0STR2 DB 4,ABCD,2.串操作指令,串操作指令完成对字符串的各种操作,操作是对一个一个字符(称为元素)而言的。因此,每一次操作都是针对一个字或一个字节进行的。其寻址方式多采用隐含寻址,源串元素固定使用SI,通常在现行的数据段,隐含段寄存器DS,但也允许段超越。目的串元素固定使用DI,隐含段寄存器ES,不允许段超越。在每次基本操作后,能够借助方向标志DF,自动修改地址指针。为下一次操作作准备。当DF0时,地址指针增量,即字节操作时,地址指针加1;字操作时,地址指针加2
4、。当DF1时,地址指针减量,即字节操作时,地址指针减1;字操作时,地址指针减2。为此,8086处理器有两条方向标志指令:CLD(Clear Direction flag):置DF0;STD(Set Direction flag):置DF1;串操作是通过加重复前缀实现的,每次操作只对一个字或一个字符。为此,我们先讲重复前缀指令REP。,(1)重复前缀指令REP(或REPE、REPZ、REPNE、REPNZ)格式:REP strpri(strpri为串操作指令)功能:运用该指令,先要设置重复操作次数于CX之中。每执行一次,CX减1,直到CX=0时,只要(CX)0,就继续执行。说明:REPE、REP
5、Z、REPNE、REPNZ分别表示如满足条件(上一步的结果:相等;为0;不相等;不为0),则继续执行。(2)MOVS串传送指令格式:可有三种MOVS DST,SRC;DST代表目的串元素,SRC代表源串元素MOVSB(字节);8位字符串操作,省略源串和目的串不写MOVSW(字);16位字符串操作,省略源串和目的串不写功能:该指令可以把由SI指向的数据段DS中的一个字(或字节)送到由DI指向的附加段ES中的一个字(或字节,目的串)中去,同时根据方向标志DF及数据格式(字或字节)对SI和DI进行修改。说明:1)如果是字节操作,则SI与DI变化时是1;如果是字操作,则SI与DI变化时是2。2)该指令
6、不影响标志位。,(3)STOS存入串指令 格式:STOS DST;源串元素隐含在AL或AX,目的串元素由ES:DI指定STOSB(字节);8位字符串操作,省略源串和目的串不写STOSW(字);16位字符串操作,省略源串和目的串不写功能:该指令把AL或AX的内容(源串元素)存入由DI指定的附加段ES的某单元(目的串元素)中,并根据DF的值及数据类型修改DI的内容。说明:1)如果是字节操作则先将AL的内容存入DI指定的附加段的某单元DI中,然后DI再自加/减1;如果是字操作则将AX的内容存入DI指定的附加段的某单元DI,然后DI再自加/减2。2)该指令不影响标志位。,3LODS取串指令,格式:可有
7、三种LODS SRC;源串元素由DS:SI指定的存储单元,目的串元素隐含在由DS:AL或DS:AX指定的存储单元LODSB;8位字符串操作,省略源串和目的串不写 LODSW;16位字符串操作,省略源串和目的串不写功能:该指令把由SI指定的数据段中某单元SI的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容。说明:1)如果是字节操作则先将由SI指定的单元内容送入AL中,然后SI再自加/减1;如果是字操作则将SI送入AX,然后SI再自加/减2。2)该指令不影响标志位。,5.SCAS串搜索指令,格式:可有三种SCAS DST;源串隐含在由DS:AL或DS:AX指定的存储单元,目的串隐含在
8、由ES:DI指定的存储单元SCASB;8位字符串操作,省略源串和目的串不写SCASW;16位字符串操作,省略源串和目的串不写功能:该指令把AL(或AX)的内容与由DI指定的在附加段中的一个字节(或字)相减,但不保存结果,只根据结果置条件码。(CX)0,ZF=0,表示字符串未比较完,且已比较的字符元素不相同,尚未找到完全相同的字符串元素,还要继续比较。直到(CX)=0,ZF=1为止)。说明:1)每次操作后,自动修改SI和DI。如果是字操作,则SI和DI分别自动加/减1;如果是字操作,则SI和DI分别自动加/减2。2)该指令影响SF、ZF、AF、PF、CF和OF标志位。,4.CMPS串比较指令,格
9、式:可有三种CMPS SRC,DST;源串元素在由DS:SI指定的存储单元,目的串元素在由ES:DI指定的存储单元CMPSB;8位字符串操作,省略源串和目的串不写CMPSW;16位字符串操作,省略源串和目的串不写功能:指令把由SI指向的数据段中的一个字(或字节)与由DI指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果置条件码(CX)0,ZF=1,表示字符串未比较完,且已比较的字符段完全相同,尚未找到不同之处,还要继续比较。直到(CX)=0,ZF=0为止)。说明:1)每次操作后,自动修改SI和DI。如果是字操作,则SI和DI分别自动加/减1;如果是字操作,则SI和DI分别自动加/减
10、2。2)该指令影响SF、ZF、AF、PF、CF和OF标志位。,5.1.2 字符串运算,对字符串的基本运算有:(1)求字符串的串长(2)字符串的比较(3)字符串的连接(4)取子字符串(5)取子字符串序号除以上基本运算外,还有以下基本运算的组合运算:(1)插入(2)删除(3)查找并替换上述运算对字符串而言都是基本的,在引进字符串变量的高级语言中,一般都作为基本运算或基本内部函数来提供。下面举例说明字符串运算在汇编语言一级上的实现。,返回本节,例题:,1.求字符串的串长,【例5-1】内存STR单元中存放一字符串,结尾用00H作标记。编程求其串长并存入LEN单元。分析问题:由题意可知,只需按给定字符串
11、的首地址,逐个与00H比较,若不是,则字符串长度计数器加1。若是,则将结果存于LEN单元。确定算法:采用比较循环指令,循环次数要数字符串的长度,这和本题的目标相同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII码值是否大于00H,以此作为判定循环结束的控制条件。本题用JMP指令实现循环。,编写程序,可以想得到,需要MOV、LEA、CMP、JZ、INC和JMP等指令。最后要返回DOS。未想到的,在编写过程中随时添加,如XOR指令等。具体程序如下:DATA SEGMENTSTR DB I live in Anshan,00H;定义字符串STR,以00H结束LEN DB?;定义存放字符串长
12、度的存储单元LENDATA ENDSCODE SEGMENT ASSUME CS:CSEG,DS:DSEGSTART:SLEN:MOV AX,DATA MOV DS,AX;数据段初始化LEA SI,STR;取字符串起始偏移地址送寄存器SI,定位XOR AL,AL;字符串长度计数器AL清0,画程序流程图:略。解题步骤如下:(1)取串首地址作指针;(2)设置计数器,供计算串长之用;(3)指针指向内容为00H?是,转6;(4)计数器加1,指针加1;(5)转3;(6)保存计数结果;(7)结束。确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义2个变
13、量:一个字符串变量STR,实际上是一个数组变量,每个字符的ASCII码为(71)位数,应选DB 类型。用寄存器SI定位。还有一个变量LEN,定义为存放字符串长度的存储单元,8位数已足够,选DB类型。其中间结果放在寄存器AL。,LOP:CMP BYTE PTRSI,00H;逐个比较字符串的每个字符,看其的ASCII值是否大于00H,以此判定串结束与否 JZ DONE;若不大于00H,而是等于,则转DONE语句INC AL;AL AL 1,计数器AL累加 INC SI;SI SI1,移到下一个字符JMP LOP;跳到LOP语句循环 DONE:MOV LEN,AL;保存结果MOV AH,4CHINT
14、 21HCODE ENDSEND SLEN计算串长的程序也可以通过串搜索指令来实现,程序会更简洁,读者可自己试写出程序。,2.字符串的比较,【例5-2】编程比较内存中两个字符串:STR l和STR2,分别存放在不同单元,以00H作为结束标志。将比较结果存于FLAG单元。如果两串相等,FLAG为0;如果STR lSTR 2,则FLAG为1;如果STR 1 STR 2,则FLAG为FFH。分析问题:由题意可知,实际上试比较两个字符串的ASCII码值。方法:按给定字符串的首地址,将两个字符串的相应字符逐个比较,找出第一个不同字符。若未找到,则串相等;否则,根据不同字符的ASCII码,决定哪个串大。确
15、定算法:采用比较循环指令,循环次数要数字符串的长度,这和本题的目标相同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII码值是否大于00H,以此作为判定循环结束的控制条件。本题用JMP指令实现循环。,画程序流程图:略。解题步骤如下:(1)设置串首址指针1和指针2;(2)置FLAG单元为0;(3)串1或串2结束吗?是,转8;(4)指针1指向内容等于指针2指向内容?否,转7;(5)指针1和指针2;0IJl;(6)转(3);(7)若指针1指向内容指针2指向内容?则FLAG为1,否则为FFH;(8)结束。确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数
16、据段中至少定义4个变量:两个字符串变量STR 1和STR 2,实际上是两个数组变量,每个字符的ASCII码为(71)位数,应选DB 类型。分别用寄存器SI和BX定位。还有两个变量FLAG 和LEN,分别定义为结果标志和存放字符串长度的存储单元,8位数已足够,选DB类型。其中间结果放在寄存器AH、AL,CH、CL。,编写程序,可以想得到,需要MOV、LEA、CMP、JZ、INC、DEC和JMP等指令。最后要返回DOS。未想到的,在编写过程中随时添加,如XOR指令等。具体程序如下:DATA SEGMENTSTR l DB I am a student,00HSTR2 DB I AM A STUDE
17、NT,00HFLAG DB?LEN DB?DATA ENDS CODE SEGMENTASSUME DS:DSEG,CS:CODE,START:MOV AX,DATAMOV DS,AX;数据段初始化LEA SI,STR 1;取串1起始偏移地址送寄存器SI,即设置串1首址指针1 LEA BX,STR2;取串2起始偏移地址送寄存器BX,即设置串2首址指针2 MOV FLAG,0;置FLAG单元为0MOV CL,0;寄存器CL清零 LOP:XOR AX,AX;寄存器AX清零CMP SI,AL;比较串1的第一个字符和0,是零吗?JZ DONE l;是零,转DONE lMOV AH,1;不是零,置未结束
18、标志“1”DONE l:CMP BX,CL;比较串2的第一个字符和0,是零吗?JZ DONE2;是零,转DONE 2MOV AL,1;不是零,置未结束标志“1”,DONE2:OR AH,AL;将AH和AL作“或运算”JZ DONE;如果是零,串1和串2均结束,转DONE语句 MOV CH,SI;送串1的第一个字符到寄存器CHCMP CH,BX;比较串1的第一个字符和串2的第一个字符JNZ DONE3;二者不等,转DONE3语句INC SI;SI SI1,SI指向串1的下一个字符INC BX;BX BX1,SI指向串2的下一个字符JMP LOP;跳到LOP语句DONE3:JA DONE4;串1的
19、码值 串2的码值,转DONE4语句DEC FLAG;否则,FLAGFFH,置小于标志“1”,即FFHJMP DONE;跳到DONE,结束DONE4:INC FLAG;FLAG01H,置大于标志DONE:MOV AH,4CHINT 21HCODE ENDSEND START本程序亦可以用串比较指令实现,请读者思考一下。然后看下例,【例5-3】设STRING 1是DS段中的一个50字节字符串,STRING 2是ES段中的一个50字节字符串,比较这两个字符串是否完全一样。若完全一样,置字节单元RESULT为0,否则,置字节单元RESULT为FFH。程序段如下:LEA SI,STRING 1;将源串首
20、地址送SILEA DI,STRING 2;将目的串首地址送DIMOV CX,50;将寄存器CX作为计数器,送比较次数到CXCLD;使DF0,地址指针按增量方向修改REPZ CMPSB;比较两个字符串,重复操作CMPSB。如果相等,则继续比较下一个字节,SI和DI分别加1,CX减1JZ EQUAL;如果两个字符串相等,则转移到EQUAL语句MOV RESULT,0FFH;如果两个字符串不相等,则RESULT置0FFHJMP EXIT;转移至EXIT语句EQUAL:MOV RESULT,0;如果两个字符串相等,则将RESULT置0EXIT:HLT;停止,3.字符串的迁移,【例5-4】在数据段中有一
21、个字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中。分析问题:题意很明白,将一个字符串,从数据段传送到附加段中。是一个反复传送操作。确定算法:采用重复送字符串操作,本题用REP MOVSB指令实现。画程序流程图:略。确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要三个段:数据段、扩展段和代码段。数据段和扩展段中各定义1个字符串变量MESS 1和MESS 2,实际上是两个数组变量,每个字符的ASCII码为(71)位数,应选DB 类型。分别用寄存器SI和DI定位。设MESS l为源串,放在数据段中从符号地址MESS l开始的存储区内,每个字符占有一个字节;MESS 2为
22、目的串,只能存放在附加段中从符号地址MESS 2开始空出17个字节的存储区内。程序则存放在代码段中。,编写程序,可以想得到,需要MOV、LEA、CLD和REP MOVSB等指令。最后要返回DOS。编制程序如下所示。DATA SEGMENT;定义数据段MESS 1 DB PERSONAL COMPUTER$;定义字符串,字节变量DATA ENDS;数据段结束EXTRA SEGMENT;定义扩展段MESS2 DB 17 DUP(?);定义17个字节的存储区EXTRA ENDS;扩展段结束CODE SEGMENT;定义代码段ASSUME CS:CODE,DS:DATAREA,ES:EXTRA;指定代
23、码段、数据段及扩展段的段地址寄存器,START:MOV AX,DATA;送数据段首地址到AXMOV DS,AX;将AX内容送段寄存器DS。这两句共同完成“送数据段首地址到DS”MOV AX,EXTRA;MOV ES AX;这两句共同完成“送扩展段首地址到ES”LEA SI,MESS1;送MESS 1的符号地址到SI,使CPU找到源串地址LEA DI,MESS2;送MESS2的符号地址到SI,使CPU找到目的串地址MOV CX,17;使CX17,CX当计数器使用CLD;使DF0,方向标志清0,重复操作时,SI、DI自动加1,REP MOVSB;重复送字符串操作,将源串字符MESS l送到目的串M
24、ESS2的操作,直到CX0为止CODE ENDS;代码段结束 END START,4.在字符串中查找字符,【例5-5】在BLOOCK开始的数据块(假设在数据段)中查找字母“M”,如未找到,记寄存器DI0;如果找到了,在DI中存放查找次数,并将“M”字符所在位置存放在POINTER存储单元。DATA SEGMENT;定义数据段BLOOCK DB 64H;定义数据块CHAR DB M;定义字符,字节变量POINTER DD?;COUNT DB 64H;预置查找次数,一般设为数据块的总字符数,这里设为100。DATA ENDS;数据段结束 CODE SEGMENT ASSUME CS:CODE,DS
25、:DATAREA,START:MOV AX,DATA;MOV DS,AX;送数据段首地址到DSMOV ES,AX;送扩展段首地址到ESMOV DI,OFFSET BLOOCK;送数据块BLOOCK的偏移地址到寄存器DIMOV CX,COUNT 将CX当计数器使用,预置查找次数COUNTMOV AL,“M”;将字符“M”ASCII码送寄存器ALCLD;使DF0,方向标志清0,DI自动递增1REPNE SCASB;SCASB把AL的内容与由DI指定的在附加段中的一个字节进行比较,但不保存结果,只根据结果置条件码ZF。CXCX1,CX0且ZF0时,重复操作字符串搜索指令SCASB,直到CX0(全部搜
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 中的 字符串 代码 转换

链接地址:https://www.31ppt.com/p-6586382.html