为什么此代码会导致访问冲突异常?

时间:2010-10-13 11:57:19

标签: assembly x86 64-bit x86-64

_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宏汇编程序(ml64.exe)进行编译。 该程序在程序的第一行(mov r10,rdi)上发生访问冲突异常崩溃。有谁知道为什么?

编辑:我应该澄清一下。如果我删除第一行,则下一个仍然会发生异常。如果我删除它,它会发生在下一个(mov rdi,rcx)。

3 个答案:

答案 0 :(得分:1)

我怀疑你的问题是你为这段代码定义了自己的特殊段,并且它没有被标记为可执行文件,因此它被加载到一个拒绝执行权限的内存区域。毫无疑问,有一种方法可以告诉MASM一个段将包含代码,而不是数据;试试看。

答案 1 :(得分:1)

正如Zack建议的那样,尝试将您的程序放在一个包含代码的段中。在MASM中,你通常会这样做:

.code
memcpy_r PROC
[ ... ]
memcpy_r ENDP

END

[Edit2]要与其他代码相关联,您可能还希望将PROC标记为PUBLIC

[EDIT1] 作为旁注,既然你没有另外指定MASM是一个Windows程序,我假设你正在组装它以便在Win64上使用?如果是这种情况,您似乎不会关注Win64 calling convention,它会传递RCXRDXR8和{{1}中的前4个参数}。

答案 2 :(得分:0)

如果您将项目编译为i386可执行文件,那么它将以传统模式运行而无需访问64位寄存器(%rax,%r10等)。也许这就是问题?反汇编您的可执行文件并检查compilator - i386或x86_64生成的代码。