Почему этот код вызывает исключение нарушения прав доступа? - PullRequest
1 голос
/ 13 октября 2010
_memcpy_r SEGMENT

memcpy_r PROC
 mov r10, rdi
 mov r11, rsi
 mov rdi, rcx
 mov rsi, rdx
 mov rcx, r8
 shr rcx, 3
 rep movsq
 mov rcx, r8
 and rcx, 7
 rep movsb
 mov rsi, r11
 mov rdi, r10
 ret
memcpy_r ENDP

_memcpy_r ENDS

END

У меня есть вышеуказанный код в файле .asm, который я использую в проекте Visual Studio 2010.Он настроен на компиляцию с использованием Microsoft Macro Assembler (ml64.exe).Сбой программы с исключением нарушения прав доступа в первой строке процедуры (mov r10, rdi).Кто-нибудь знает почему?

РЕДАКТИРОВАТЬ: Я должен уточнить.Если я удаляю первую строку, исключение все еще происходит на следующей.Если я удаляю это, это происходит на следующем (mov rdi, rcx).

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Я подозреваю, что ваша проблема в том, что вы определяете свой собственный специальный сегмент для этого кода, и он не помечается как исполняемый в исполняемом файле, поэтому он загружается в область памяти, для которой разрешение на выполнение запрещено.Несомненно, есть какой-то способ сказать MASM, что сегмент будет содержать код, а не данные;попробуй это.

1 голос
/ 14 октября 2010

Как предлагает Зак, попробуйте поместить вашу процедуру в сегмент, который должен содержать код.В MASM вы обычно делаете это следующим образом:

.code
memcpy_r PROC
[ ... ]
memcpy_r ENDP

END

[Edit2] Чтобы связать с другим кодом, вы также можете пометить PROC как PUBLIC.

* 1007.* [Edit1] В качестве примечания, поскольку вы не указали иное, а MASM - это программа для Windows, я предполагаю, что вы собираете ее для использования на Win64?В этом случае вы, похоже, не следуете соглашению о вызовах Win64 , которое передает первые 4 параметра в RCX, RDX, R8 и R9.
0 голосов
/ 14 октября 2010

Если вы скомпилируете свой проект как исполняемый файл i386, он будет работать в устаревшем режиме без доступа к 64-битным регистрам (% rax,% r10 и т. Д.).Может в этом проблема?Разберите свой исполняемый файл и проверьте, какой код сгенерирован компилятором - i386 или x86_64.

...