Подобный вопрос, очевидно уже задавался. Но гугл мне не помог абсолютно. В общем есть некие данные. Код (Text): prefix db "very big amount of data thats cannot fit into a singly 32bit register",0 postfix db "and here is some more data, thats cannot fit into a 32bit register",0 tempbuf rb 512d И с этими data, нужно выполнить микрософтовский lstrcat, а lstrcat по природе своей, перезаписывает первую полученную строку, а мне она как бы нужна будет позднее позднее в неизменном виде. Логичным было бы скопировать ее куда либо еще перед вызовом, дабы потом восстановить. Однако MOV не позволяет копировать memory to memory, т.е. на прямую. Следовательно для этого задействуется регистр, который выступает посредником: Код (Text): mov eax,[prefix] mov [tempbuf],eax И проблема, тащемта, в том что данное количество data не помещается в регистр, и у меня никоим образом не получается скопировать строку. Каким образом копируют в подобной ситуации?
Это умеет делать movsb/movsw/movsd - копирует байт/слово/двойное слово memory-to-memory. с префиксом rep копирует сколько нужно байт/слов/двойных слов (количество в ECX) в общем случае Код (Text): mov esi, prefix ; откуда копировать mov edi, tempbuf ; куда копировать mov ecx, postfix-prefix ; длина (байт) rep movsb при подключении CRT: Код (Text): cinvoke strcpy, tempbuf, prefix с легкой оптимизацией Код (Text): mov esi, prefix mov edi, tempbuf mov edx, postfix-prefix mov ecx, edx shr ecx, 2 rep movsd mov ecx, edx and ecx, 3 rep movsb (для длинных буфферов, очень длинных)
Оно туда и не поместится. Туда поместится только указатель. Наверное, гуру укажут более кошерный способ, но все же... объявить buff db 512 dup(0) invoke lstrcat,addr buff,addr prefix
на байт короче на регистр меньше Код (Text): mov esi,prefix mov edi,tempbuf mov ecx,postfix-prefix shr ecx,1 jnc @F movsb @@:shr ecx,1 jnc @F movsw @@:rep movsd Жаль только что с копированием в обратную сторону не все так просто. >_<