简单应用程序的设计字符串处理

字符串是字符的一个序列,对字符串的操作包括复制检索,插入删除和替换等,为了便于对字符串进行有效的处理,8086和8088提供专门的用户处理字符串的指令,我们称之为字符串操作指令,简称串操作指令

在字符串操作指令中,一般由变址寄存器SI指向源操作数(串),由变址寄存器DI指向目的操作数,规定源串存放在当前数据段中,目的串存放在当前附加段中,也就是说

在涉及源操作数是,引用数据段寄存器DS,在涉及目的操作数时,引用附加段寄存器ES,换句话说,DS:SI指向源操作数,ES:DI指向目的操作数

串操作指令执行时会自动调整作为指针使用的寄存器SI或者DI的值,比如串操作的单元是字节的时候,调整值为1,如果穿操作数的寄存器是DS的时候,则调整是2,此外,字符串操作的方向有寄存器DF控制,当方向寄存器DF
= 0时,其递增方式调整SI或者DI,当方向寄存器DF = 1,按照递减的方式调整SI或者是DI

【1】字符串装入指令:(LOAD String)

字符串装入指令的格式如下:LODSB 装入字节

               LODSW 装入字

字符串装入指令只是把字符串中的一个字符转到累加器中,

字符装入指令LODSB把寄存器SI所指向的一个字节数据转到累加器AL中,然后根据方向寄存器DF复位或者置位,使SI的值增加1或者减少1,

他的指令类似于 MOV AL,[SI]

        INC SI或者DEC SI

字符装入指令LODSW把寄存器SI所指向的一个字数据转入到累加器AX中,然后根据方向寄存器DF复位或置位或使得SI的值增加2或者减少2

MOV AX,[SI]

ADD SI,2或SUB SI ,2

以后LODS 等价于LODSB和LODSW

【2】字符串存储指令(STOre String)

存储字节 STOSB

存储字 STOSW

字符串存储指令STOSB把累加器AL的内容送到寄存器DI所指向的存储单元中,然后根据方向标志寄存器判断方向

它类似于     MOV ES:[DI],AL

        INC DI,或者是ADD DI

同理,字符串存储指令STOSW把累加器AX的内容送到DI所指向的存储单元中然后根据方向标志寄存器判断方向

它类似于:    MOV ES:[DI],AX

        ADD DI,2  或者SUB DI,2

以后不加以区分,统一格式为STOS

例如程序片段:把当前数据段中便宜为1000H开始的100个字节的数据传送到便宜为2000H开始的单元中


CLD;清除方向标志(以便按照增值方式调整指针)
PUSH DS;保存当前数据段
PUSH ES;保存当前附加段
MOV SI,1000H;设置源操作数
MOV DI,2000H;设置目的操作数
MOV CX,100;统计循环次数
NEXT : LODSB;取出一个字节
STOSB;存取一个字节
LOOP NEXT;循环CX
POP ES;
POP DS;

字符串传送指令

MOVSB ;字节传送

MOVSW 字传送

直接传送指令MOVSB把寄存器SI所指向的一个字节的数据传送到由DI所指向的存储单元中,然后根据方向标志DF复位或者是置位,使得SI和DI分别增加1或者减少1

字传送字节MOVSW吧寄存器SI所指向的一个字的数据传送到DI所指向的一个字的存储单元中,然后根据方向标志DF复位或者置位,使得SI和DI分别增加2或者减少2

在汇编语言中MOVS OPRD1,OPRD2

两个稍作书的类型应该一致,汇编程序根据操作数的类型决定是字节传送还是字传送

上面程序片段完全可以用下列代替


CLD
PUSH DS
PUSH ES
MOV SI,1000H
MOV DI,2000H
MOV CX,100
NEXT:MOVSB
LOOP NEXT

现在循环体中只有哦一条传送指令,执行速度明显提高,在这个程序片段中,把100个字节的数据当作以字节为单元的字符串,所以利用了字节传送指令,如果把这100个字节的数据当作以字为单元的字符串,那么这个字符串也就只有50个单元了,于是循环次数还可以减少一半,执行速度还会提高

【5】字符串扫描指令(SCAn String)

字符串扫描指令的格式如下:SCANB;串字节扫描指令

             SCANW;串字扫描指令

串字节扫描指令SCANSB把累加器AL的内容与寄存器DI所指向的一个字节的内容相减进行比较,相减结果反映到有关标志寄存器(AF,CF,OF,PF,SF,ZF)

但不影响两个操作数,然后根据方向寄存器DF复位或者置位使得DI的值增加1或者减少1,

串字节扫描指令SCANSW把累加器AX的内容与由寄存器DI所指向的一个字节的内容相减 相减结果反映到有关标志寄存器(AF,CF,OF,PF,SF,ZF)

但不影响两个操作数,然后根据方向寄存器DF复位或者置位使得DI的值增加2或者减少2,

判断程序AL中的字节是否是十六进制


……………………
STRING DB ‘0123154657896356FSDAG‘
STRINGL EQU $ -STRING
……………………
CLD
MOV DX,SEG STRING
MOV ES,DX
MOV CX STRINGL
NEXT: SCANB
LOOPNZ NEXT
JNZ NOT_FOUND

FOUND:………………
NOT_FOUND:……………………

【6】字符串比较指令格式如下

CMPSB 串字节比较指令

CMPSW 串字比较指令

串字节比较指令CMPS把寄存器SI所指向的一个直接数据与有寄存器DI所指向的一个数据采用相互减的方式比较,比较的结果反映到有关标志位中,但不影响两个操作数

然后根据DF复位或者置位使SI和DI分别增加1或者减少1

在汇编语言中的统一格式为CMPS OPRD1,OPRD2

简单应用程序的设计字符串处理,布布扣,bubuko.com

时间: 2024-10-11 14:08:03

简单应用程序的设计字符串处理的相关文章

简单应用程序的设计 -重复前缀

重复前缀 由于串操作指令只能每次对字符串的一个字符进行处理,所以使用了一个循环,以便完成对整个字符串的处理,为了进一步提高效率,8086和8088还提供了重复指令前缀,重复指令前缀可以加载串操作指令指令之前,已达到重复执行其后串操作指令的目的 重复前缀REP REP用作为一个串操作指令的前缀,它重复其后面的串操作指令动作,每一次重复都先判断CX是否为0,如果为0 就结束重复,否则CX的值就减1,重复其后面的串操作指令,所以CX等于0 时,就不执行其后面的字符操作指令 重复前缀REP主要用在传送指

字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

原文:字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串 关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来讲第三篇,如何应用上面所学内容,设计一个字符串混淆程序. 先设计一个控制台程序,它是将要被我混淆的程序集文件: public static void Main() { try { RunSnippet(); } cat

一个简单的DELPHI程序注册码设计 .

当你辛辛苦苦用DELPHI做好了一个你认为十分不错的程序,你是否想把它发布出去成为共享软件呢  做为一个共享软件,注册码肯定是少不了的,你可以通过判断程序是否注册来进行功能,时间或一些其它限制.现在就介绍一种简单的注册码制造方法.思路是这样的:程序运行时先检测注册表,如果找到注册项,则表明已经注册,如果没有找到注册项,则提示要求注册. <注册例程>在DELPHI下新建一工程,放置Edit1,Edit2,Label1,Label2,Button1组件.具体代码如下:unit Unit1;inte

【小程序码 - 设计篇】菊花绽放

作者:lincolnlin,endyxu,changoran 2017 年四月,微信正式推出了小程序码.小程序码的使命及诞生的过程, 扫码背后藏了什么秘密?小程序码又为何长得像菊花? | 你问鹅答一文已经作过一番介绍.本文将为你剖析更多关于小程序码的技术细节. 小程序码的前世 初见小程序码,犹如一朵盛开的菊花. 其实这种脑洞大开的异形码并非微信首创,Facebook.kik.snapchat 等公司都研发了自己体系的码. 从设计的图形上,我们把上述方案简单分成: ? 平面类 如 qrcode ,

【MPI学习1】简单MPI程序示例

有了apue的基础,再看mpi程序多进程通信就稍微容易了一些,以下几个简单程序来自都志辉老师的那本MPI的书的第七章. 现在ubuntu上配置了一下mpich的环境: http://www.cnblogs.com/liyanwei/archive/2010/04/26/1721142.html 注意,为了编译运行方便,在~/.bashrc文件中添加mpi的两个环境变量 设置完之后注意执行source ~/.bashrc命令 程序1 计时功能 主要用到的MPI_Wtime()这个函数 1 #inc

1.2跑个简单的程序

1.程序编程风格 在写程序时,有个良好的编程习惯,对自己对别人都有好处.华为的编程规范就很不错,可以借鉴,没必要完全模仿.看别人代码往往是很折磨人的,如果自己的代码不用注释也能让别人清晰明确了解,不仅节约别人时间,也可以免去自己被打扰. a. 标识符的命名要清晰.明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解.尽可能给出描述性名称,不要节约空间,让别人很快理解你的码更重要.其中有些单词是大家公认的缩写,常用单词的缩写必须统一.协议中的单词的缩写与协议保持一致.对于

计算机科学及编程导论(3)迭代程序的设计与实现、遍历、元组

1. 迭代程序的设计:基础元素 迭代程序的实现,通常包括下了以下五个部分: 计数器(Count):用于标记循环的次数 初始化(Initiate):在循环外部进行初始化 正确的结束测试(Right End Test):在什么情况下结束通常与计数器(Count)密切相关 循环部分的代码块:该部分代码块通常包含了对计数器的改变 结束后程序应该做什么 2. 迭代程序的设计:流程图 在使用具体的代码实现之前,可以用流程图来组织程序. 举一个简单的例子,已经一个正整数的平方为X,要求这个正整数,可以设这个正

《Java项目实践》:简单聊天程序

<Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也就需要为Client写一个界面.因此,这就是我们第一步需要完成的任务. 第一步:为Client端写一个界面 完成一个界面有两种方法,一种是使用Frame对象来完成,另外一种是继承JFrame类来完成.本项目使用第二种. 第二种继承JFrame类完成的界面的程序如下: public class ChatClie

制作URL以GET方式提交的简单加密程序

首先我们用到的是 DESCryptoServiceProvider 类 对此微软给出的解释是 定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象.无法继承此类. 接下来是接受参数页面的方法: using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Text; using System.Web;