Копирование содержимого массива в другой массив в сборке - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь скопировать некоторые элементы массива в другой в сборке.Оба массива доступны через указатели, которые хранятся в регистрах.Таким образом, edx будет указывать на один массив, а eax будет указывать на другой.По сути, edx указывает на массив символов, считываемых из текстового файла, и я бы хотел, чтобы eax содержал только 32 символа.Вот что я пытаюсь сделать:

Сборка I386 с использованием NASM

add edx, 8 ; the first 8 characters of the string are not wanted

mov cl, 32
ip_address:
; move the character currently pointed to by edx to eax (mov [eax], [edx])
inc edx
inc eax
loop ip_address

Опять же, я хотел бы разместить 32 символа после первых восьми для размещения во второммассив.Проблема в том, что я нахожусь в тупике, как это сделать .. Любая помощь очень ценится.

Ответы [ 3 ]

3 голосов
/ 09 марта 2011

И ia32, и ia64 do содержат инструкцию перемещения строки из памяти в память, которая может перемещать байты, "слова" и "двойные слова".

movsb
movsw
movsd

Адрес источника указывается в ESI, а адрес назначения - в EDI. 1 Сам по себе он перемещает один байт, слово или двойное слово. Если используется префикс rep , то ECX будет содержать счетчик, и инструкция будет перемещать всю строку значений.


1. Я думаю, что эти инструкции являются причиной того, что регистры ESI и EDI так названы. (Исходный указатель и целевой указатель.)

3 голосов
/ 09 марта 2011

Вы не можете делать прямые перемещения из памяти в память в x86. Вам нужно использовать другой регистрационный список:

mov ecx, [edx]
mov [eax], ecx

Или что-то в этом роде ...

0 голосов
/ 09 марта 2011

Простое решение состоит в том, чтобы просто сделать:

mov  ebx, [edx]
mov [eax], ebx

Имейте в виду, что под ABI многих платформ ebx является регистром сохранения вызовов, поэтому вам необходимо сохранить и восстановить его значение в вашей функции.

Более простое решение состоит в связывании со стандартной библиотекой и вызове memcpy, что вполне приемлемо при сборке и обычно будет значительно быстрее, чем написание вашего собственного цикла.

...