big amount of data [memory to memory]

Тема в разделе "WASM.BEGINNERS", создана пользователем anon17600, 3 янв 2010.

  1. anon17600

    anon17600 New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2010
    Сообщения:
    1
    Подобный вопрос, очевидно уже задавался. Но гугл мне не помог абсолютно.
    В общем есть некие данные.
    Код (Text):
    1.  prefix db "very big amount of data thats cannot fit into a singly 32bit register",0
    2.  postfix db "and here is some more data, thats cannot fit into a 32bit register",0
    3.  tempbuf rb 512d
    И с этими data, нужно выполнить микрософтовский lstrcat, а lstrcat по природе своей, перезаписывает первую полученную строку, а мне она как бы нужна будет позднее позднее в неизменном виде. Логичным было бы скопировать ее куда либо еще перед вызовом, дабы потом восстановить. Однако MOV не позволяет копировать memory to memory, т.е. на прямую. Следовательно для этого задействуется регистр, который выступает посредником:
    Код (Text):
    1.  mov eax,[prefix]
    2.  mov [tempbuf],eax
    И проблема, тащемта, в том что данное количество data не помещается в регистр, и у меня никоим образом не получается скопировать строку.
    Каким образом копируют в подобной ситуации?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это умеет делать movsb/movsw/movsd - копирует байт/слово/двойное слово memory-to-memory. с префиксом rep копирует сколько нужно байт/слов/двойных слов (количество в ECX)
    в общем случае
    Код (Text):
    1. mov esi, prefix ; откуда копировать
    2. mov edi, tempbuf ; куда копировать
    3. mov ecx, postfix-prefix ; длина (байт)
    4. rep movsb
    при подключении CRT:
    Код (Text):
    1. cinvoke strcpy, tempbuf, prefix
    с легкой оптимизацией
    Код (Text):
    1. mov esi, prefix
    2. mov edi, tempbuf
    3. mov edx, postfix-prefix
    4. mov ecx, edx
    5. shr ecx, 2
    6. rep movsd
    7. mov ecx, edx
    8. and ecx, 3
    9. rep movsb
    (для длинных буфферов, очень длинных)
     
  3. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Оно туда и не поместится. Туда поместится только указатель.
    Наверное, гуру укажут более кошерный способ, но все же...
    объявить buff db 512 dup(0)
    invoke lstrcat,addr buff,addr prefix
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ant
    wtf? может все-таки предложенный мной lstrcpy/strcpy
     
  5. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Конечно лучше. Это я долго писАл. :)
     
  6. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    на байт короче на регистр меньше :)

    Код (Text):
    1. mov esi,prefix
    2. mov edi,tempbuf
    3. mov ecx,postfix-prefix
    4.        shr ecx,1
    5.        jnc @F
    6.        movsb
    7.     @@:shr ecx,1
    8.        jnc @F
    9.        movsw  
    10.     @@:rep movsd
    Жаль только что с копированием в обратную сторону не все так просто. >_<