NASM有一个win API,但我尝试c链接NASM发生错误

时间:2016-09-27 03:01:46

标签: c winapi gcc assembly nasm

这是NASM代码,我可以确定代码是正常的

使用golink来exe可以工作

GLOBAL _echoStr
EXTERN GetStdHandle, WriteConsoleA, ExitProcess

SECTION .data
msg                 DB "Hello World!", 13, 10, 0
msg.len             EQU $ - msg
STD_OUTPUT_HANDLE   EQU -11
NULL                EQU 0

SECTION .bss
dummy   RESD 1

SECTION .text
_echoStr:
    PUSH    STD_OUTPUT_HANDLE
    CALL    GetStdHandle

    PUSH    NULL
    PUSH    dummy
    PUSH    msg.len
    PUSH    msg
    PUSH    EAX
    CALL    WriteConsoleA

    PUSH    NULL
    CALL    ExitProcess

这是C代码,我想也许是正常的

#include <windows.h>

extern void echoStr();

int main()
{
    echoStr();
    return 0;
}

接下来,我编译NASM

nasm test.asm -f win32 -o testF.o

接下来,我尝试编译C代码和NASM obj文件

gcc -o main test.c testF.o

错误消息是

C:\C>gcc -o main test.c testF.o
testF.o:test.asm:(.text+0x3): undefined reference to `GetStdHandle'
testF.o:test.asm:(.text+0x17): undefined reference to `WriteConsoleA'
testF.o:test.asm:(.text+0x1e): undefined reference to `ExitProcess'
collect2.exe: error: ld returned 1 exit status

我不明白ld应该链接kernel32.dll

我失去了哪些步骤?

0 个答案:

没有答案