编程题目解析
假设数据项定义如下:
DATA1 DBHELLO!GOOD MORNING!
DATA2 DB20DUP(?)
用串操作指令编写程序段,使其分别完成以下功能:
(1)从左到右将DATA1中的字符串传送到DATA2中。
(2)传送完毕后,比较DATA1和DATA2中的内容是否相同:(3)把DATA1中的第3和第4字节装人AX。
(4)将AX的内容存人从DATA2+5开始的字节单元中。
(1)从左到右将DATA1中的字符串传送到DATA2中
MOV AX,SEG DATA1 ;SEG是获取标号的段地址,OFFSET是获取标号的段间的地址,也就是偏移地址;MOV DS,AXMOV AX,SEG DATA2 MOV ES,AX ;目标串就是在ES段,将ES段初始化LEA SI,DATA1 ;取偏移地址LEA DI,DATA2 ;取偏移地址MOV CX,20 ;串长度CLD REP MOVSB ;相当于循环指令,直到CX减到0`串操作指令要求:(1) 源串默认在DS段(数据段),允许段重设,偏移地址为SI给出(2) 目标串默认再ES段(附加段),不允许段重设,因此必须先将ES段初始化,偏移地址由DI给出(3) 串长度值由CX给出(4) 操作方向与DF有关系 DF=0,按照增地址依次修改,DF=1,按照减地址依次修改(5) 可以使用重复前缀 REP `
(2)传送完毕后比较DATA1和DATA2中的内容是否相同
LEA SI,DATA1LEA DI,DATA2MOV CX,20CLDREPE CMPSB
`先取得偏移地址,将CX填入字符长度,设置比较方向为增地址方向如果相等就重复 REPE CMPSB,依次比较一个B,直到CX减到0,结束`
(3)把DATA1中的第3和第4字节装入AX
LEA SI,DATA1ADD SI,2LODSW
`
取得偏移地址再操作,SI开始存放的为字符串首地址,+2 之后变为第三个字符存放位置
LOADSW:将串装入AX或AL;STOS是将AX或AL串存入ES:DI指向的存储单元
`
(4)将AX的内容存入从DATA2+5开始的字节单元
LEA DI,DATA2
ADD DI,5
MOV CX,8 ; 20-5=15,0-15有16个,每次移动2B,移动8次就可以了
CLD
REP STOSWLEA DI,DATA2
ADD DI,5
MOV CX,15 ;每次移动1B
CLD
REP STOSB