第5章汇编语言中的字符串代码转换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Biblioteka Baidu
2.字符串的比较
【例5-2】 编程比较内存中两个字符串:STR l和STR2,分别存 放在不同单元,以00H作为结束标志。将比较结果存于FLAG单元。 如果两串相等,FLAG为0;如果STR l>STR 2,则FLAG为1;如果 STR 1< STR 2,则FLAG为FFH。 • 分析问题:由题意可知,实际上试比较两个字符串的ASCII码值 。方法:按给定 字符串的首地址,将两个字符串的相应字符逐个比较,找出第一 个不同字符。若未找到,则串相等;否则,根据不同字符的ASCII 码,决定哪个串大。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度,这 和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII 码值是否大于00H,以此作为判定循环结束的控制条件。本题用 JMP指令实现循环。
(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)该指令不影响标志位。
(1) 重复前缀指令REP(或REPE、REPZ、REPNE、REPNZ) 格式:REP strpri(strpri为串操作指令) 功能:运用该指令,先要设置重复操作次数于CX之中。每执行一 次,CX减1,直到CX = 0时,只要(CX) ≠ 0,就继续执行。 说明:REPE、REPZ、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)该指令不影响标志位。
返回本节
例题:
1.求字符串的串长
【例5-1】内存STR单元中存放一字符串,结尾用00H作标记。 编程求其串长并存入LEN单元。 • 分析问题:由题意可知,只需按给定字符串的首地址,逐个 与00H比较,若不是, 则字符串长度计数器加1。若是,则将结果存于LEN单元。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度 ,这和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的 ASCII码值是否大于00H,以此作为判定循环结束的控制条件。本 题用JMP指令实现循环。
4. CMPS串比较指令
格式:可有三种 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分别自动加/减2。 2)该指令影响SF、ZF、AF、PF、CF和OF标志位。
•画程序流程图:略。解题步骤如下: (1)取串首地址作指针; (2)设置计数器,供计算串长之用; (3)指针指向内容为00H ? 是,转6; (4)计数器加1,指针加1; (5)转3; (6)保存计数结果; (7)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义2个变量:一个字符串变量STR ,实际上是一个数组变量,每个字符的ASCII码为(7+1)位数, 应选DB 类型。用寄存器SI定位。还有一个变量LEN,定义为存放 字符串长度的存储单元,8位数已足够,选DB类型。其中间结果放 在寄存器AL。
2.串操作指令
串操作指令完成对字符串的各种操作,操作是对一个一个字 符(称为元素)而言的。因此,每一次操作都是针对一个字或一 个字节进行的。 其寻址方式多采用隐含寻址,源串元素固定使用 SI,通常在现行的数据段,隐含段寄存器DS,但也允许段超越。 目的串元素固定使用DI,隐含段寄存器ES,不允许段超越。在每 次基本操作后,能够借助方向标志DF,自动修改地址指针。为下 一次操作作准备。 当DF=0时,地址指针增量,即字节操作时,地址指针加1;字操 作时,地址指针加2。当DF=1时,地址指针减量,即字节操作时, 地址指针减1;字操作时,地址指针减2。 为此,8086处理器有两条方向标志指令: CLD(Clear Direction flag):置DF=0; STD (Set Direction flag ):置DF=1; 串操作是通过加重复前缀实现的,每次操作只对一个字或一个字 符。为此,我们先讲重复前缀指令REP。
3.LODS取串指令
格式:可有三种 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)该指令不影响标志位。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC和 JMP等指令。最后要返回DOS。未想到的,在编写过程中随时添加 ,如XOR指令等。 具体程序如下: DATA SEGMENT STR DB ’I live in Anshan’,00H ;定义字符串STR,以00H结 束 LEN DB ? ;定义存放字符串长度的存储单元LEN DATA ENDS CODE SEGMENT ASSUME CS:CSEG,DS:DSEG START: SLEN: MOV AX,DATA MOV DS,AX ;数据段初始化 LEA SI,STR ;取字符串起始偏移地址送寄存器SI,定位 XOR AL,AL ;字符串长度计数器AL清0
返回本节
字符串所能包含的字符,依赖于具体机器的字符集。目前世 界上应用最广的字符集是ASCII码字符集。 存储字符串的方法也就是存储列表的一般方法。最简单最普遍的 方法是顺序存储,还有链接存储等,这里仅讨论顺序存储的字符 串。 字符串的表示在8086/8088宏汇编语言中,可以借助数据定义语 句DB(因一个ASCII码是7位)来定义,字符串的特征表示一般有 两种,一种是在字符串的尾部用00H作标记,另一种是在字符串的 前面空出一个单元,放置字符串的长度。例: STRI DB ’ I am a student’,0 STR2 DB 4,’ABCD’
5.1.2 字符串运算
对字符串的基本运算有: (1) 求字符串的串长 (2) 字符串的比较 (3) 字符串的连接 (4) 取子字符串 (5) 取子字符串序号 除以上基本运算外,还有以下基本运算的组合运算: (1)插入 (2)删除 (3)查找并替换 上述运算对字符串而言都是基本的,在引进字符串变量的高级语言 中,一般都作为基本运算或基本内部函数来提供。下面举例说明字 符串运算在汇编语言一级上的实现。
•画程序流程图:略。解题步骤如下: (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)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义4个变量:两个字符串变量STR 1和STR 2,实际上是两个数组变量,每个字符的ASCII码为(7+1 )位数,应选DB 类型。分别用寄存器SI和BX定位。还有两个变量 FLAG 和LEN,分别定义为结果标志和存放字符串长度的存储单元 ,8位数已足够,选DB类型。其中间结果放在寄存器AH、AL,CH 、CL。
第 5章 汇编语言程序中的字符串、代码转换 与列表
5.1 汇编语言的字符串
5.2 数据的分类和统计程序
开 始
5.1 汇编语言的字符串
5.1.1字符串及其操作指令 5.1.2 字符串的运算
返回本章目录
5.1.1字符串及其操作指令
1.字符串的定义及表示方法
现代计算机应用中,字符串在编辑加工,词法分析,符号处理 等方面得到越来越广泛的应用。在设计具体的应用程序中,亦经常 要使用各种字符串。因此,在非数值的数据处理过程中,字符及字 符串的处理是一个重要的方面。 一般地讲,字符串指一串字符,或者说,是字符的有限序列。如 :6AN7BH,用ASCII码表示,并存储在连续的存储单元中,每个 字符占一个字或一个字节。用比较专业的术语来说,字符串是一种 特殊的线性表,它的数据元素仅由一个字符组成。 一个字符串中包含的字符个数,称为这个字符串的长度。长度为 零的字符串称为空串,它不包含任何字符。字符串通常用单引号或 双引号括起来,例如: (1) ” X1 ” (2) ’ABC’
LOP: CMP BYTE PTR[SI],00H ;逐个比较字符串的每个字符, 看其的ASCII 值是否大于00H,以此判定串结束与否 JZ DONE ;若不大于00H,而是等于,则转DONE语句 INC AL ;AL ←AL +1,计数器AL累加 INC SI ;SI ←SI+1,移到下一个字符 JMP LOP ;跳到LOP语句循环 DONE:MOV LEN,AL ;保存结果 MOV AH,4CH INT 21H CODE ENDS END SLEN 计算串长的程序也可以通过串搜索指令来实现,程序会更简洁,读 者可自己试写出程序。
5. SCAS串搜索指令
格式:可有三种 SCAS DST;源串隐含在由DS:AL或DS:AX指定的存储单元, 目的串隐含在由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标志位。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC 、DEC和JMP等指 令。最后要返回DOS。未想到的,在编写过程中随时添加, 如XOR指令等。 具体程序如下: DATA SEGMENT STR l DB ’I am a student’,00H STR2 DB ’I AM A STUDENT’,00H FLAG DB ? LEN DB ? DATA ENDS CODE SEGMENT ASSUME DS:DSEG,CS:CODE
2.字符串的比较
【例5-2】 编程比较内存中两个字符串:STR l和STR2,分别存 放在不同单元,以00H作为结束标志。将比较结果存于FLAG单元。 如果两串相等,FLAG为0;如果STR l>STR 2,则FLAG为1;如果 STR 1< STR 2,则FLAG为FFH。 • 分析问题:由题意可知,实际上试比较两个字符串的ASCII码值 。方法:按给定 字符串的首地址,将两个字符串的相应字符逐个比较,找出第一 个不同字符。若未找到,则串相等;否则,根据不同字符的ASCII 码,决定哪个串大。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度,这 和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的ASCII 码值是否大于00H,以此作为判定循环结束的控制条件。本题用 JMP指令实现循环。
(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)该指令不影响标志位。
(1) 重复前缀指令REP(或REPE、REPZ、REPNE、REPNZ) 格式:REP strpri(strpri为串操作指令) 功能:运用该指令,先要设置重复操作次数于CX之中。每执行一 次,CX减1,直到CX = 0时,只要(CX) ≠ 0,就继续执行。 说明:REPE、REPZ、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)该指令不影响标志位。
返回本节
例题:
1.求字符串的串长
【例5-1】内存STR单元中存放一字符串,结尾用00H作标记。 编程求其串长并存入LEN单元。 • 分析问题:由题意可知,只需按给定字符串的首地址,逐个 与00H比较,若不是, 则字符串长度计数器加1。若是,则将结果存于LEN单元。 • 确定算法: 采用比较循环指令,循环次数要数字符串的长度 ,这和本题的目标相 同,编写程序就失去意义。故用逐个比较法,看字符其的 ASCII码值是否大于00H,以此作为判定循环结束的控制条件。本 题用JMP指令实现循环。
4. CMPS串比较指令
格式:可有三种 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分别自动加/减2。 2)该指令影响SF、ZF、AF、PF、CF和OF标志位。
•画程序流程图:略。解题步骤如下: (1)取串首地址作指针; (2)设置计数器,供计算串长之用; (3)指针指向内容为00H ? 是,转6; (4)计数器加1,指针加1; (5)转3; (6)保存计数结果; (7)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义2个变量:一个字符串变量STR ,实际上是一个数组变量,每个字符的ASCII码为(7+1)位数, 应选DB 类型。用寄存器SI定位。还有一个变量LEN,定义为存放 字符串长度的存储单元,8位数已足够,选DB类型。其中间结果放 在寄存器AL。
2.串操作指令
串操作指令完成对字符串的各种操作,操作是对一个一个字 符(称为元素)而言的。因此,每一次操作都是针对一个字或一 个字节进行的。 其寻址方式多采用隐含寻址,源串元素固定使用 SI,通常在现行的数据段,隐含段寄存器DS,但也允许段超越。 目的串元素固定使用DI,隐含段寄存器ES,不允许段超越。在每 次基本操作后,能够借助方向标志DF,自动修改地址指针。为下 一次操作作准备。 当DF=0时,地址指针增量,即字节操作时,地址指针加1;字操 作时,地址指针加2。当DF=1时,地址指针减量,即字节操作时, 地址指针减1;字操作时,地址指针减2。 为此,8086处理器有两条方向标志指令: CLD(Clear Direction flag):置DF=0; STD (Set Direction flag ):置DF=1; 串操作是通过加重复前缀实现的,每次操作只对一个字或一个字 符。为此,我们先讲重复前缀指令REP。
3.LODS取串指令
格式:可有三种 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)该指令不影响标志位。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC和 JMP等指令。最后要返回DOS。未想到的,在编写过程中随时添加 ,如XOR指令等。 具体程序如下: DATA SEGMENT STR DB ’I live in Anshan’,00H ;定义字符串STR,以00H结 束 LEN DB ? ;定义存放字符串长度的存储单元LEN DATA ENDS CODE SEGMENT ASSUME CS:CSEG,DS:DSEG START: SLEN: MOV AX,DATA MOV DS,AX ;数据段初始化 LEA SI,STR ;取字符串起始偏移地址送寄存器SI,定位 XOR AL,AL ;字符串长度计数器AL清0
返回本节
字符串所能包含的字符,依赖于具体机器的字符集。目前世 界上应用最广的字符集是ASCII码字符集。 存储字符串的方法也就是存储列表的一般方法。最简单最普遍的 方法是顺序存储,还有链接存储等,这里仅讨论顺序存储的字符 串。 字符串的表示在8086/8088宏汇编语言中,可以借助数据定义语 句DB(因一个ASCII码是7位)来定义,字符串的特征表示一般有 两种,一种是在字符串的尾部用00H作标记,另一种是在字符串的 前面空出一个单元,放置字符串的长度。例: STRI DB ’ I am a student’,0 STR2 DB 4,’ABCD’
5.1.2 字符串运算
对字符串的基本运算有: (1) 求字符串的串长 (2) 字符串的比较 (3) 字符串的连接 (4) 取子字符串 (5) 取子字符串序号 除以上基本运算外,还有以下基本运算的组合运算: (1)插入 (2)删除 (3)查找并替换 上述运算对字符串而言都是基本的,在引进字符串变量的高级语言 中,一般都作为基本运算或基本内部函数来提供。下面举例说明字 符串运算在汇编语言一级上的实现。
•画程序流程图:略。解题步骤如下: (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)结束。 •确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架 至少要两个段: 数据段和代码段。数据段中至少定义4个变量:两个字符串变量STR 1和STR 2,实际上是两个数组变量,每个字符的ASCII码为(7+1 )位数,应选DB 类型。分别用寄存器SI和BX定位。还有两个变量 FLAG 和LEN,分别定义为结果标志和存放字符串长度的存储单元 ,8位数已足够,选DB类型。其中间结果放在寄存器AH、AL,CH 、CL。
第 5章 汇编语言程序中的字符串、代码转换 与列表
5.1 汇编语言的字符串
5.2 数据的分类和统计程序
开 始
5.1 汇编语言的字符串
5.1.1字符串及其操作指令 5.1.2 字符串的运算
返回本章目录
5.1.1字符串及其操作指令
1.字符串的定义及表示方法
现代计算机应用中,字符串在编辑加工,词法分析,符号处理 等方面得到越来越广泛的应用。在设计具体的应用程序中,亦经常 要使用各种字符串。因此,在非数值的数据处理过程中,字符及字 符串的处理是一个重要的方面。 一般地讲,字符串指一串字符,或者说,是字符的有限序列。如 :6AN7BH,用ASCII码表示,并存储在连续的存储单元中,每个 字符占一个字或一个字节。用比较专业的术语来说,字符串是一种 特殊的线性表,它的数据元素仅由一个字符组成。 一个字符串中包含的字符个数,称为这个字符串的长度。长度为 零的字符串称为空串,它不包含任何字符。字符串通常用单引号或 双引号括起来,例如: (1) ” X1 ” (2) ’ABC’
LOP: CMP BYTE PTR[SI],00H ;逐个比较字符串的每个字符, 看其的ASCII 值是否大于00H,以此判定串结束与否 JZ DONE ;若不大于00H,而是等于,则转DONE语句 INC AL ;AL ←AL +1,计数器AL累加 INC SI ;SI ←SI+1,移到下一个字符 JMP LOP ;跳到LOP语句循环 DONE:MOV LEN,AL ;保存结果 MOV AH,4CH INT 21H CODE ENDS END SLEN 计算串长的程序也可以通过串搜索指令来实现,程序会更简洁,读 者可自己试写出程序。
5. SCAS串搜索指令
格式:可有三种 SCAS DST;源串隐含在由DS:AL或DS:AX指定的存储单元, 目的串隐含在由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标志位。
• 编写程序,可以想得到,需要MOV、LEA 、CMP 、JZ、INC 、DEC和JMP等指 令。最后要返回DOS。未想到的,在编写过程中随时添加, 如XOR指令等。 具体程序如下: DATA SEGMENT STR l DB ’I am a student’,00H STR2 DB ’I AM A STUDENT’,00H FLAG DB ? LEN DB ? DATA ENDS CODE SEGMENT ASSUME DS:DSEG,CS:CODE