汇编语言---字符串操作指令

汇编语言---字符串操作指令

2010-07-20 20:41:32|  分类: ASM|字号 订阅

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

规定如下:

A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:变址寄存器SI/DI递增的步长可以是1、2、4字节;

B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:变址寄存器SI/DI递减的步长可以是1、2、4字节;

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

从指针DI:SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;

该指令的执行不会影响任何标志位;

指令格式: LODS         地址表达式

LODSB/LODSW  地址表达式

LODS         地址表达式 ;80386+

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

取字符串数据指令的功能示意图如下图所示:

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

前面的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较、字符串扫描,等指令,都是执行一次所具有的功能;但是,每个字符串通常都是由多个字符组成的,所以,需要重复执行这些字符串操作指令;为了满足这种需要,指令系统提供了一组重复前缀指令;

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

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

1.重复前缀指令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

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

STEP1:判断: CX=0

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

STEP3:否则,CX=CX-1(不影响相关标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;

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

例如:编写一段程序,计算字符串"12345abcdefg"中各个字符的ASCII之和;

解:

......

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

......

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

2.条件重复前缀指令(Repeat String Conditionally)

条件重复前缀指令与重复前缀指令的功能相似,所不同的是:条件重复前缀指令中的重复次数不仅由CX来决定,而且还会由标志位ZF的值来决定;根据ZF所起的作用又可分为两种:相等重复前缀指令和不等重复前缀指令;

A.相等重复前缀指令:

指令格式:

REPE/REPZ SCAS/SCASB/SCASW/SCASD

REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD

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

STEP1:判断条件: CX!=0 且 ZF=1

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

STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行后,再转到步骤STEP1;

B.不等重复前缀指令:

指令格式:

REPNE/REPNZ SCAS/SCASB/SCASW/SCASD

REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD

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

STEP1:判断条件:CX!=0 且 ZF=0

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

STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;

汇编语言---字符串操作指令

2010-07-20 20:41:32|  分类: ASM|字号 订阅

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

规定如下:

A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:变址寄存器SI/DI递增的步长可以是1、2、4字节;

B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:变址寄存器SI/DI递减的步长可以是1、2、4字节;

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

从指针DI:SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;

该指令的执行不会影响任何标志位;

指令格式: LODS         地址表达式

LODSB/LODSW  地址表达式

LODS         地址表达式 ;80386+

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

取字符串数据指令的功能示意图如下图所示:

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

前面的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较、字符串扫描,等指令,都是执行一次所具有的功能;但是,每个字符串通常都是由多个字符组成的,所以,需要重复执行这些字符串操作指令;为了满足这种需要,指令系统提供了一组重复前缀指令;

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

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

1.重复前缀指令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

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

STEP1:判断: CX=0

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

STEP3:否则,CX=CX-1(不影响相关标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;

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

例如:编写一段程序,计算字符串"12345abcdefg"中各个字符的ASCII之和;

解:

......

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

......

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

2.条件重复前缀指令(Repeat String Conditionally)

条件重复前缀指令与重复前缀指令的功能相似,所不同的是:条件重复前缀指令中的重复次数不仅由CX来决定,而且还会由标志位ZF的值来决定;根据ZF所起的作用又可分为两种:相等重复前缀指令和不等重复前缀指令;

A.相等重复前缀指令:

指令格式:

REPE/REPZ SCAS/SCASB/SCASW/SCASD

REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD

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

STEP1:判断条件: CX!=0 且 ZF=1

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

STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行后,再转到步骤STEP1;

B.不等重复前缀指令:

指令格式:

REPNE/REPNZ SCAS/SCASB/SCASW/SCASD

REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD

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

STEP1:判断条件:CX!=0 且 ZF=0

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

STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;


相关内容

  • 汇编语言指令详解
  • 第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程. 重点和纲要:指令系统--寻址方式.有关寻址的概念:6种基本的寻址方式及 有效地址的计算. 讲授内容: 3.1 8086/8088寻址方式 计算机中的指令由操作码字段和 ...

  • MIPS体系结构和汇编语言快速入门
  • MIPS 体系结构和汇编语言快速入门 译者:Sonic Fu, Northeastern University, Boston, MA, USA 译者按:有修改,无删减,初学必读.学习笔记,抛砖引玉!网上有一个老版本,不如此版全面. 英文原版: http://logos.cs.uic.edu/366 ...

  • 汇编语言期末复习题
  • 汇编语言期末复习题 第1章:基础知识 1.在汇编语言程序的开发过程中使用宏功能的顺序是(C ). A.宏定义,宏调用B.宏定义,宏展开 C.宏定义,宏调用,宏展开D.宏定义,宏展开,宏调用 2.汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可省略的项是(B ). A.名字 ...

  • 汇编语言复习题(带答案)
  • 汇编语言期末复习题 第1章:基础知识 1.在汇编语言程序的开发过程中使用宏功能的顺序是(C).DX A.宏定义,宏调用B.宏定义,宏展开 C.宏定义,宏调用,宏展开D.宏定义,宏展开,宏调用 2.汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可省略的项是(B).DX A. ...

  • 汇编语言课后习题答案
  • 2.1已知DS=2000H.BX=0100H.SI=0002H,存储单元[20100H]-[20103H]依次存放12345678H,[21200H]-[21203H]依次存放2A4CB765H,说明下列每条指令执行完后AX寄存器的内容. (1)movax,1200h(2)movax,bx(3)mo ...

  • 汇编语言及编程实例(电子教案)
  • 第四章 汇编语言程序设计 回顾:8086的内部结构.寄存器功能和工作过程,指令格式.寻址方式和功能. 本讲重点:了解汇编的概念及其方法, 掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤. 4.1汇编语言的基本元素 一.汇编语言的语句格式 由汇编语言编写的源程序是由许多语句(也可称为汇编指令 ...

  • 微机接口实验报告
  • 武汉大学 微机接口实验报告 目录 目录................................................................................................................................... ...

  • 第三节汇编程序输入和输出文件的格式
  • 第三节 汇编程序输入和输出文件的格式 一.源文件 源文件是由文字编缉器编写的由汇编指令和MASM51伪指令构成的文本文件.源文件一般应以.ASM为扩展名. 二.源文件的格式 以回车作为结束的一行称为语句行.每一语句行长度应少于80个字符(即40个汉字).每一个语句行对于汇编程序来说都是一条单独的命令 ...

  • 汇编指令的格式
  • 汇编指令的格式(伪指令) 作者:jdzj868 来源:机电之家下载站 录入:jdzj868 更新时间:2009-10-23 16:27:12 点击数:0 [字体: ] 伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令. 许多伪指令 ...