在Assemply语言编程8086中移动字符串而不使用字符串指令

问题描述

; Moving a string without using string instructions

ASSUME CS:CODE,DS:DATA,ES:EXTRA

DATA SEGMENT
    SOURCE  DB  11H,22H,33H,44H
DATA ENDS

EXTRA SEGMENT
    DEST    DB  ?
EXTRA ENDS

CODE SEGMENT

START:  MOV AX,DATA
        MOV DS,AX

        MOV AX,EXTRA
        MOV ES,AX

        MOV SI,OFFSET SOURCE
        MOV DI,OFFSET DEST
        MOV CX,0004H
        CLD

TRANSFER:   
        MOV AL,[SI]
        MOV [DI],AL
        INC SI
        INC DI 
        ;DEC CX
        LOOPNE TRANSFER

        MOV AH,4CH
        INT 21H

CODE ENDS
END START

我已经尝试了该程序的以下变体:

  1. 使用LOOP代替LOOPNE
  2. 将JNZ与DEC CX结合使用Loop指令

但是我似乎无法传输数据字节。这是在masm中调试时的输出

Unassembled code

enter image description here

解决方法

我相信问题在于MOV [DI],AL指令。

没有段前缀,将假定DI中的地址在DS引用的段中,并且您要使用ES引用的段。

如果我没记错的话,语法是MOV ES:[DI],AL