Visual studio 未定义的符号:VisualStudio MASM中的rax

Visual studio 未定义的符号:VisualStudio MASM中的rax,visual-studio,masm,Visual Studio,Masm,我正在使用assembly获取进程PEB的地址,但我无法编译它 这是x64 asm代码,但它给出了错误“undefined symbol:rax”,这毫无意义。不管我是用x86还是x64编译它都无关紧要。我有一个单独的.asm文件,它具有相同的功能,但有x86寄存器等 .386 .model flat, C .code get_peb_internal_x64 proc assume gs:nothing mov rax, gs:[60h] ret get_peb_i

我正在使用assembly获取进程PEB的地址,但我无法编译它

这是x64 asm代码,但它给出了错误“undefined symbol:rax”,这毫无意义。不管我是用x86还是x64编译它都无关紧要。我有一个单独的.asm文件,它具有相同的功能,但有x86寄存器等

.386
.model flat, C

.code

get_peb_internal_x64 proc
    assume gs:nothing
    mov rax, gs:[60h]
    ret
get_peb_internal_x64 endp

end
--现在,x86版本总是编译

.386
.model flat, C

.code

get_peb_internal_x86 proc
    assume fs:nothing
    mov eax, fs:[30h]
    ret
get_peb_internal_x86 endp

end

感谢@MichaelPetch,我已经解决了我的问题

问题的原因是我有.model和.386指令,正如我刚才读到的,这些指令在x64 masm中没有使用,还有假设gs:nothing

我已将代码改编成一个文件,结果如下:

ifdef rax
else
.386
.model flat, C
endif

.code

ifdef rax

get_peb_internal_x64 proc
mov rax, gs:[60h]
    ret
get_peb_internal_x64 endp

else

get_peb_internal_x86 proc
assume fs:nothing
    mov eax, fs:[30h]
    ret
get_peb_internal_x86 endp

endif

end

对于64位代码删除
.386
.model flat,C
这并不能解决我的错误,它只给了我3个不同的必须是段内块错误。我应该用什么来代替?为什么我不应该使用它们?你确定你正在使用ML64.EXE进行组装吗?听起来就像是在组装32位的。或者,如果您使用的是Visual Studio C/C++项目,是否确实将其设置为64位(x86-64)而不是32位x86?我检查了保存x64代码的文件,这是命令行:ml64.exe/C/nologo/Zi/Fo“x64\Release\modules\u internal_x64.obj”/Fl”“/W3/errorReport:prompt/Tait现在可以工作了,非常感谢mike!如果你愿意,你可以提交你的答案,我会接受的