设数据区有两个字节串,串1的长度为5,串2的长度为10。编程: 若串2的最后5个字符和串1相同,则置FLAG单元为“Y”,否则置为“N”。(要求用串比较指令完成
DATAS SEGMENT
;此处输入数据段代码
BUF1 DB 'ABCDE$'
BUF2 DB '12345ABCDE$'
BUF3 DB 'FLAG=$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV ES,AX;附加段与数据段为同一段
MOV BX,5
LEA SI,BUF1;源串首地址
LEA DI,BUF2[BX];目的串首地址
CLD;
MOV AH,9
LEA DX,BUF3;输出FLAG=
INT 21H
MOV CX,5
REPE CMPSB;串比较
JZ JL1
MOV AH,2
MOV DL,'N'
INT 21H
JMP EXIT
JL1:
MOV AH,2
MOV DL,'Y'
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
注意
1.使用串处理时(比如串比较),一定要写
MOV ES,AX;附加段与数据段为同一段
ES附加段寄存器,用于指出存放附加数据的附加段的段地址
2.CLD指令功能:
将标志寄存器Flag的方向标志位DF清零。
在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。
3.串比较(影响标志位)
格式:CMPS DST,SRC
CMPSB
CMPSW
4、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