IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Créer un programme 32 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Créer un programme 32 bits
    Bonjour ,

    Mon programme (un simple "Hello world!" ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    org 0x0100
     
    mov ah, 0x09
    mov dx, chaine
    int 0x21
    ret
     
    chaine: db "Hello world!", 10, 13, "$"
    Et donc je voudrais faire une version 32 bits, parce que le 16 bits ne marche pas sur Windows. J'ai cherché sur internet, parait qu'il faut mettre la directive BITS 32. Eeeeettttt ça marche pas ! Même erreur que quand j'ouvre un programme 16 bits sans DOSBox :
    Nom : oz.PNG
Affichages : 696
Taille : 7,6 Ko
    Et en plus, le programme ne marche plus sur DOSBox ! Il ne se passe rien, et la ligne de commande ne revient pas.

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Alors normal parce que ton code utilise le format '.com' qui ne peut pas s’exécuter sur ton Windows et tu utilise une interruption Dos qui n'existe plus sur Windows.
    Et le .com est au format 16 bits , donc ne marche pas en 32 bits

    J'avais répondu à un truc similaire :
    Citation Envoyé par Kannagi Voir le message
    Sur Linux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    ;  hello.asm  a first program for nasm for Linux, Intel, gcc
    ;
    ; assemble:	nasm -f elf hello.asm
    ; link:		gcc hello.o -o hello  
    ; run:	        hello 
    ; output is:	Hello World 
     
    	SECTION .data		; data section
    msg:	db "Hello World",10	; the string to print, 10=cr
    len:	equ $-msg		; "$" means "here"
    				; len is a value, not an address
     
    	SECTION .text		; code section
            global main		; make label available to linker 
    main:				; standard  gcc  entry point
    _start:
     
    	mov	edx,len		; arg3, length of string to print
    	mov	ecx,msg		; arg2, pointer to string
    	mov	ebx,1		; arg1, where to write, screen
    	mov	eax,4		; write sysout command to int 80 hex
    	int	0x80		; interrupt 80 hex, call kernel
     
    	mov	ebx,0		; exit code, 0=normal
    	mov	eax,1		; exit command to kernel
    	int	0x80		; interrupt 80 hex, call kernel
    Avec comme command :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nasm -f elf hello.asm
    gcc hello.o -o hello
    Pour Windows bonne question sur le net j'ai trouvé ceci (donc je n'ai pas pu testé personnellement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    ; Name:     hello.asm
    ; Assemble: nasm.exe -f win32 hello.asm
    ; Link:     ld hello.obj -emain -lkernel32 --enable-stdcall-fixup %SYSTEMROOT%\system32\kernel32.dll
    ; Run:      a.exe
     
    BITS 32
    extern _GetStdHandle
    extern _WriteFile
    extern _ExitProcess
     
    SECTION .data
        str:    db "Hello world!"
        strlen  equ $-str
     
    SECTION .text
    GLOBAL main
    main:
        ; Stack frame for NumberOfBytesWritten
        push ebp
        sub esp, 4
     
        ; http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx
        ; HANDLE WINAPI GetStdHandle(
        ;   _In_  DWORD nStdHandle
        ; );
        push -11
        call _GetStdHandle
     
        ; http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747.aspx
        ; BOOL WINAPI WriteFile(
        ;   _In_         HANDLE hFile,
        ;   _In_         LPCVOID lpBuffer,
        ;   _In_         DWORD nNumberOfBytesToWrite,
        ;   _Out_opt_    LPDWORD lpNumberOfBytesWritten,
        ;   _Inout_opt_  LPOVERLAPPED lpOverlapped
        ; );
        push 0              ; lpOverlapped,
        lea ebx, [ebp-4]    ; EBX: address of NumberOfBytesWritten
        push ebx            ; lpNumberOfBytesWritten,
        push strlen         ; nNumberOfBytesToWrite
        push str            ; lpBuffer,
        push eax            ; hFile (result from GetStdHandle
        call _WriteFile
     
        ; ExitProcess (0)
        push 0
        call _ExitProcess
    Et Joyeux Noël !

  3. #3
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Alors normal parce que ton code utilise le format '.com' qui ne peut pas s’exécuter sur ton Windows et tu utilise une interruption Dos qui n'existe plus sur Windows.
    Je compile en exe, mais même comme ça, ça ne marche pas.

    J'ai essayé avec que des interruptions du BIOS, toujours Mr Windows qui bloque


    Au fait, j'ai NASM sur Windows, donc j'ai essayé le dernier programme, eeeeeeeetttttttttt... nan . Windows "n'accepte pas les programmes 16 bits". (J'ai bien fait la commande qui était en commentaire ligne 2)


    Citation Envoyé par Kannagi Voir le message
    Et Joyeux Noël !
    Joyeux noël à toi aussi ! (T'as eu quoi comme cadeau ?)

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 429
    Points : 43 052
    Points
    43 052
    Par défaut
    Comme l'as dit Kannagi, tu ne peux pas utiliser les API 16 bits du DOS ou du BIOS sous Windows.

    Un programme 16 bits .com ou .exe fonctionnera sous Dosbox qui est un émulateur.

    Il fait comprendre que ton code ne fait qu'appeler une fonction système en lui passant les paramètres attendus dans les registres du CPU. L'appel étant effectif en déclenchant l'interruption 0x21.

    Sous Windows, les appels systèmes se font en empilant les paramètres, et en appelant la fonction par un CALL.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    %include "win32n.inc"
     
    extern MessageBoxA
    import MessageBoxA user32.dll
    extern ExitProcess
    import ExitProcess kernel32.dll
    segment .data USE32
     
    title db "hello",0
    message db "hello world",0
     
    segment .bss USE32
     
    var1 resb 32
     
    segment .code USE32
     
    ..start:
     
    push dword MB_OK
    push dword title
    push dword message
    push dword 0
    call [MessageBoxA]
     
    push dword 0
    call [ExitProcess]
    Ce code va appeler la fonction MessageBox de l'API Windows qui attend une chaine de caractères et un titre pour créer une fenêtre simple. Il est possible aussi de créer une application console ou tu utiliseras probablement une fonction comme WriteConsole (nom fictif donné à titre d'exemple).

    La façon d'appeler les fonctions de l'API s’appelle la convention d'appel. Tu peux voir qu'elle est différente pour DOS (passage de paramètres dans les registres du CPU, appel interruption 0x21, retour de résultat dans AL ou AX, pour MS-DOS, passage des paramètres dans la pile, saut à l'adresse de la fonction, nettoyage de la pile par la fonction, retour dans EAX.)

    On fait la même chose en C. Le faire en assembleur n'a pas d’intérêt spécifique, mis à part d'apprendre. Mais dans ce cas, il faut apprendre sur l'existant actuel, pas sur MS-DOS.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2006, 15h21
  2. Créer par programme un TEdit...
    Par Douine dans le forum Delphi
    Réponses: 21
    Dernier message: 22/05/2006, 09h38
  3. FAQ VC++ : Comment créer un programme service ?
    Par benoit70 dans le forum MFC
    Réponses: 14
    Dernier message: 05/10/2005, 11h07
  4. [Débutant]Créer un programme exécutable?
    Par steelidol dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/04/2005, 17h52
  5. Créer de programme pour WIndows avec Turbo Pascal
    Par kaygee dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 20/08/2003, 23h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo