【问题标题】:How to call Windows API in x64 MASM program如何在 x64 MASM 程序中调用 Windows API
【发布时间】:2023-01-03 01:19:21
【问题描述】:

我在 x64 Windows 操作系统中使用 MASM。我想调用 Windows API,然后将一些字符串输出到屏幕上。

我正在学习 Windows 操作系统中的 x64 汇编编程。今天我想将一些结果打印到控制台。然而,与linux操作系统不同的是,在windows中我们可以直接使用syscalls而不会有任何痛苦。我编写了以下程序来向控制台打印一条 hello world 消息,但它没有显示任何内容。我无法弄清楚这段代码有什么问题。


GetStdHandle PROTO
ExitProcess PROTO
WriteConsoleA PROTO

.data
    message         DB "Hello World",0
    message_size    DW SIZEOF message

.code
    main PROC
        SUB RSP, 5 * 8  
        
        MOV RCX, -11           
        CALL GetStdHandle

        MOV RCX, RAX     
        LEA RDX, message
        MOV R8, SIZEOF message - 1
        LEA R9, message_size  
        MOV  QWORD PTR [RSP + 4 * SIZEOF QWORD], 0
        CALL WriteConsoleA

        MOV RCX, 0      
        CALL ExitProcess
    main ENDP
END

对不起,如果你发现这个问题很愚蠢。我是堆栈溢出的新成员。谢谢你们。

【问题讨论】:

  • 这回答了你的问题了吗? How to write hello world in assembly under Windows?
  • 通常我会编写一个 C 程序并让 Visual Studio 生成汇编代码,这样我就可以看到用于 Windows API 的实际代码。
  • 代码看起来正确(包括堆栈对齐、主空间和参数使用)。我已经在此处组装并链接了代码并使其正常运行。您将哪些选项传递给汇编器和链接器来生成程序?

标签: c assembly winapi x86-64 masm


【解决方案1】:

您是否将其链接为控制台应用程序? Windows 区分写入 stdout 的控制台应用程序(这是你正在做的)和创建窗口并运行消息循环的 GUI 应用程序。

您需要将 /subsystem:console 指定为链接器标志。可能有一个 MASM 选项/指令做同样的事情。

【讨论】:

    猜你喜欢
    • 2012-08-03
    • 2021-12-05
    • 2011-01-02
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多