Hello world с использованием nasm в сборке windows

Я использую в NASM для компиляции следующей сборки. Однако код аварийно завершает работу в консоли под Windows.

C:>NASM-F win32 тест.тест АСМ-вывода.o

С:>тест ЛД.тест о-о.exe

section .data
  msg   db    'Hello world!', 0AH
  len   equ   $-msg

section .text
  global _WinMain@16

_WinMain@16:
  mov   edx, len
  mov   ecx, msg
  mov   ebx, 1
  mov   eax, 4
  int   80h

  mov   ebx, 0
  mov   eax, 1
  int   80h

по этому в должности. The main функция недоступна под Windows и должна быть заменена на WinMain.

Итак, если ваша точка входа _start или main, оно должно быть изменено на _WinMain@16, и ret в конце процедуры к ret 16:

мой рабочий пример:

section .text       
 global _WinMain@16       

_WinMain@16:       
 mov eax, 0       
 ret 16 

2 ответов


самая большая проблема заключается в том, что вы пытаетесь использовать Linux interupts на windows! int 80 не будет работать в windows.

мы используем собрание, поэтому ваша точка входа может быть любым ярлыком вы хотите. Стандартная точка входа, которую ищет ld, - _start, если вы хотите использовать другую метку, вам нужно сообщить ld с опцией-e Поэтому, если вы хотите, чтобы ваша начальная метка была главной, вам нужно

global main
ld -e main test.o -o test.exe

Если вы собираетесь использовать NASM в Windows, я рекомендую использовать GoLink как твой линкер. Вот простое консольное приложение для windows:

STD_OUTPUT_HANDLE   equ -11
NULL                equ 0

global GobleyGook
extern ExitProcess, GetStdHandle, WriteConsoleA

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg

section .bss
dummy               resd 1

section .text
GobleyGook:
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle

    push    NULL
    push    dummy
    push    msg.len
    push    msg
    push    eax
    call    WriteConsoleA 

    push    NULL
    call    ExitProcess

makefile:

hello: hello.obj
    GoLink.exe  /console /entry GobleyGook hello.obj kernel32.dll  

hello.obj: hello.asm
    nasm -f win32 hello.asm -o hello.obj

хотя, эта же программа, вероятно, будет работать в WINE на Linux как шарм. :)

WINE не запрещает использовать системные вызовы Linux из двоичных файлов Windows PE; машинные инструкции выполняются изначально, а WINE предоставляет только функции DLL.