_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)。答案 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,它会传递RCX
,RDX
,R8
和{{1}中的前4个参数}。
答案 2 :(得分:0)
如果您将项目编译为i386可执行文件,那么它将以传统模式运行而无需访问64位寄存器(%rax,%r10等)。也许这就是问题?反汇编您的可执行文件并检查compilator - i386或x86_64生成的代码。