串操作指令一

合集下载

4.7 串操作指令

4.7 串操作指令

3、不相等重复前缀REPNZ(REPNE)
(1). 若CX=0,或ZF=1,退出重复操作;
(2). CX ≠ 0,执行串操作一次,
CX CX-1, 修改SI、 DI。
用途:1)在一个字串中,找到需要的字。
2)用于比较两个字串,找出相同的
字串 。
字串传送指令:MOVS
字节操作: MOVSB 字 操 作: MOVSW 1). SI指向源串( 数据段DS),DI指向目的(附
字串检索指令:
SCASB / SCASW
操作: AL (AX)— [DI] DI DI 1( 2) 用AL或AX中的一个字串和位于ES段 由DI指出的内存单元的字节或字比较。
功能:从一个字串中查找一个与AL或 AX中 不同的字符,或寻找一个相同的字符.
例2. 从地址为1000单元开始,存放256个字 节的字符串,找出第一个字符 $ (ASCII码24H),将$的 第一个地址存入BX中,否则将BX清零.
LEA SI, [1000H] ;SI指向源串地址 LEA DI, [2000H];DI指向源串地址 MOV CX,100 ;置计数器
CLD
REP MOVSB HLT
;清方向标志
;将源地址的100个字
节传送到目的地址单元
字串比较指令:
CMPSB / CMPSW ;SRC - DST 字 操 作指令: CMPSW 字节操作指令: CMPSB 功 能: [SI]— [DI] DI DI 1( 2) SI SI 1( 2) 操作结果影响标志位。
取字串指令: LODSB / LODSW
执行的操作:AL(AX) [SI] SI SI 1( 2) 将位于DS段由SI指出的内存单元的字 节或字的内容取到AL或AX中。 注意:因为取来的字或字节放在AX或AL中, LODSB / LODSW前面不能加前缀。

串操作指令

串操作指令
DI
23 D0 05 AB 92
Source
NEXT: LODSB INC AL 4、保存运算结果 5、所有操作完成否?若完成, 结束;否则继续2-4的动作 STOSB DEC CX JNZ NEXT HLT
24 D1 06 AC
Dest
DI
23 D0 05
Dest
ES
例1-2:与 REP 指令配合传送100个数。 LEA SI,Souce LEA DI,Dest MOV CX,100 LEA SI,Souce LEA DI,Dest MOV CX,100 CLD REP MOVSB HLT CX不为 0 时重复执行
SI
23 D0 05 AB 92
SI
23 D0 05 AB 92
Source
[SI] - [DI] SI+1 → SI DI+1 → DI
3、操作结束? 若否,继续2中 的操作;否则结 束程序
DI
23 D0 05 A1 92
Dest
例2-2:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同。( 与 REPE / REPZ配合使用,找第一个不相同的数据位置)
REPNE CMPSB
JE Found MOV AX, 0 JMP Exit Found : DEC SI MOV AX, SI Exit: HLT
DI 23 D0 05 A1 92 Dest
3、SCAS指令 格式:SCASB/SCASW 功能:AL/AX-[ES:DI] DI±1或2 注意:状态位随运算结果变化。
LEA DI, DEST
MOV CX, 30 MOV AL, ‘A’
DI 53 71 41 49 68 DEST

串操作指令

串操作指令

运用MOVSB指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVSB LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
例2:同学课后应用以上指令编辑传送100字的程序
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVS BYTE PTR[DI],BYTE PTR[SI] LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
START: MOV AX,DATA NEXT: MOV AL,[DI] MOV DS,AX MOV [SI],AL MOV DI,OFFSET NUM1 INC SI MOV SI,OFFSET NUM2 INC DI MOV CX,50 LOOP NEXT
运用MOVS指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
基 本 串 操 作

汇编串操作指令的使用

汇编串操作指令的使用

串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。

串操作就是对串中各项数据进行某种运算,也叫数据块操作。

8086/8088有5种基本串操作:⏹MOVS(Move string)串传送指令⏹CMPS(Compare string)串比较指令⏹SCAS(Scan string)串扫描指令⏹LODS(Load from string)从串取指令⏹STOS (Store in to string)存入串指令可以使用3种重复前缀:⏹REP(Repeat)无条件重复⏹REPE/REPZ(Repeat while equal/zero)相等/为零则重复⏹REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复二、串操作指令详解★MOVS 串传送格式:MOVS dest,srcMOVSB(字节传送)MOVSW(字传送)功能:把DS:SI所指向的内存单元中的一个字或字节的内容取出复制到ES:DI所指向的字或字节内存单元中。

同时SI±1、DI±1或SI±2、DI±2,方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。

说明:☆单条MOV指令不能完成存储单元之间的数据传送;MOVS指令就是为解决内存储单元之间数据传送而设置的。

☆所涉及到的源内存单元和目的内存单元的地址分别存放在DS:SI和ES:DI中。

✧MOVS串传送指令不影响标志寄存器。

★LODS 从串取指令格式:LODS srcLODSB (取字节)LODSW(取字)功能:把DS:SI所指向的内存单元中的字或字节内容传送到AX或AL寄存器中。

同时SI 加减1或2;方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。

说明:☆LODS指令可用于取出指定的内存单元中的内容。

✧默认目的寄存器为AX或AL寄存器。

串操作、控制转移指令

串操作、控制转移指令

•STOS指令不影响标志位。
机械工程学院
14
微机与接口技术
例, 将字符“#”装入以AREA为首地址的100个字节中 LEA MOV MOV CLD REP HLT DI, AREA CX, 100 AL, ‘ #’ STOSB
机械工程学院
15
微机与接口技术 例,设有一长度为100的数据块,首地址为BLOCK,把其中的正数放 到首地址为PLUS_DATA的缓冲区,负数放到首地址为MINUS_DATA 的缓冲区 START: LEA SI, BLOCK LEA DI, PLUS_DATA LEA BX, MINUS_DATA MOV CX, 100 CLD LODSB TEST AL, 80H JNZ MIUS ;ZF=0,负数 STOSB ;ZF=1,正数 JMP AGAIN XCHG BX, DI STOSB XCHG BX, DI DEC CX JNZ GOON HLT
机械工程学院
17
GOON:
OK: DONE:
微机与接口技术
串操作指令一览表
指令 重复前缀 REP REPE/ REPNE REPE/ REPNE 操作数 目标,源 源,目标 目标 源 目标 地址指针 寄存器 ES:DI,DS:SI DS:SI ,ES:DI 6个状态 标志 ES:DI DS:SI ES:DI 不影响 不影响 影响的 标志位 不影响
机械工程学院
6
微机与接口技术
例,将数据段中首地址为BUFFER1的200个字节传送到附 加段首地址为BUFFER2的内存区中。可以用以下两种形式 实现:
法1: LEA LEA MOV CLD MOVS DEC JNZ HLT SI, BUFFER1 DI, BUFFER2 CX, 200 BYTE PTR[DI],[SI] CX AGAIN 法2: LEA LEA MOV CLD REP HLT

汇编语言设计-串操作

汇编语言设计-串操作

SI←源串地址指针 DI←目串地址指针 CX←计数器初值 DF←0 增址方向
串比较 [SI]-[DI]
相同?
Y
N
BX←偏移地址
AL←[BX]
(CX)←(CX)-1
CX=0? ≠0 =0
停机
BX←0
程序见P87∽88
3、串扫描(搜索)指令SCASB/SCASW
SCASB ;(AL)-[DI] , (DI)←(DI) 1
SCASW ;(AX)-[DI] , (DI)←(DI) 2
功能:把AL(或AX)中的内容与DI所指的附ES中一个 字节(或字)进行比较 , 结果不回送 , 只影响状态标志 , 并 在比较之后,自动修改地址指针DI。
注意: ①、欲搜索的字符或数据(称关键字)必须存放在AL或 AX寄存器中。
②、串元素的地址指针使用DI寄存器,且通常在附加段 ES中。
Y DX←求负数和
何修改?②去掉MOV BX,AX 指令可行?
5、串存储(存字符串)指令STOSB/STOSW STOSB ;B [DI]←(AL) , (DI)←(DI) 1
STOSW ;W [DI]←(AX) , (DI)←(DI) 2
功能:将AL或AX中的数据存到ES段由DI所指定的内存
CLD ;置方向标志,即DF=0,增址传送
LEA SI,SOURCE ;SI指向源串 DEC CX
LEA DI,DEST ;DI指向目的串 JNZ AGAIN
MOV CX , 64H ;设置计数器初值 HLT AGAIN:MOVSB ;串传送
程序中的MOVSB指令 其一条指令功能相当
于右边四条指令功能
㈠、基本的字符串操作指令
1、字符串传送指令MOVSB/MOVSW 功能:将位于DS段的由SI所指向的存储单元中的字节或 字传送到位于ES段由DI所指向的存储单元中,并修改SI和 DI,以指向字符串的下一个元素。 例:MOVSB ;字节串传送 , SI和DI的内容1

3.2.5串操作指令

3.2.5串操作指令


(1)源串首地址(末地址)→ SI (2)目的串首地址(末地址)→ DI (3)串长度 → CX (4)建立方向标志(CLD使DF=0,STD使 DF=1)
例题




例1、将首地址为SRC的源字符串传送到 DEST为首地址的内存区,字符串的长度为N 个字节。 CLD ;DF=0,增量方向 LEA SI,SRC ;DS:SI←字符串首 地址 LEA DI,ES:DEST ;ES:DI←目标地址 MOV CX,N ;字符串长度 REP MOVSB ;重复字符串传送

NOT_FOUNT,否则继续执行下条指令
例题
例3、在首地址为ES:DEST的字符串中检查是否有 字符’M’,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA DI,ES:DEST ;ES:DI←目标地址 MOV CX,N ;字符串长度 MOV AL,’M’ ;AL←搜索字符 REPNE SCASB ;重复搜索字符串是否有字 符’M’
例4、将首地址为DS:SRC的字节数据串中非0元素送到 首地址为ES:DEST的内存区中。字符串长度为N。 CLD;DF=0,增量方向 LEASI,SRC;DS:SI←字符串首地址 LEADI,ES:DEST;ES:DI←目标地址 MOVCX,N;字符串长度 GOON:LODSB;取字符串的一个元素 CMPAL,0;字符串元素为0吗? JZNEXT;是0,继续下一个元素 STOSB;非0,存入首地址为ES:DEST的内存区中 NEXT:DECCX JNEGOON
2.2 8086/8088指令系统
串操作指令之三:串传送指令

MOVS MOVSB MOVSW 将一个字节/字/双字从DS:SI ES:DI 指令前要先将源串首地址 DS:SI 目标串首地址 ES:DI 完成操作后自动修改SI、DI,使其指向串的下一个元素 串操作方向由CLD和STD指令设置 CLD 地址递增方向(DF=0) STD 地址递减方向(DF=1)

汇编语言——串操作指令

汇编语言——串操作指令
(2)MOVSW进行字型串复制,把DS:SI所指向的一个 字型数据送往ES:DI所指向的内存中。当DF=0时,令SI←SI +2,DI←DI+2;当DF=1时,令SI←SI-2,DI←DI-2。
MOVS指令可以实现把内存中的一个数据,不经过寄存 器的过渡由一处复制到另一处。这一点是MOV指令做不到 的。MOVS指令与循环控制指令配合,可以完成数据块的复 制。被复制的数据串称为源串,复制到的目的地称为目标 串。如果源串与目标串所占据的内存是完全分离的,数据 传递可以按由串首至串尾的次序进行,也可以按相反的方 向进行。但是,当两者占据的内存区域有部分重叠时,需 要注意用DF控制方向,当源串首地址小于目标串首地址时, 应由尾至首进行传送,源串首址大于目标串首址时,则由 首至尾传送。
(2)STOSW进行字型串操作,把AX的值送往内存中由 ES:DI所确定的内存中。当DF=0时,令DI←DI+2,当DF= 1时,令DI←DI-2。
STOS指令主要用于把一段连续的存储区域以AL或AX中 的值填充,特别的是,存储区的段地址必须放在附加段寄存 器ES中。STOS与LODS指令配合,还可以从一个串中取出数 据,有选择地存到另一个串中。
8088提供有两条专用指令设置DF,分别是CLD和STD 指令。
【指令格式】CLD
【功能】把标志位DF清0。
【指令格式】STD
【功能】把标志位DF置1。
7.2.2 串操作指令
8088指令系统中共设计有5条串操作指令,分别用于完 成从串中取出数据、往串中2.2.1 LODS指令──从串中取出数据
lab2:
INC [countp]
JMP lab4
lab3:
INC [countn]
lab4:
LOOP lab1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

串传送 MOVSB (正向 DF=0 )
串传送 MOVSW(反向 DF=1)
在使用MOVS指令进行字符串传送时,要注意传送方向。 – 如果源字符串与目标字符串不重迭,则传送方向没有任何影响。 – 如果源字符串与目标字符串部分重迭,则传送方向要特别注意。
DF=0? DF=1?
例 将数据段中首地址为SOURCE的100个字节串元素传送到附加段中首地址 为DEST的内存单元址连续的若干单元字符或数据。 由多个字节数据组成的数据串称为字节数据串,简 称字节串; 由多个字数据组成的数据串称为字数据串,简称字 串。 成串的字节数据或字数据称为数据串元素。 对数据串元素作同样的操作,就称为串操作。 把能完成串操作功能的指令称为数据串操作指令或 简称为串操作指令。
3、串操作指令 (1)串传送指令 指令功能:把位于数据段DS:SI中一个字节或字的数据传送到附 加段ES:DI中。 指令格式: 注意: 1)源串可以段跨越,目的串不可以。 MOVSB;字节传送:ES:[DI]←DS:[SI],SI ←SI±1, 2)DF=0,地址指针 +1 或 +2 , DF=1 ,指针 -1 或 -2 。 ;DI ←DI±1 3)指令隐含操作数,只有助记符,无操作数。 MOVSW;字传送:ES:[DI]←DS:[SI],SI ←SI±2, 4)不影响标志位。 ;DI ←DI±2
实现该功能的程序段如下: CLD LEA SI,SOURCE LEA DI,DEST MOV CX,100 AGAIN: MOVSB
DEC JNZ HLT CX AGAIN ;使DF=0 ;SI指向源串 ;DI指向目的串 ;(DS:SI)→ES:DI, ;(SI)+1→SI,(DI)+1→DI
本例中MOVSB指令可用以下4条指令替代: MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI

REP重复前缀指令 —字节串传送(例) mov si,offset source mov di,offset destination mov cx,n ;cx←传送次数n cld ;置DF=0,地址增加 again: rep movsb movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束
二、串操作对象 串操作对象有两组,分别叫做源串、目的串,而且他 们都处于存储器中,是8086指令系统中唯一的一类所有数 据都来源于存储器的指令。 所有指令的操作数普遍采用地址描述的方式来对应, 因为是地址连续的,可以通过地址修正的方式,查找下一 个数据。
源串和目的串的分布情况可以有下面三种情况。 1、两串信息相互独立,地址不重迭。 2、源串的下半(高地址)部分和目的串上半(低地址)部分重迭。 3、源串的上半(低地址)部分和目的串下半(高地址)部分重叠。 b图和c图有重合部分,为保证原始数据不会 受影响,就需要先从重合的部分处理,b图先 a图,没有重合部分,处理数据 处理源串的高地址部分, c图先处理源串的低 时,可以从低地址开始,也可以 地址部分。源串和目的串的地址修正方向一 从高地址开始。 致,通过 DF来确定。
三、串操作指令 1、特点 (1)串处理指令只能处理单个字节或字,应用中需要串重复前 缀配合使用。 (2)用CX寄存器存放要处理的字符串的元素个数,要在字符 串指令执行前,给CX赋值。 (3)一般源串存放在数据段DS中,偏移地址由SI指定;目的 串存放在附加段ES中,偏移地址由DI指定;在同一个段内实现 字符串传送时,应将DS=ES。 (4)设置方向标志指令:DF=0时,SI、DI作自动增量修改; DF=1时,SI、DI作自动减量修改。
2、指令初始化 在使用串操作指令之前需要先做一些准备工作,这些准备工作 包括指明源串、目的串的起始位置,所要处理的数据的数量以 及数据查找的方向,即对DS、SI、ES、DI、CX、DF设定初值。 (1) DS、SI、ES、DI是地址信息可以使用MOV或LEA进行赋值 个别情况也可以考虑LDS、LES指令。 (2)对CX初始化需要考虑指令中数据串元素的类型,通常会选用 MOV指令进行赋值。 (3)设定DF时可以用指令 CLD(DF=0)和STD(DF=1)。
串操作指令执行一次,仅对数据串中的一个字节或字量进行操 作。但是串操作指令前,都可以加一个重复前缀,实现串操作 的重复执行。重复次数隐含在CX寄存器中。 重复前缀指令用来控制紧跟其后的字符串指令是否重复,为单 字节指令,不能单独使用。 无条件重复前缀REP ●指令功能:重复执行指令规定的操作,直到(CX)=0。 ●指令格式:REP MOVS(B/W) ●指令操作:① 如(CX)=0 则退出 REP,否则转②; ②(CX)←(CX)-1; ③ 执行其后的串操作指令; ④ 重复①〜③。
相关文档
最新文档