串操作类指令
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前面不能加前缀。
微机原理 第5章5.2.4串操作类指令

第5章
2、REPZ重复前缀指令
REPZ
;每执行一次串指令,CX减1 每执行一次串指令,CX减 并判断ZF是否为0 ZF是否为 ;并判断ZF是否为0, 只要CX CX= ZF= 重复执行结束 ;只要CX=0或ZF=0,重复执行结束
【例5.42】比较S1、S2两个数据串是否相同,不同则 】 比较 、 两个数据串是否相同, 两个数据串是否相同 例5.42:比较字符串 : 跳到NOMATCH执行。 执行。 跳到 执行 S1 DB 0,1,1,0,0 S2 DB 0,1,1,1,0 …… CLD LEA SI,S1 ;源串偏移地址赋值给 源串偏移地址赋值给SI 源串偏移地址赋值给 LEA DI,ES:S2 ;目的串偏移地址赋值给 目的串偏移地址赋值给SI 目的串偏移地址赋值给 MOV CX,5 ;源串和目的串的数据个数 源串和目的串的数据个数 AGAIN: CMPSB ;源串与目的串相减,标志位 源串与目的串相减, 源串与目的串相减 JNE NOMATCH ;有任一不同,跳到NOMATCH 有任一不同,跳到 有任一不同 DEC CX ;数据串没比较完,继续比较 数据串没比较完, JNZ AGAIN 数据串没比较完 NOMATCH:
第5章
四、串比较CMPS
将主存中的源操作数减去目的操作数, 将主存中的源操作数减去目的操作数,以便设 置标志(影响AF,ZF,PF,SF,OF,CF) , 进而比 置标志 ( 影响 ) 较两操作数之间的关系 CMPSB ;字节串比较:DS:[SI]-ES:[DI] 字节串比较:DS:[SI]- SI←SI± DI←DI± ;SI←SI±1,DI←DI±1 CMPSW ;字串比较:DS:[SI]-ES:[DI] 字串比较:DS:[SI]- SI←SI± DI←DI± ;SI←SI±2,DI←DI±2
串操作指令

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寄存器。
课件:第3章 8086指令系统_串操作指令2013

MOV AX,[SI]
MOV ES:[DI],AX
4
②CMPS 串比较指令 指令格式:CMPSB 执行的操作:字节操作,((SI))-((DI)), (SI)←(SI)±1,(DI)←(DI)±1 指令格式:CMPSW 执行的操作:字操作,((SI))-((DI)), (SI)←(SI)±2,(DI)←(DI)±2
串传送指令的功能是将位于DS段以SI为指针
的源串中的一个字节(或字)存储单元中 的数据传送至ES段以DI为指针的目的地址中
去,并自动修改指针,使之指向下一个字 节(或字)存储单元。当DF=0时,(SI)和 (DI)增量;当DF=1时,(SI)和(DI)减 量。指令不影响状态标志位。相当于:
PUSH AX
串比较指令的功能是把位于DS段由SI指定的字节数据或字数据 与ES段由DI指定的字节数据或字数据进行比较,结果不保存,但影 响状态标志位。当DF=0时,(SI)和(DI)增量;当DF=1时,(SI) 和(DI)减量。
③SCAS串搜索指令 指令格式:SCASB 执行的操作:字节操作,(AL)-((DI)),(DI)←(DI)±1 指令格式:SCASW 执行的操作:字操作,(AX)-((DI)),(DI)←(DI)±2 串搜索指令的功能是把AL或AX中的内容与ES段由DI指定的一个字节数 据或字数据进行比较,结果不保存,但影响状态标志位。当DF=0时, (SI)和(DI)增量;当DF=1时,(SI)和(DI)减量。 ④LODS串取指令 指令格式:LODSB 执行的操作:字节操作,(AL)←((DI)),(DI)←(DI)±1 指令格式:LODSW 执行的操作:字操作,(AX)←((DI)),(DI)←(DI)±2 串取指令的功能是把位于DS段由SI指定内存单元的内容取到寄存器AL 或AX中,指令不影响状态标志位。当DF=0时,(SI)和(DI)增量; 当DF=1时,(SI)和(DI)减量。
第3.3.5章 串操作类指令

80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式
2.串比较指令CMPS 2.串比较指令CMPS 串比较指令 语句格式: 语句格式: ① CMPS SRC, SRC,DST CMPSB——字节串比较 ② CMPSB 字节串比较 CMPSW——字串比较 ③ CMPSW 字串比较
80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式
当相等/为 时重复串操作 (2) REPE/REPZ 当相等 为0时重复串操作 )
格式: 格式:REPE/REPZ string primitive (用来检查两字符串中是否 其中string primitive可为 可为CMPS或SCAS指令 有不同的元素 ) 其中 可为 或 指令 执行的操作: 执行的操作: 1如(COUNT REG)=0或ZF=0(即某次比较的结果两个操 ) 或 ( 作数不等)时退出REP,否则(即某次比较的结果两个操作数相等) 作数不等)时退出 ,否则(即某次比较的结果两个操作数相等) 往下执行。 往下执行。 2 (Count Reg) ← (Count Reg)-1 ) ) 3 执行其后的串处理指令 4 重复 1~ 3 其中,地址长度为 位时 位时, 作为Count Reg;地址长度为 位 其中,地址长度为16位时,用CX作为 作为 ;地址长度为32位 作为Count Reg。 时,用ECX作为 作为 。 总结:重复串操作条件: 总结:重复串操作条件: (COUNT REG)≠0且ZF=1; (即某次 ) 且 ; 比较的结果两个操作数相等) 比较的结果两个操作数相等) 退出串操作条件: 退出串操作条件: (COUNT REG)=0或ZF=0; 串操作条件 ) 或 ;
80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式
串操作类指令(ppt 41页)

可将CLD改为STD吗?如何改用STOSB? 可不用给DI赋值吗?
第2章
串读取LODS(load string)
把指定主存单元的数据传送给AL或AX
LODSB LODSW
演示 ;字节串读取:AL←DS:[SI] ;SI←SI±1
;字串读取:AX←DS:[SI] ;SI←SI±2
例2.54:串读取-1
REP 前 缀 可 以 理 解 为 : 当 数 据 串 没有结束(CX≠0),则继续传送
例2.52和例2.53中,程序段的最后 3条指令,可以分别替换为:
REP MOVSB 和 REP STOSW
第2章
REPZ重复前缀指令
REPZ
;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX=0或ZF=0,重复执行结束
串操作指令的操作对象是以字 (W)为单位的字串,或是以字节 (B)为单位的字节串
第2章
串寻址方式
源操作数用寄存器SI寻址,默认在数据段 DS中,但允许段超越:DS:[SI]
目的操作数用寄存器DI寻址,默认在附加段 ES中,不允许段超越:ES:[DI]
每执行一次串操作指令,SI和DI将自动修改:
事实上,NOP和XCHG AX,AX的指令 代码一样,都是 90H
第2章
段超越前缀指令
在允许段超越的存储器操作数之 前,使用段超越前缀指令,将采 用指定的段寄存器寻址操作数
CS: ;使用代码段的数据
SS: ;使用堆栈段的数据
DS: ;使用数据段的数据
ES: ;使用附加段的数据
第2章
封锁前缀指令
±1(对于字节串)或±2(对于字串)
执行指令CLD指令后,DF = 0,地址指针 增1或2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.串传送指令
格式1:MOVSB 操作:(ES:DI)←(DS:SI)字节传送 每执行一次串传送操作,SI±1,DI±1。 DF=0时+1, DF=1时-1。
格式2:MOVSW 操作:(ES:DI)←(DS:SI)字传送 每执行一次串传送操作,SI±2,DI±2。 DF=0时+2, DF=1时-2。
用LODSB时,每次取一个字节,取完后,地 址自动加1或减1;
用LODSW时,每次取一个字,取完后,地址
自动加2或减2。
3. 串装入指令 该指令一般不用重复前缀,否则,AL或AX中 的内容会被后一次操作覆盖,最后只能得到内 存中字符串的最后一个字节或字。
AL LO 串操作类指令
1.串操作指令特点
用一条指令实现对一串数据的操作;
源操作数和目标操作数都在存储器中;
共同点:
源操作数由DS:SI指定; 目标操作数由ES:DI指定。 串长:CX 自动修改地址指针:SI和DI
重复操作前缀 无条件 REP ; CX≠0重复 有条件 REPE/REPZ; CX≠0且ZF=1重复 REPNE/REPNZ; CX≠0且ZF=0重复 加重复操作前缀后串操作执行动作: 1.执行规定动作 2.修改SI、DI 3.CX-1 4.根据ZF,决定是否重复执行
把6000H:1200H单元开始的100个字存储单元内容清零。
MOV AX,6000H MOV ES, AX
MOV AX, 1200H
MOV DI, AX MOV CX, 100 CLD MOV AX, 0
REP STOSW
HLT
5.串扫描指令
格式: [REPZ/ REPNZ] SCASB 操作:AL -(ES:DI) 格式: [REPE/ REPNE] SCASW 操作: AX -(ES:DI) 将AL或AX的数据与位于ES段DI指针所指的内 存单元的数据相比较;比较结果不改变目标操 作数,只影响标志位。
在ES段中从2000H单元开始存放了10个字符,寻找其中有无字符 “A”,若有则记下搜索次数(次数放在DATA1单元),并记下存放 “A”的地址(地址放在DATA2单元)。
MOV DI, 2000H MOV BX,DI MOV CX,0AH
MOV AL,’A’
CLD REPNZ SCASB
JZ FOUND
LEA SI, M1 LEA DI, M2 MOV CX,200 CLD REPE CMPSB JZ STOP DEC SI MOV BX, SI MOV AL, [SI]
STOP: HLT
3. 串装入指令
格式:LODSB AL←(DS:SI) LODSW AX←(DS:SI) 功能:将位于DS段SI所指的存储单元的内容 取到AL 或AX中。
例1.将2000H:1200H地址开始的100字节传送到6000H:0000H 开始的内存单元去
MOV AX,2000H
MOV DS,AX MOX AX,6000H
MOV ES,AX
MOV SI,1200H MOV DI,0000H
MOV CX,100
CLD REP MOVSB
HLT
2.串比较指令
DS:SI
4.串存储指令
格式: [REP] STOSB
[REP] STOSW
(ES:DI)← AL
(ES:DI)← AX
功能:把AL或AX中的数据存放到位于ES段DI 所指的 存储单元中,并自动修改地址指针。
例如: 要对附加段中从MESS2开始的50个连 续的内存字节单元进行清 0操作,可用下列程 序段实现: LEA DI, MESS2 MOV AL,00H MOV CX,50 REP STOSB
1.串传送指令
REP MOVSB REP MOVSW 字符或数据的个数预先放在CX寄存器中; 每执行一次操作,CX自动减1,直到CX=0串操 作自动停止。
1、串传送指令
DS:SI DS:SI DS:SI
ES:DI ES:DI ES:DI
1.串传送指令 例如:将源串STAR中的100个字节数据传送 到目标串NEXT中。 LEA SI, STAR LEA DI, NEXT MOV CX, 100 CLD MOVSB MOVSB …… MOVSB LEA LEA MOV CLD REP SI, STAR DI, NEXT CX, 100 MOVSB
MOV DI, 0 JMP DONE FOUND:DEC DI MOV DATA2 ,DI INC DI SUB DI,BX
DONE: MOV DATA1,DI
格式1:CMPSB 操作:(ES:DI)-(DS:SI)字节比较 每执行一次串比较操作,SI±1,DI±1。 DF=0时+1, DF=1时-1。 比较后影响标志ZF。 格式2:CMPSW 操作:(ES:DI)-(DS:SI)字比较 每执行一次串比较操作,SI±2,DI±2。 DF=0时+2, DF=1时-2。
[REPZ/ REPNE] CMPSB
[REPNZ/ REPE] CMPSW
REPE相等时继续寻找,直到寻找到第一个不 相等的字符或寻找完所有的字符(CX=0)。 REPNE不相等时继续寻找,直到寻找到第一个 相等的字符或寻找完所有的字符(CX=0)。 CX是否为零不影响ZF状态
例2.比较两个字符串是否相同,并找出其中第一个字符不相等 的地址,将该地址送BX,不相等的字符送 AL,两个字符串的 长度均为200个字节,M1为源串首地址,M2为目标串地址。