串操作指令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LEA SI, SOURCE LEA DI, DEST MOV CX, 50
SI 23 D0 05 AB 92 Souce
CX不为 0 且 [si] 与 [di] 相等 (ZF=1) 时重复

检测 CX=0? 或 ZF=0? 是,退出
否,进行② CX – 1 -> CX 执行REPE 后的串操作。 重复 ① ~ ③
分析下列程序运行后,DX中的值表示的意义是什么?
初始化 CLD LEA DI,BUFF MOV CX,50 MOV AL,’$’ XOR DX,DX REPNZ SCASB CMP CX,0 JZ K1 INC DX JMP NEXT
字符串BUFF中字符’$’的个数。
NEXT:
K1:
4、STOS指令 格式:STOSB/STOSW 功能:[ES:DI]←AL/AX DI±1或2 注意:不影响状态位。源操作数为AL或AX,由目的操 作数dest的类型确定。
CX不为 0 且 [si] 与 [di] 不相等 (ZF=0) 时重复
LEA DI, DEST
MOV CX, 50 CLD
SI

检测 CX=0? 或 ZF=1? 是,退出
否,进行② CX – 1 -> CX 执行REPNE 后的串操作。 重复 ① ~ ③
53 80 05 A3 72
Souce
② ③ ④
•重复前缀
1、REP 格式:REP 功能: MOVS/LODS/STOS
若CX≠0,重复执行后续的串操作指令,每执行一次CX← CX-1; 若CX=0,退出重复,结束串操作
2、REPE/REPZ(当相等/为零时重复) 格式:REPE/REPZ CMPS/SCAS 功能:
若CX≠0且ZF=1,重复执行后续的串操作指令, 每执行一次CX← CX-1; 若CX=0或ZF=0,退出重复,结束串操作
53 71 41 49 68
DEST
例3-2:寻找字符串中是否有字符 ‘A’ 。与 REPE/ REPZ , REPNE / REPNZ配合使用。
LEA DI, DEST MOV CX, 30 CLD MOV AL,’A’ Again: SCASB JE Found DEC CX JNZ Again MOV BX,0 JMP Over Found: DEC DI MOV BX,DI Over: HLT
例:在数据段中自Source开始有一长度为30个字 节的字符串,试将其每一个字符加一后送入附加 段中自Dest开始的内存单元中。
LEA SI,Source
SI
编程思路: 1、初始化指针SI,DI,CX, 置方向标志DF为0(CLD)或1(STD) 2、取数据到CPU中的寄存器
3、对数据做运算
LEA DI,Dest MOV CX, 30 CLD
串操作指令
串操作指令 重复前缀
特点: 1、可以对字节串和字串进行操作; 2、源/目的操作数是字符串,源字符串的起始地址为 DS:SI,目标字符串的起始地址为ES:DI; 3、源/目的操作数是单变量的用AL/AX 4、串操作时地址的修改方向与方向标志DF有关,当 DF=1时,SI和DI作自动减量修改,当DF=0时, SI和DI作自动增量修改。
该指令用来从目标串中查找某个关键字,要求 查找的关键字事先置入寄存器AL或AX中去,将 AL/AX寄存器中的关键字减去由DI指向的目标串的 一个元素,不传送结果,只是根据结果置标志位, 修改DI寄存器指向下一元素。
例3-1:寻找字符串中是否有字符 ‘A’ 。若无,将BX 置为0;若有,将字符‘A’的位置存到BX中。
SI
23 D0 05 AB 92
Source
DS
LEA SI,Source 3、操作结束? 若否,继续2中 LEA DI,Dest MOV CX,100 的操作;否则结 束程序 CLD Again: MOVSB [SI] → [DI] SI+1 → SI DEC CX DI+1 → DI JNZ Again HLT
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
CLD REPE CMPSB
② ③ ④
Hale Waihona Puke Baidu
JNE Found
MOV AX,0 JMP Exit
DI 23 D0 05 A1 92 Dest
Found : DEC SI
MOV AX,SI Exit: HLT
例2-3:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同。( 与 Repne / Repnz 配合使用,找第一个相同的数据位置) LEA SI, SOURCE
3、REPNE/REPNZ(当不等/不为零时重复) 格式:REPNE/REPNZ CMPS/SCAS 功能:
若CX≠0且ZF=0,重复执行后续的串操作指令, 每执行一次CX← CX-1; 若CX=0或ZF=1,退出重复,结束串操作
注意:
若已知两个数据块的内容基本上相同,例如数据块 搬移后,要寻找其中不一致的地方,则应该在CMPS 指令前面使用REPE/REPZ前缀; 若已知两个数据块的内容基本不相同,要寻找其中 相一致的地方,则应该在CMPS/SCAS指令前面使用 REPNE/REPNZ前缀,例如查找程序;
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 注意:状态位随运算结果变化。
例2-1:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同,若相同,则AX=0; 若不同,记录不同字符在源数据区中的位 置。 LEA SI,Source
编程思路: 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作
LEA DI,Dest MOV CX,50 CLD Again: CMPSB JNE Found DEC CX JNZ Again MOV AX,0 JMP Over Found: DEC SI MOV AX, SI Over: HLT
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配合使用,找第一个不相同的数据位置)
该指令就是把累加器AL/AX中的内容存到内存中,如 果使用重复前缀,则可以方便地将内存中的某一区 域初始化为某一数值。
例:使0404H开始的256个单元清0。
编程思路: 1、初始化指针SI,DI,CX, 置方向标志DF为0(CLD)或1(STD) 当然,程序中要用到的才进行初始化。 2、CPU中的寄存器AL清0
•串操作指令 1、MOVS指令 格式:MOVS dest,src MOVSB/MOVSW 功能:[ES:DI]←[DS:SI] DI±1或2, SI±1或2 注意:不影响状态位。
例1-1: 将数据段中起始地址 为Souce的100个字节 的数据传送到附加段 的Dest指向的单元中。
编程思路: 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作
LEA DI, DEST
MOV CX, 30 MOV AL, ‘A’
DI 53 71 41 49 68 DEST
REPNE SCASB
JE Found MOV BX,0
JMP Over
Found: DEC DI MOV BX, DI
Over: HLT
下面程序是查找STRING中是否有“A”这个字符,如果有则转向YES去执行, 没有则转向NO去执行。假设STRING的长度为20 个字节. MOV CX,20 MOV BX,-1 MOV AL,’A’ NEXT: INC BX CMP AL,STRING[BX] JE YES DEC CX JNZ NEXT JMP NO YES: …… …… JMP EXIT NO: …… …… EXIT:HLT
Souce
CLD
Again: MOVSB DEC CX
DI
JNZ Again
HLT
23 D0 05 AB
Dest

判 CX=0 ? 是,传送完毕;
否,进行②
② CX – 1 -> CX
③ 执行REP后的串操作。
④ 重复 ① ~ ③
2、CMPS指令 格式:CMPSB/CMPSW 功能:[DS:SI] -[ES:DI] DI±1或2, SI±1或2 注意:状态位随运算结果变化。通常在CMPS指令前加重 复前缀REPE/REPZ,用来寻找两个串中的第一个不相 同数据。
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
LEA DI, [0404H] MOV CX, 256 CLD
MOV AL,0 REP STOSB
3、将AL以串操作的方式 传到内存区域
5、LODS指令 格式:LODSB/LODSW 功能:AL/AX ←[DS:SI] SI±1或2 注意:不影响状态位。该指令就是把内存中的值取入 累加器AL/AX中,因为累加器只有一个,所以 LODSB/LODSW指令前加重复前缀没有意义。
LEA DI, DEST MOV CX, 30 CLD MOV AL,’A’ Again: SCASB JE Found DEC CX JNZ Again MOV BX,0 JMP Over Found: DEC DI MOV BX,DI Over: HLT
编程思路: DI 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作 3、操作结束? 若否,继续2中 的操作;否则结 束程序
相关文档
最新文档