Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在程序集中正确调用64位Windows API_Windows_Assembly_64 Bit_Nasm - Fatal编程技术网

如何在程序集中正确调用64位Windows API

如何在程序集中正确调用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

使用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]
在堆栈指针下寻址,这是个坏主意。不管您在那里写什么,调用
都会覆盖它。
看来你需要复习一下你的通话习惯。必须为寄存器中的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部分工作准确,但是我没有看到任何字符串发送到控制台。