首先有两个buf,存放两个字符串
让SI存buf1, DI存buf2
由于SI的段基址是DS, DI的段基址是ES
所以在比较字符串的时候,我们让ES和DS端重合即可
对于字符串的输入问题:
让AH = 0AH DX = 串首址
CLD:让DF为0,即字符串指针增加方向。然后让SI与DI朝DF的方向自增1个字节
STD:让DF为1, 即字符串指针减小方向。然后让SI与DI朝DF方向自减一个字节
1.使用串处理时(比如串比较),一定要写
MOV ES,AX;附加段与数据段为同一段
ES附加段寄存器,用于指出存放附加数据的附加段的段地址
2.CLD指令功能:
将标志寄存器Flag的方向标志位DF清零。
在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。
3.串比较(影响标志位)
格式:CMPS DST,SRC
CMPSB
CMPSW
CMPS(Compare String):串比较 CMPS指令的语法格式为:
CMPSB
CMPSW
CMPSD 功能: DS:[SI] - ES:[DI]; if(DF=0) then
SI=SI+size;
DI=DI+size; else
SI=SI-size;
DI=DI-size;
CMPSB\CMPSW\CMPSD将DS:SI所指源串的一个字节、字、双字与ES:DI所指目的串的一个字节、字、双字进行比较,根据比较结果设置标志位。然后,若DF=0,则SI和DI增加1,2,4。否则SI和DI减少1,2,4。
对标志位的影响:有,同CMP
因此
CMPSB:字节串比较
DS:[SI] - ES:[DI]
SI<-SI+(-)1,DI<-DI+(-)1
CMPSW:字串比较
DS:[SI] - ES:[DI]
SI<-SI+(-)2,DI<-DI+(-)2
MOVS ( MOVe String) 串传送指令
MOVSB //字节串传送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
MOVSW //字串传送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.
在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.
1.目的串必须在附加段中,即必须是ES:[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI])