问题–编写汇编语言程序,以使用字符串指令将字节块从一个存储位置传输到另一存储位置。
例子 –
例子 –
- 在此示例中,存储在CX寄存器中的计数器值为4。
- 从从501到504偏移开始的存储位置存储的数据块被传输到从600到603偏移开始的另一个存储位置。
假设–
CLD指令用于清除方向标志,即DF = 0。现在,SI和DI的值将增加。
SI=SI+1
DI=DI+1
REP指令用于重复该步骤,直到CX的值不等于零并且CX的值在每一步都减一,即,
CX=CX-1
MOVSB指令仅用于将字节从源存储位置(MADS)传输到目标存储位置(MAES)。
MADS-->MAES
where MADS=DS*10+SI
MAES=ES*10+DI
此处,SI和DI的值会自动更新。
if DF=0, SI=SI+1 and DI=DI+1
算法 –
- 将偏移量SI的值设置为500。
- 将偏移量DI的值设置为600。
- 将值0000加载到寄存器AX中。
- 将AX寄存器的数据加载到DS(数据段)中。
- 将AX寄存器的数据加载到ES(额外段)中。
- 将偏移量SI的数据装入CL寄存器,将值00装入CH寄存器。
- 将SI的值增加1。
- 清除方向标志,以便将数据从较低的内存读取到较高的内存位置。
- 检查CX的值,如果不等于零,则重复步骤10,否则转到步骤11。
- 将数据从源存储位置传输到目标存储位置,并将CX的值减一。
- 停止。
程序 –
Address | Mnemonics | Comments | |||
---|---|---|---|---|---|
0400 | MOV SI, 500 | SI<-500 | |||
0403 | MOV DI, 00 | DI<-600 | |||
0406 | MOV AX, 0000 | AX<-0000 | |||
0409 | MOV DS, AX | DS<-AX | |||
040B | MOV ES, AX | ES<-AX | |||
040D | MOV CL, [SI] | CL<-[SI] | 0410 | MOV CH, 00 | CH<-00 |
0412 | INC SI | SI<-SI+1 | |||
0413 | CLD | clears the directional flag | |||
0414 | REP | repeat until CX is not equal to zero and CX=CX-1 at every step |
|||
0415 | MOVSB | transfer the data from source to destination memory location | |||
0416 | HLT | end |
解释 –
- MOV SI,500:将值500加载到offSI中。
- MOV DI,600:将值600加载到偏移量DI中。
- MOV AX,0000:将值0000装入AX寄存器。
- MOV DS,AX:将AX寄存器的值加载到DS(数据段)中。
- MOV ES,AX:将AX寄存器的值加载到ES(额外段)中。
- MOV CL,[SI]:将偏移量SI的数据加载到CL寄存器中。
- MOV CH,00:将值00加载到CH寄存器中。
- INC SI:INC的值增加一。
- CLD:清除方向标志,即DF = 0。
- REP:重复直到CX的值不等于零,并在每一步将CX的值减一。
- MOVSB:将数据从源存储位置传输到目标存储位置。
- HLT:结束。