¿Cómo escribir hola mundo en ensamblador en Windows?
Quería escribir algo básico en ensamblaje en Windows. Estoy usando NASM, pero no consigo que nada funcione.
¿Cómo escribo y compilo un programa Hola Mundo sin la ayuda de funciones C en Windows?
Este ejemplo muestra cómo ir directamente a la API de Windows y no vincularse en la biblioteca estándar de C.
global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .text
_main:
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp-4]
push eax
push (message_end - message)
push message
push ebx
call _WriteFile@20
; ExitProcess(0)
push 0
call _ExitProcess@4
; never here
hlt
message:
db 'Hello, World', 10
message_end:
Para compilar, necesitará NASM y LINK.EXE (de Visual Studio Standard Edition)
nasm -fwin32 hola.asm enlace /subsistema:consola /nodefaultlib /entry:main hello.obj
Ejemplos de NASM .
Llamando a libc stdio printf
, implementandoint main(){ return printf(message); }
; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits. It needs to be linked with a C library.
; ----------------------------------------------------------------------------
global _main
extern _printf
section .text
_main:
push message
call _printf
add esp, 4
ret
message:
db 'Hello, World', 10, 0
Entonces corre
nasm -fwin32 helloworld.asm
gcc helloworld.obj
a
También está la Guía para principiantes despistados de Hello World en Nasm sin el uso de una biblioteca C. Entonces el código se vería así.
Código de 16 bits con llamadas al sistema MS-DOS: funciona en emuladores de DOS o en Windows de 32 bits con soporte NTVDM . No se puede ejecutar "directamente" (de forma transparente) en ningún Windows de 64 bits, porque un kernel x86-64 no puede usar el modo vm86.
org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'
Conviértalo en un .com
ejecutable para que se cargue cs:100h
con todos los registros de segmento iguales entre sí (modelo de memoria pequeña).
Buena suerte.