String 将字符串元素移动到程序集中的另一个字符串中

String 将字符串元素移动到程序集中的另一个字符串中,string,assembly,emu8086,String,Assembly,Emu8086,我正在尝试将elemenet逐元素移动到汇编语言中的另一个字符串中。问题是我在汇编时不断遇到错误,比如:“无法添加相对类型”。为什么会发生这种情况?我如何修复它,以便将字符串中的所有元素复制到STRING2中 DATA SEGMENT PARA PUBLIC 'DATA' STRING DB 1, 2, 3, 4 ; first string LENGTH DB $-STRING ; length of the first string ITERATOR DB 0 DATA ENDS DATA

我正在尝试将elemenet逐元素移动到汇编语言中的另一个字符串中。问题是我在汇编时不断遇到错误,比如:“无法添加相对类型”。为什么会发生这种情况?我如何修复它,以便将字符串中的所有元素复制到STRING2中

DATA SEGMENT PARA PUBLIC 'DATA'
STRING DB 1, 2, 3, 4 ; first string
LENGTH DB $-STRING ; length of the first string
ITERATOR DB 0
DATA ENDS
DATA SEGMENT PARA PUBLIC  'DATA'
STRING2 DB 100 DUP (?) ; second string
DATA ENDS

CODE SEGMENT PARA PUBLIC 'CODE'
START PROC FAR
ASSUME CS:CODE, DS:DATA
PUSH DS
XOR AX, AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CL, LENGTH ; 
THELOOP:
MOV ITERATOR, CL
SUB ITERATOR, 1
MOV STRING2[ITERATOR], STRING[ITERATOR] ; this is where the error appears
LOOP THELOOP

RET
START ENDP
CODE ENDS
END START

此表达式,
STRING[ITERATOR]
不能在英特尔汇编中表示。 一条指令中只能使用一个内存引用;其他任何东西都必须是登记册。 此外,除非使用
movs
,否则不能直接将内存移动到内存:

push ds
push es
mov ax, DATA
mov ds, ax
mov es, ax

mov si, offset STRING
mov di, offset STRING2
xor ch, ch
mov cl, [LENGTH]
rep movsb          ; movsb: move a byte from ds:si to es:di, and increment si and di

pop es
pop ds
或者,在更接近您的解决方案时,您必须将内存值加载到寄存器中,然后将其存储:

  xor bx, bx
  xor ch, ch    # the loop instruction uses all of cx!
THELOOP:
  mov al, STRING[bx]
  mov STRING2[bx], al
  inc bx
  loop THELOOP