¿Cómo escribir hola mundo en ensamblador en Windows?

Resuelto feiroox asked hace 15 años • 9 respuestas

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?

feiroox avatar Jun 21 '09 17:06 feiroox
Aceptado

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
caffiend avatar Jun 22 '2009 19:06 caffiend

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 .comejecutable para que se cargue cs:100hcon todos los registros de segmento iguales entre sí (modelo de memoria pequeña).

Buena suerte.

 avatar Jun 21 '2009 10:06