📜  8086程序使用字符串指令传输字节块

📅  最后修改于: 2021-06-28 16:56:56             🧑  作者: Mango

问题–编写汇编语言程序,以使用字符串指令将字节块从一个存储位置传输到另一存储位置。

例子 –

例子 –

  1. 在此示例中,存储在CX寄存器中的计数器值为4。
  2. 从从501到504偏移开始的存储位置存储的数据块被传输到从600到603偏移开始的另一个存储位置。

假设–

  • 指示要传输的字节数的计数器的值存储在偏移量500中。
  • 从501开始,必须传输的8位数据存储在连续的存储位置中。
  • 数据将从600开始传输到连续的存储位置。
  • DS和ES的值等于0000。
  • 程序从偏移量400开始。

    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  

    算法 –

    1. 将偏移量SI的值设置为500。
    2. 将偏移量DI的值设置为600。
    3. 将值0000加载到寄存器AX中。
    4. 将AX寄存器的数据加载到DS(数据段)中。
    5. 将AX寄存器的数据加载到ES(额外段)中。
    6. 将偏移量SI的数据装入CL寄存器,将值00装入CH寄存器。
    7. 将SI的值增加1。
    8. 清除方向标志,以便将数据从较低的内存读取到较高的内存位置。
    9. 检查CX的值,如果不等于零,则重复步骤10,否则转到步骤11。
    10. 将数据从源存储位置传输到目标存储位置,并将CX的值减一。
    11. 停止。

    程序 –

    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

    解释 –

    1. MOV SI,500:将值500加载到offSI中。
    2. MOV DI,600:将值600加载到偏移量DI中。
    3. MOV AX,0000:将值0000装入AX寄存器。
    4. MOV DS,AX:将AX寄存器的值加载到DS(数据段)中。
    5. MOV ES,AX:将AX寄存器的值加载到ES(额外段)中。
    6. MOV CL,[SI]:将偏移量SI的数据加载到CL寄存器中。
    7. MOV CH,00:将值00加载到CH寄存器中。
    8. INC SI:INC的值增加一。
    9. CLD:清除方向标志,即DF = 0。
    10. REP:重复直到CX的值不等于零,并在每一步将CX的值减一。
    11. MOVSB:将数据从源存储位置传输到目标存储位置。
    12. HLT:结束。