我是一名初学汇编程序员。我正在尝试使用 Visual Studio 2022 在 Windows 上创建 Hello World。无论我尝试什么,我总是遇到相同的错误。我在网上查了一下,但我的代码看起来不错。我一定是错过了什么。
includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
includelib legacy_stdio_definitions.lib
ExitProcess proto
printf proto
.data
fmt byte "%s",13,10,0
hello byte "Hello world!",0
.code
main proc
push rbp
mov rbp, rsp
sub rsp, 40
lea rcx, fmt
lea rdx, hello
call printf
add rsp, 40
mov rcx, 0
call ExitProcess
main endp
end
我在
printf
遇到访问冲突。我省略了尾声,因为它在那之前就中断了。
Exception thrown at 0x00007FFF2FAD34F6 (ntdll.dll) in hello_world.exe: 0xC0000005: Access violation writing location
这是 Visual Studio 为链接器生成的命令行:
/OUT:"x64\Debug\hello_world.exe" /MANIFEST /NXCOMPAT
/PDB:"x64\Debug\hello_world.pdb" /DYNAMICBASE "libucrt.lib"
"kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib"
"advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib"
"odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X64 /ENTRY:"main" /INCREMENTAL /PGD:"x64\Debug\hello_world.pgd" /SUBSYSTEM:CONSOLE
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Debug\hello_world.exe.intermediate.manifest"
/LTCGOUT:"x64\Debug\hello_world.iobj" /ERRORREPORT:PROMPT
/ILK:"x64\Debug\hello_world.ilk" /NOLOGO /TLBID:1
假设您的
printf()
实现遵循标准 x86-64 ABI,它需要 fmt
寄存器中的第一个参数 (rdi
) 和 hello
寄存器中的第二个参数 (rsi
)。
有关更多详细信息,请在 x86-64 psABI 中查找注册用法。