串操作指令的书面化解释书上都有,咱来讲讲通俗的理解
某种指令的出现是有它功能化的需求的,串操作指令出现的就是为了解决传统指令编码过程中只能进行一个一个传送,采用串操作指令就可以实现一串一串的传送,传送效率会提高很多
串操作指令可实现的功能
串操作指令格式
传送
指令格式
MOVSB ;字节传送(B表示BYTE)
功能:
ES:[DI] <— DS:[SI] , SI<—SI±1 , DI <—DI±1 因为16进制存储时,一个单元就是8位,即一个字节,所以字传送为 ±1,理解见下图
MOVSW ;字传送(W表示字)
ES: [DI] <— DS:[SI], SI<—SI ±2,DI <—DI ± 2 [ ]代表使用寄存器间接寻址
MOVS 目的串名,源串名 (此格式要求串名类型一致,且以类型区别是字还是字节操作)
用复位方向指令CLD(DF=0),和执行置位方向指令STD(DF=1),指明指令传送的方向
DF = 0,SI/DI增加一个单元;DF=1,SI/DI减少一个单元 DF是标志寄存器中的方向标志位
(记忆:0为正,正为加,1为负,负为减法,和原码中0,1所表示的正负功能相同;
CLD即cleard,表示清零,复位;STD即standard outpt,表示标准输出,DF=1)
补充:
目的串操作数的偏移地址隐含在DI(目的变址寄存器)中,源串操作数的偏移地址隐含在SI(源变址寄存器)中 (偏移地址:某一地址相对于首地址的偏移量)
源串隐含在数据段(DS) 目的串隐含在附加数据段(ES)
REP 重复指令,重复次数存放在CX中
十六进制与二进制图示
存储 Storage
STOSB/STOSW
指令具体的格式同上,但使用的寄存器有变化,串存储指令将AL/AX寄存器的内容装入到由DI指定的附加段主存单位中(ES)
功能:
STOSB ;字节串存储 ES:[DI] <— AL,DI <— DI ± 1 AL输入的是低八位,即字节存储,没错一个字节是八位
STOSW ;字串存储 ES :[DI] <— AX,DI <—DI ± 2 AX输入全部的16位,即字存储
在串操作指令中,目的操作数用目的变址寄存器DI寻址,默认在附加段寄存器ES中,且不可进行段超越
图示:
读取 Load(加载)
LODSB/LODSW
功能:
LODSB ;字读取指令 AL <— DS:[SI], SI <—SI ±1
LODSW ;字节读取指令 AX <— DS:[SI], SI <—SI ±2
串操作指令中,源操作数用寄存器SI寻址,默认在数据段DS中,可进行段超越
扫描 Scan
SCASB/SCASW 串扫描指令会影响标志位
功能:将DI中的内容与AX/AL中的内容进行比较
SCASB ; 字节串扫描指令 AL - ES:[DI] DI <—DI ± 1
SCASW ; 字串扫描指令 AX - ES:[DI] DI <— DI ± 2
比较 Compare
CMPSB/CMPSW 用于比较源串和目的串是否相同,他们的字母化表示是什么,自己写写
可以参照比较指令中的减法
答案如下:
CMPSB ;字节串比较 DS:[SI] - ES:[DI] SI <— SI±1, DI <—DI±1
CMPSW ; 字串比较 DS:[SI] - ES:[DI] SI <— SI±2, DI <—DI±2
这五条指令对指令标志位的影响
记图更方便
重复前缀REP(repeat)
功能:用于设置某指令执行时的重复次数(次数的具体数值,保存在CX中)
三种指令格式,对应三种功能,可对其规定范围内的指令产生影响,即重复执行
三种指令的使用要求
REP:
begin:
CX-1;
when(CX=0);
break;
end
REPZ:
begin
CX-1
if(ZF == 0):
break
elif(CX == 0):
break
else:
continue
end
REPNZ
begin
CX-1
if(ZF==1):
break
elif(CX==0):
break
end
ZF = 1 代表串相等,即相减结果为0
ZF = 0 代表串不等,即相减结果不为0
ZF是标志寄存器中的零标志位,用于判断计算结果是否为0