编程题目解析
假设数据项定义如下:
DATA1 DB 'HELLO! GOOD MORNING!'
DATA2 DB 20 DUP(?)
用串操作指令编写程序段,使其分别完成以下功能:
(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,AX
MOV 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,DATA1
LEA DI,DATA2
MOV CX,20
CLD
REPE CMPSB
`
先取得偏移地址,将CX填入字符长度,设置比较方向为增地址方向
如果相等就重复 REPE CMPSB,依次比较一个B,直到CX减到0,结束
`
(3)把DATA1中的第3和第4字节装入AX
LEA SI,DATA1
ADD SI,2
LODSW
`
取得偏移地址再操作,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 STOSW
LEA DI,DATA2
ADD DI,5
MOV CX,15 ;每次移动1B
CLD
REP STOSB
标签:题目,编程,MOV,地址,CX,AX,解析,DATA1,DATA2
From: https://www.cnblogs.com/lichenglin1023/p/18246627