使用NASM和Mingw-w64我一直在试图运行下面的程序,它应该使用Windows API将消息打印到屏幕上。 它运行,但没有显示在控制台上,并导致对内存位置的无效访问(错误代码0x3e6h)。 为什么是这样,我怎样才能让程序正常运行?
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]
在堆栈指针下面寻址,这是一个坏主意。 无论你写什么,无论如何都会被call
覆盖。 看起来你需要刷新你对调用约定的知识。 必须分配寄存器中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