2016-12-25 9 views
0

Я написал процедуру копирования строки в masm32копия процедура строки сборки

coppystring proc uses esi edi ecx source:dword,dest:dword 
         mov esi, OFFSET source 
         mov edi, OFFSET dest 
         mov ecx, SIZEOF source 
        Lx: 
         mov al,[esi]   
         mov [edi],al   
         inc esi    
         inc edi 
         loop Lx 

coppystring endp 

Этот код дает мне ошибку

A2098 недопустимый операнд для OFFSET

Выражение после OFFSET оператора должно быть выражением памяти или непосредственным выражением. Но до сих пор я не знаю, как исправить мой процедурный

+2

Как бы то ни было, глядя на то, что вы пытаетесь сделать - 'source' и' dest', вероятно, указатели, которые хранятся в стеке в качестве параметров. Вы должны иметь возможность получить эти адреса таким образом. 'mov esi, source' и' mov edi, dest'. Я делаю предположение, что 'source' и' dest' являются указателями на передаваемые строки. Кроме того, 'SIZEOF source' не даст вам длину строки, это даст вам размер' source', который является 'dword'. Таким образом, размер всегда будет 4. Вероятно, вы хотите создать цикл, который копирует до тех пор, пока не будет найден символ NUL (0) или не будет передано количество символов для копирования в качестве третьего параметра. –

ответ

1

Вы получаете те ошибки, так как адрес памяти source и dest не известны во время компиляции. Вы должны передать адрес процессу. Кроме того, как прокомментировано, вы не можете использовать SIZEOF и должны проверить нулевой ограничитель или получить длину другим способом.

invoke coppystring,offset str1,offset str2 ; Push the offsets here 

coppystring proc uses esi edi source:dword,dest:dword 
    ; Generally only need to preserve esi, edi and ebx 

mov esi, source 
mov edi, dest 

Lx: 
    mov al,[esi]   
    mov [edi],al   
    inc esi    
    inc edi 
    cmp byte ptr [esi],0 ; Check for null terminator 
    jne Lx     ; loop if not null 

ret 
coppystring endp