当前位置: 代码迷 >> 综合 >> 8086/8088指令系统详解之(4)串操作
  详细解决方案

8086/8088指令系统详解之(4)串操作

热度:12   发布时间:2023-12-10 20:10:59.0

串操作指令

串操作指令的特征是对数据块(字符串或数值串)进行操作,并且其中部分指令可以两个操作数同时是存储器操作数。
MOVS (Move string) 串传送
CMPS (Compare string) 串比较
SCAS (Scan string) 串扫描
LODS (Load from string) 从串中取数据
STOS (Store in to string) 存数据到串中
这里写图片描述
这里写图片描述
说明:
⑴ 串操作指令每次执行完成一个字节或一个字的操作。
⑵ 通常使用重复前缀,用来完成数据块的操作。

重复前缀
⑴ REP 重复
⑵ REPE/REPZ 相等/为零则重复
⑶ REPNE/REPNZ 不相等/不为零则重复

特点:
⑴ 串操作指令需要指明每次操作的类型:可以直接写上操作数,或在助记符后面加上”B”或“W”
例如:MOVSB, CMPSW等。

⑵ 串操作指令使用DS:SI作为源操作数的指针;ES:DI作为目的操作数的指针。并且源操作数允许段超越,而目的操作数不允许段超越。

⑶ 使用DF来表示每次操作以后变址寄存器SI和DI的变化方向
CLD ;DF=0 SI,DI做增量变化,若为字操作则SI+2,DI+2;若为字节操作则SI+1,DI+1。
STD ;DF=1 SI,DI做减量变化 , 若为字操作则SI-2,DI-2;若为字节操作则SI-1,DI-1。

⑷ 有的串指令可加重复前缀,指令则按规定的操作重复进行。使用CX来表示用重复前缀以后指令需要重复执行的次数

(5) 对于某些影响ZF的传操作指令,可加重复前缀REPE/REPZ或REPNE/REPNZ,此时操作重复进行的条件有二:
1,CX不为0
2,ZF的值满足重复前缀的要求。REPE/REPZ要求(ZF)=1;REPNE/REPNZ要求(ZF)=0。

1,串传送指令MOVS(MOVe String)

格式:
[REP] MOVS [ES: ]dst_string, [seg: ]src_string
(默认源操作数段寄存器为DS,seg表示允许段超越)
[REP] MOVSB
[REP] MOVSW

操作:将一个字节或字从存储器的一个区域传送到另一个区域,然后根据类型和DF的值修改地址指针。

对状态标志位的影响:不影响状态标志位。

例:教材P132

2,串装入指令LODS(LOaD String)

格式:
LODS [seg: ]src_string
(默认源操作数段寄存器为DS,seg表示允许段超越)
LODSB
LODSW

操作:将源字符串中的一个字节或字从存储器的一个区域传送到AL或AX中,然后根据类型和DF的值修改地址指针。

对状态标志位的影响:不影响状态标志位。
:教材P133例4.11

3,串送存指令STOS(STOre String)

格式:
[REP] STOS [seg: ]dst_string
(默认目的操作数段寄存器为ES,seg表示允许段超越)
[REP] STOSB
[REP] STOSW

操作:将AL或AX中的内容送到目的字符串。,然后根据类型和DF的值修改地址指针。

对状态标志位的影响:不影响状态标志位。

例:教材P133例4.12
教材P134例4.13

4,串比较指令CMPS(CoMPare String)

格式:
[REPE/REPNE] CMPS [seg: ]src_string, [ES: ]dst_string
(默认源操作数段寄存器为DS,seg表示允许段超越)
[REPE/REPNE] CMPSB
[REPE/REPNE] CMPSW

操作:
将字符串中相应的元素逐个进行比较(即相减),但不讲比较结果送到目的操作数,而是影响标志位。然后根据类型和DF的值修改地址指针。CMPS与其他指令不同,源操作数在前,目的操作数在后。

加上重复前缀REPE/REPZ:若比较的两个字节(字)相等,因为执行的是相减操作,所以此时ZF=1,同时CX不为0,则继续比较。
加上重复前缀加上重复前缀REPNE/REPNZ:若比较的两个字节(字)不相等,因为执行的是相减操作,所以此时ZF=0,同时CX不为0,则继续比较。

对状态标志位的影响:影响所有状态标志位均有影响。

教材P135例4.14

5,串扫描指令SCAS(SCAn String)

格式:
[REPE/REPNE] SCAS [ES: ]dst_string
[REPE/REPNE] SCASB
[REPE/REPNE] SCASW

操作:
SCAS指令在一个字符串中搜索特定的关键字,然后根据类型和DF的值修改地址指针。字符串的起始位置只能放在(ES:DI)中,不允许段超越。待搜索的关键字必须放在AL或AX中。

操作:将字符串中相应的元素逐个与AL或AX进行比较(即相减),但不将比较结果送到目的操作数,而是影响标志位。然后根据类型和DF的值修改地址指针。CMPS与其他指令不同,源操作数在前,目的操作数在后。
加上重复前缀REPE/REPZ:若比较的两个字节(字)相等,因为执行的是相减操作,所以此时ZF=1,同时CX不为0,则继续比较。
加上重复前缀加上重复前缀REPNE/REPNZ:若比较的两个字节(字)不相等,因为执行的是相减操作,所以此时ZF=0,同时CX不为0,则继续比较。

对状态标志位的影响:影响所有状态标志位均有影响。

例: 教材P135例4.15,