127 votes

Comment écrire Bonjour tout le monde en assembleur sous Windows ?

Je voulais écrire quelque chose de base en assemblée sous Windows, je me sers de MSNA, mais je ne peux pas obtenir quoi que ce soit en travaillant.

Comment écrire et compiler Bonjour tout le monde sans l’aide de C fonctionne sur Windows ?

161voto

caffiend Points 909

Cet exemple montre comment aller directement à l’API Windows et pas le lien dans la bibliothèque Standard C.

Pour compiler, vous aurez besoin de MSNA et lien. EXE (à partir de Visual studio Standard Edition)

 NASM-fwin32 hello.asm lien/subsystem : console/NODEFAULTLIB /entry:main hello.obj 

43voto

anderstornvig Points 2580

MSNA exemples.

; ----------------------------------------------------------------------------
; 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

Ensuite, exécutez

nasm -fwin32 helloworld.asm
gcc helloworld.obj
a

Il y a aussi Le Désemparés Débutants Guide de Bonjour tout le Monde dans Msna sans l'utilisation d'une bibliothèque C de. Ensuite, le code devrait ressembler à ceci.

org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'

Bonne chance.

33voto

PhiS Points 2654

Voici les exemples Win32 et Win64 utilisant des appels API Windows. Ils sont pour MASM plutôt que NASM, mais jetez un oeil sur eux. Vous trouverez plus de détails dans cet article.

Pour assembler et relier à l’aide de MASM, utilisez ceci pour exécutable 32 bits :

ou ceci pour 64-bit exécutable :

16voto

ceving Points 3990

Plat Assembleur n'a pas besoin d'un supplément de l'éditeur de liens. Cela rend la programmation assembleur assez facile. Il est aussi disponible pour Linux.

C'est - hello.asm de la Fasm exemples:

include 'win32ax.inc'

.code

  start:
    invoke  MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK
    invoke  ExitProcess,0

.end start

Fasm crée un exécutable:

>fasm bonjour.asm
plat assembleur version 1.70.03 (1048575 kilo-octets de mémoire)
4 passes, de 1536 octets.

Et c'est le programme de l'IDA:

enter image description here

Vous pouvez voir les trois appels: GetCommandLine, MessageBox et ExitProcess.

6voto

Captain Segfault Points 1106

Sauf si vous appelez quelque fonction que ce n'est pas du tout triviale. (Et, sérieusement, il n'y a pas de véritable différence de complexité entre l'appel de printf et l'appel d'une fonction api win32.)

Même de DOS int 21h est vraiment juste un appel de fonction, même si ses une API différente.

Si vous voulez le faire sans aide, vous devez parler à votre matériel vidéo directement, probablement écrit bitmaps des lettres de "Hello world" dans un framebuffer. Même alors, la carte vidéo est en train de faire le travail de traduire ces valeurs en mémoire en VGA/DVI signaux.

Notez que, vraiment, aucun de ces trucs tout le chemin vers le matériel est plus intéressant en ASM que dans C. Un programme "hello world" se résume à un appel de fonction. Une bonne chose à propos de l'ASM, c'est que vous pouvez utiliser n'importe quel ABI vous voulez assez facile, vous avez juste besoin de savoir ce que l'ABI est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X