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.