非法内存参考

时间:2013-03-12 17:57:15

标签: assembly x86 x86-16 cpu-registers addressing-mode

我是汇编语言的初学者 试图实施STRCPY
我的汇编程序“TASM”返回“非法内存参考”错误..并尝试阅读有关错误但无法找到任何内容。

这是马代码。

include inout.asm
.Model Small,c
.486
.STACK 200h
.DATA
    Arr1 DB "ABCD$"
    Arr2 DB "EFGHIJ$"
.CODE
StART: MOV AX, @DATA
       MOV DS, AX

      LEA Si,Arr1
      LEA Di,Arr2

again:  cmp Byte PTR [Si], "$"
        JNE Ite ; Iterate
        JMP Done
         Ite: MOV Byte PTR[ Di ],[Si] ; Error Here
         Inc Si ; One Byte though
         Inc Di ; One Byte though
         JMP again
Done: MOV Byte PTR [Di], "$"
      call puts, offset Arr2
      Call puts, offset Arr1
 MOV AH,04CH
 MOV AL,0
 INT 21h
 END START

这是Assembler所说的......

C:\TASM\BIN>tasm /zi /z third
Turbo Assembler  Version 3.1  Copyright (c) 1988, 1992 Borland International

Assembling file:   third.ASM
                 Ite: MOV Byte PTR[ Di ],[Si] ; Error Here
**Error** third.ASM(18) Illegal memory reference
Error messages:    1
Warning messages:  None
Passes:            1
Remaining memory:  415k

btw我试过

MOV Byte PTR[DI],BYTE PT[SI]但无效

2 个答案:

答案 0 :(得分:2)

正如icepack指出的那样,你所拥有的不是有效的指令。

然后检查movs指令,它会将字节从[si]移动到[di]并同时递增两个索引计数器。

答案 1 :(得分:1)

asm x86中不允许执行此类操作。您无法将数据直接从一个存储单元移动到另一个存储单元。为此,您需要通过一个寄存器,例如:

mov al, byte ptr[di]
mov byte ptr[si], al