0

要素ごとに文字列をアセンブリ言語の別の文字列に移動しようとしています。問題は、アセンブリ時に「相対型を追加できません」などのエラーが発生し続けることです。これはなぜですか?また、STRING から 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
4

1 に答える 1

2

この式STRING[ITERATOR]は、Intel アセンブリでは表現できません。1 つの命令で使用できるメモリ参照は 1 つだけです。それ以外はレジスターでなければなりません。さらに、次を使用しない限り、メモリをメモリに直接移動することはできません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
于 2015-11-03T20:02:42.327 に答える