(11)字符串操作指令

字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的。字符串操作指令可对内存单元按字节、字或双字进行处理,并能根据操作对象的字节数使变址寄存器SI(和DI)增减1、2或4。具体规定如下:

(1)、当DF=0时,变址寄存器SI(和DI)增加1、2或4;

(2)、当DF=1时,变址寄存器SI(和DI)减少1、2或4。

在后面各指令中,有关变址寄存器都按上述规定进行增减,不再一一说明。

1、取字符串数据指令(Load String Instruction)

从由指针DS:SI所指向的内存单元开始,一个字节、字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

指令的格式:LODS 地址表达式

LODSB/LODSW

LODSD ;80386+

在指令LODS中,它会根据其地址表达式的属性来决定读取一个字节、字或双字。即:当该地址表达式的属性为字节、字或双字时,将从指针DS:SI处读一个字节到AL中,或读一个字到AX,或读一个双字到EAX中,与此同时,SI还将分别增减1,2或4。

其它字符串指令中的“地址表达式”作用与此类似,将不再说明。

2、置字符串数据指令(Store String Instruction)

该指令是把寄存器AL、AX或EAX中的值存于以指针ES:DI所指向内存单元为起始的一片存储单元里,并根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

指令的格式:STOS 地址表达式

STOSB/STOSW

STOSD ;80386+

3、字符串传送指令(Move String Instruction)

该指令是把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向内存单元,并根据标志位DF对寄存器DI和SI作相应增减。该指令的执行不影响任何标志位。

指令的格式:MOVS 地址表达式1, 地址表达式2

MOVSB/MOVSW

MOVSD ;80386+

4、输入字符串指令(Input String Instruction)

该指令是从某一指定的端口接受一个字符串,并存入一片存储单元之中。输入端口由DX指定,存储单元的首地址和读入数据的个数分别由ES:DI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

与指令有关的操作数ES、DI、DX和CX等都是隐含操作数。

指令的格式:INS 地址表达式

INSB/INSW

INSD ;80286+

5、输出字符串指令(Output String Instruction)

该指令是把一个字符串输入到指定的输出端口中。输出端口由DX指定,其输出数据的首地址和个数分别由DS:SI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

与指令有关的操作数DS、SI、DX和CX等都是隐含操作数。

指令的格式:OUTS 地址表达式

OUTSB/OUTSW

OUTSD ;80286+

6、字符串比较指令(Compare String Instruction)

该指令是把指针DS:SI和ES:DI所指向字节、字或双字的值相减,并用所得到的差来设置有关的标志位。与此同时,变址寄存器SI和DI也将根据标志位DF的值作相应增减。

指令的格式:CMPS 地址表达式1, 地址表达式2

CMPSB/CMPSW

CMPSD ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF

7、字符串扫描指令(Scan String Instruction)

该指令是用指针ES:DI所指向字节、字或双字的值与相应的AL、AX或EAX的值相减,用所得到的差来设置有关标志位。与此同时,变址寄存器DI还将根据标志位DF的值进行增减。

指令的格式:SCAS 地址表达式1

SCASB/SCASW

SCASD ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF

8、重复字符串操作指令(Repeat String Instruction)

前面介绍了七种不同的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较和字符串扫描等指令,所叙述是这些指令执行一次所具有的功能。但我们知道:每个字符串通常会有多个字符的,所以,就需要重复执行这些字符串操作指令。为了满足这种需求,指令系统提供了一组重复前缀指令。

虽然在这些字符串指令的前面都可以添加一个重复前缀指令,但由于指令执行结果的差异,对某个具体的字符串指令又不用重复前缀指令而改用其它循环来实现重复的需要。

重复字符串操作指令对标志位的影响是由被重复的字符串操作指令来决定。

(a) 重复前缀指令REP(Repeat String Instruction)

重复前缀指令是重复其后的字符串操作指令,重复的次数由CX来决定。其一般格式为:

REP LODS/LODSB/LODSW/LODSD

REP STOS/STOSB/STOSW/STOSD

REP MOVS/MOVSB/MOVSW/MOVSD

REP INS/ INSB/INSW/INSD

REP OUTS/OUTSB/OUTSW/OUTSD

重复前缀指令的执行步骤如下:

(1)、判断:CX=0;

(2)、如果CX=0,则结束重复操作,执行程序中的下一条指令;

(3)、否则,CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,在该指令执行完后,再转到步骤(1)。

从上面的重复前缀指令格式来看,虽然我们可以使用重复取字符串数据指令(第一组指令),但可能会因为指令的执行结果而在程序中几乎不被使用。

例5.20 编写一段程序,计算字符串“12345abcdefgh”中字符的ASCII之和。

解:

MESS DB '12345abcdefgh' ;在数据段中进行变量说明

MOV AX, SEG MESS

MOV DS, AX

LEA SI, MESS ;用DS:SI来指向字符串的首地址

MOV CX, 13D ;重复次数

XOR BX, BX ;置求和的初值为0

REP LODSB

虽然指令“REP LODSB”能从字符串中取出每个字符,但它是在一条指令中完成的,程序的其它指令根本无法处理每次取出的数据,指令的执行结果是:AL只保存最后一次所取出的字符'h'的ASCII码。

所以,为了实现本例的要求,不能使用重复前缀指令,而要把指令“REP LODSB”改写成如下四条指令:

XOR AH, AH ;为后面的累加作准备

again: LODSB

ADD BX, AX ;AL是被取出的字符,AH已被清0

LOOP again

(b) 条件重复前缀指令REPE(Repeat String Conditionally)

条件重复前缀指令与前面的重复前缀指令功能相类似,所不同的是:其重复次数不仅由CX来决定,而且还会由标志位ZF来决定。根据ZF所起的作用又分为二种:相等重复前缀指令REPE/REPZ和不等重复前缀指令REPNE/REPNZ。

A、相等重复前缀指令的一般格式为:

REPE/REPZ SCAS/SCASB/SCASW/SCASD

REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD

该重复前缀指令的执行步骤如下:

(1)、判断条件:CX≠0 且 ZF=1;

(2)、如果条件不成立,则结束重复操作,执行程序中的下一条指令;

(3)、否则,CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,在该指令执行完后,再转到步骤(1)。

B、不等重复前缀指令的一般格式为:

REPNE/REPNZ SCAS/SCASB/SCASW/SCASD

REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD

该重复前缀指令的执行步骤如下:

(1)、判断条件:CX≠0 且 ZF=0;

(2)、如果条件不成立,则结束重复操作,执行程序中的下一条指令;

(3)、否则,CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,在该指令执行完后,再转到步骤(1)。

汇编语言--微机CPU的指令系统(五)(字符串操作指令)的更多相关文章

  1. 汇编语言--微机CPU的指令系统(五)(数据传送指令)

    五.微机CPU的指令系统 1.汇编语言指令格式 汇编语言的指令格式如下: 指令助忆符 [操作数1 [, 操作数2 [, 操作数3]]] [;注释] 指令助忆符体现该指令的功能,它对应一条二进制编码的机 ...

  2. 汇编语言--微机CPU的指令系统(五)(比较运算指令)

    (7)比较运算指令 在程序中,我们要时常根据某个变量或表达式的取值去执行不同指令,从而使程序表现出有不同的功能.为了配合这样的操作,在CPU的指令系统中提供了各种不同的比较指令.通过这些比较指令的执行 ...

  3. 汇编语言--微机CPU的指令系统(五)(标志位操作指令)

    (2)标志位操作指令 标志位操作指令是一组对标志位置位.复位.保存和恢复等操作的指令. 1.进位CF操作指令 Ø 清进位指令CLC(Clear Carry Flag):CF←0 Ø 置进位指令STC( ...

  4. 汇编语言--微机CPU的指令系统(五)(转移指令)

    (9)转移指令 转移指令是汇编语言程序员经常使用的一组指令.在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所 ...

  5. 汇编语言--微机CPU的指令系统(五)(算术运算指令)

    (3)算术运算指令 算术运算指令是反映CPU计算能力的一组指令,也是编程时经常使用的一组指令.它包括:加.减.乘.除及其相关的辅助指令. 该组指令的操作数可以是8位.16位和32位(80386+).当 ...

  6. 汇编语言--微机CPU的指令系统(五)(循环指令)

    (8)循环指令 循环结构是程序的三大结构之一.为了方便构成循环结构,汇编语言提供了多种循环指令,这些循环指令的循环次数都是保存在计数器CX或ECX中.除了CX或ECX可以决定循环是否结束外,有的循环指 ...

  7. 汇编语言--微机CPU的指令系统(五)(条件设置字节指令)

    (10)条件设置字节指令 条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令.它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移, ...

  8. 汇编语言--微机CPU的指令系统(五)(位操作指令)

    (6) 位操作指令 1.位扫描指令(Bit Scan Instruction) 指令的格式:BSF/BSR Reg, Reg/Mem ;80386+ 受影响的标志位:ZF 位扫描指令是在第二个操作数中 ...

  9. 汇编语言--微机CPU的指令系统(五)(移位操作指令)

    (5) 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位.逻辑移位.双精度移位.循环移位和带进位的循环移位等五大类. 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的 ...

随机推荐

  1. 使用C++版本Mxnett进行预测的注意事项

    现在越来越多的人选择Mxnet作为深度学习框架,相应的中文社区非常活跃,而且后面推出的gluon以及gluoncv非常适合上手和实验,特别是gluoncv中提供了非常多.非常新的预训练model zo ...

  2. Spring Boot 2 - 使用CommandLineRunner与ApplicationRunner

    本篇文章我们将探讨CommandLineRunner和ApplicationRunner的使用. 在阅读本篇文章之前,你可以新建一个工程,写一些关于本篇内容代码,这样会加深你对本文内容的理解,关于如何 ...

  3. Akka-CQRS(6)- read-side

    前面我们全面介绍了在akka-cluster环境下实现的CQRS写端write-side.简单来说就是把发生事件描述作为对象严格按发生时间顺序写入数据库.这些事件对象一般是按照二进制binary方式如 ...

  4. CSS3圆角详解第一辑

    有很多人都知道圆角怎么写,加一个border-radius就可以,但是对于用圆角的一些细节却并不是很清楚,那么我们今天就来聊一聊这个圆角.CSS3是样式表(style sheet)语言的最新版本,它的 ...

  5. 微信小程序实现标签页滑块效果

    微信小程序实现标签页滑块效果 小程序完整代码: wxml: <view class="swiper-tab"> <view class="swiper- ...

  6. Kali学习笔记40:SQL手工注入(2)

    上一篇讲到可以通过注入得到数据库中所有的表信息 而SQL注入能不能做数据库之外的事情呢? 读取文件: ' union select null,load_file('/etc/passwd') -- 为 ...

  7. Core 接口发布报错

    An error occurred while starting the application 提示:启动应用程序时发生错误 这个错误在Startup启动项里面 要找具体的报错位置 如下 这样就可以 ...

  8. springmvc的Controller里实现转发的同时弹出提示对话框

    以前写servlet时就用到这个,但是现在学了springMVC+hibernate后就不知道怎么实现了,后来在网上找了好多,看了好多,最后经过自己实践成功的如下: 1.首先是Controller控制 ...

  9. 使用线程统计信息(Thread Statistics)

    可在session log中使用线程统计信息来判断source,target或组的性能瓶颈 默认情况下,Integration Service在运行session时,使用一个reader thread ...

  10. Too many connections

    在一次启动项目的过程中报了如下一个错误信息: [ERROR] [2019-03-20 13:14:43] com.alibaba.druid.pool.DruidDataSource.init(629 ...