从进程入口点调用时发生 Printf 访问冲突

问题描述 投票:0回答:1

我是一名初学汇编程序员。我正在尝试使用 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 
windows assembly x86-64 masm masm64
1个回答
0
投票

假设您的

printf()
实现遵循标准 x86-64 ABI,它需要
fmt
寄存器中的第一个参数 (
rdi
) 和
hello
寄存器中的第二个参数 (
rsi
)。

有关更多详细信息,请在 x86-64 psABI 中查找注册用法

© www.soinside.com 2019 - 2024. All rights reserved.