如何在程序集中正确调用64位Windows API
使用NASM和Mingw-w64,我一直在尝试运行以下程序,该程序应该使用Windows API将消息打印到屏幕上。它运行,但控制台上没有显示任何内容,并导致对内存位置的访问无效(错误代码0x3e6h)。为什么会这样?我怎样才能让程序正常运行如何在程序集中正确调用64位Windows API,windows,assembly,64-bit,nasm,Windows,Assembly,64 Bit,Nasm,使用NASM和Mingw-w64,我一直在尝试运行以下程序,该程序应该使用Windows API将消息打印到屏幕上。它运行,但控制台上没有显示任何内容,并导致对内存位置的访问无效(错误代码0x3e6h)。为什么会这样?我怎样才能让程序正常运行 global main extern ExitProcess extern GetStdHandle extern WriteFile section .text main: mov rcx, 0ffff
global main
extern ExitProcess
extern GetStdHandle
extern WriteFile
section .text
main:
mov rcx, 0fffffff5h
call GetStdHandle
mov rcx, rax
mov rdx, NtlpBuffer
mov r8, NtnNBytesToWrite
mov r9, NtlpNBytesWritten
mov dword [rsp - 04h], 00h
call WriteFile
ExitProgram:
mov rcx, 00h
call ExitProcess
section .data
NtlpBuffer: db 'Hello, World!', 00h
NtnNBytesToWrite: dd 0eh
section .bss
NtlpNBytesWritten: resd 01h
编者
nasm -f win64 test.asm
gcc -s -o test.exe test.obj
[rsp-04h]
在堆栈指针下寻址,这是个坏主意。不管您在那里写什么,调用都会覆盖它。
看来你需要复习一下你的通话习惯。必须为寄存器中的4个参数分配阴影空间,并且必须在其上放置更多参数
此外,要写入的字节数应该是实际的字节数,而不是指针
global main
extern GetStdHandle
extern WriteFile
section .text
main:
mov rcx, 0fffffff5h
call GetStdHandle
mov rcx, rax
mov rdx, NtlpBuffer
mov r8, [NtnNBytesToWrite]
mov r9, NtlpNBytesWritten
sub rsp, 40
mov dword [rsp + 32], 00h
call WriteFile
add rsp, 40
ExitProgram:
xor eax, eax
ret
section .data
NtlpBuffer: db 'Hello, World!', 00h
NtnNBytesToWrite: dq 0eh
section .bss
NtlpNBytesWritten: resd 01h
[rsp-04h]
在堆栈指针下寻址,这是个坏主意。不管您在那里写什么,调用都会覆盖它。
看来你需要复习一下你的通话习惯。必须为寄存器中的4个参数分配阴影空间,并且必须在其上放置更多参数
此外,要写入的字节数应该是实际的字节数,而不是指针
global main
extern GetStdHandle
extern WriteFile
section .text
main:
mov rcx, 0fffffff5h
call GetStdHandle
mov rcx, rax
mov rdx, NtlpBuffer
mov r8, [NtnNBytesToWrite]
mov r9, NtlpNBytesWritten
sub rsp, 40
mov dword [rsp + 32], 00h
call WriteFile
add rsp, 40
ExitProgram:
xor eax, eax
ret
section .data
NtlpBuffer: db 'Hello, World!', 00h
NtnNBytesToWrite: dq 0eh
section .bss
NtlpNBytesWritten: resd 01h
您是否尝试编写调用WriteFile
的小型C程序,并在64位构建中查看其反汇编?是的,但这让我有点困惑,因为我不习惯查看编译器优化的代码。我倾向于相信编译器在编写C程序时所发出的声音。您是否尝试编写调用WriteFile
的小型C程序,并在64位构建中查看其反汇编?是的,但这让我有点困惑,因为我不习惯查看编译器优化的代码。我倾向于相信编译器在编写C程序时所表现出来的东西。这一切都是有道理的,我真的应该多读一些书。对于初学者来说,我犯的很多错误都很容易犯,但我觉得我现在掌握得更好了。谢谢。当我运行用这段代码生成的可执行文件时,ExitProcess部分工作准确,但是我没有看到任何字符串发送到控制台。这一切现在都是有意义的,我真的应该多读一些书了。对于初学者来说,我犯的很多错误都很容易犯,但我觉得我现在掌握得更好了。谢谢。当我运行用这段代码生成的可执行文件时,ExitProcess部分工作准确,但是我没有看到任何字符串发送到控制台。