本文共 4661 字,大约阅读时间需要 15 分钟。
MingW, NASM
和 Visual Studio 的 link
程序,以及 Windows kit 的 kernel32.lib
文件,一一准备好。MingW
的下载、安装配置。gcc -v
测试环境是否配置好,配置好的情况下会输出如下信息:λ gcc -vUsing built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=D:/Program\ Files/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exeTarget: x86_64-w64-mingw32Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-posix-sjlj-rt_v6-rev0/mingw64 --enable-shared --enable-static --enable-targets=all --enable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-sjlj-exceptions --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch-32=i686 --with-arch-64=nocona --with-tune-32=generic --with-tune-64=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-sjlj-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-sjlj-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-sjlj-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib 'Thread model: posixgcc version 8.1.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
NASM
的下载和配置,下载直接去 NASM 官网,或者可以用我下面的链接:nasm -v
命令,成功配置的情况下窗口会输出信息:NASM version 2.14.02 compiled on Dec 26 2018
\Visual Studio 2019\VC\Tools\MSVC\14.24.28314\bin\Hostx86\x86
下,同样的复制目录并配置好环境变量。kernel32.lib
文件,该文件通常位于 Windows Kit 目录下。.asm
文件,可以通过生成文本文件再改后缀的形式生成,用记事本打开,并编辑如下代码:; hello.asmSTD_OUTPUT_HANDLE equ -11NULL equ 0global GobleyGookextern _ExitProcess@4, _GetStdHandle@4, _WriteConsoleA@20section .datamsg db "Hello World!", 13, 10, 0msg.len equ $ - msgsection .bssdummy resd 1section .textGobleyGook: push STD_OUTPUT_HANDLE call _GetStdHandle@4 push NULL push dummy push msg.len push msg push eax call _WriteConsoleA@20 push NULL call _ExitProcess@4
hello.asm
文件。这份文件待会用 LINK 链接,为了区分开来,再创建一个 helloworld.asm
文件,代码如下:SECTION .datamsg db 'Hello World!', 0Ah SECTION .textglobal _start _start: mov edx, 13 mov ecx, msg mov ebx, 1 mov eax, 4 int 80h mov ebx, 0 ; return 0 status on exit - 'No Errors' mov eax, 1 ; invoke SYS_EXIT (kernel opcode 1) int 80h
nasm -f win32 hello.asm -o hello.obj
,该命令的意义就是将一个 .asm
文件汇编生成一个 .obj
文件,在没有出错的情况下,工作目录会生成一个 heelo.obj
文件。nasm -fwin32 helloworld.asm
生成 .o
文件,这是待会用 ld 程序链接要用到的。link /subsystem:console /nodefaultlib /entry:GobleyGook hello.obj kernel32.lib
hello.exe
,在命令行输入 hello
回车控制台将打印出 Hello World!
。ld -m i386pe helloworld.obj -o helloworld.exe
,命令无错误,目录下也生成了对应的可执行文件,奇怪的是,执行可执行文件,控制台并不会输出任何东西,只是一闪而过,可能 windows 系统不适合这种方式。转载地址:http://umqgn.baihongyu.com/