Programme de lancement de la compilation et du linker

Voir le sujet précédent Voir le sujet suivant Aller en bas

Programme de lancement de la compilation et du linker

Message par Admin le Lun 5 Déc - 14:34

Pour terminer ce chapitre, voici un programme qui va faciliter le lancement de la compilation avec nasm pour ceux qui n'utilisent pas un IDE.
Dans ce programme, nous commençons par préparer l'affichage d'une fenêtre particulière pour demander le nom du source à compiler. Il est nécessaire de renseigner une structure de type OPENFILENAME avant de la passer en paramètre à la fonction GetOpenFileNameA.
Les données nécessaires concernent les titres à afficher, les critères de choix du fichier (ici .asm et *.*) et la zone de réception de la sélection.
Ensuite nous avons une partie du code qui concerne l'extraction du simple nom du fichier (nous enlevons le chemin du début et l'extention de fin) pour formater la commande compilation.
Pour vérification nous l'affichons dans la console.
Ensuite nous lançons la commande de compilation en utilisant la fonction CreateProcessA  qui necessite 10 paramètres et donc un petit calcul pour aligner la pile (voir les sujets précédents...). Cette fonction envoyant la commande dans un thread difféerent, nous sommes obligés de surveiller sa fin avant d'envoyer la commande du linker. Pour cela nous utilisons la fonction WaitForSingleObject avec une durée maxi d'attente de 10s (parametre 10000). A la fin de la compil, nous testons le code retour par la fonction GetExitCodeProcess pour suivant le cas afficher un message d'erreur de compilation ou continuer vers le linker. Remarque : ici il faut tester le code retour du compilateur nasm et non pas le code retour du registre rax qui contient celui de la fonction WaitForSingleObject, c'est pourquoi nous utilisons GetExitCodeProcess.
Si la compilation est bonne, nous formatons la commande du linker à partir du nom du fichier selectionné et nous envoyons la commande par les mêmes fonctions que la compilation. Nous suivons aussi la bonne fin du linker pour afficher un message de bonne fin.
Voilà le code :
Code:

;---programme de lancement de la compilation pour pgm 64 bits et de l'éditeur de lien
; affichage dans la console
; utilisation de la fonction CreateProcessA
; les routines de vidage et d'affichage sont déportées dans le fichier routineswin.obj
%include "../windowsinc64.inc"
;=======================================
; segment des données initialisées
;=======================================
segment .data

szMessFin  db "Compilation termin",82h,"e.",0
szRetourLigne db 10,13,0
szMessErrCompil db "ERREUR de compilation",0
szCompil db "C:\Developpement\Assembleur\nasm\nasm.exe -f win64 "
ILGPGMN   equ 256
szPgmName times ILGPGMN db ' '
                   db 0   ; fin de chaine
szLinkerDeb db "C:\\Developpement\\linker\\Golink "
szLinkerObj times ILGPGMN db " "
szLinkerFin db " ../routineswin64.obj  /console /nxcompat Kernel32.dll"
            db " User32.dll Gdi32.dll Comctl32.dll Comdlg32.dll Shell32.dll Shlwapi.dll Gdiplus.dll wininet.dll winmm.dll ntdll.dll /entry:Main  "
 db 0  
szFilter db "Asm Files (*.asm)",0,"*.asm",0
    db "All Files (*.*)",0,"*.*",0,0
szDefExt db "asm",0
szTitreChoix db  "Choisir le fichier à compiler",0
szDirDepart  db "C:\Developpement\Assembleur\Projets\projettuto",0
 
;instance de la structure des fichiers
ofn:
 istruc OPENFILENAME
 at OPENFILENAME.nFilterIndex,  dd  1h
 at OPENFILENAME.nMaxFile,      dd MAX_PATH
 at OPENFILENAME.nMaxFileTitle, dd MAX_PATH
  iend
LGOFN  equ $ - ofn ;longueur de la structure ofn
;instance des infos pour le process
sinfa align 8
sinf: istruc  STARTUPINFO
 
  iend
LGSINF  equ $ - sinf ;taille instance
pia align 8
pi: istruc PROCESS_INFORMATION
  iend  

;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain   resq 1
szFile     resw MAX_PATH *2
szFileTitle resw MAX_PATH *2
szDirCourant resw MAX_PATH *2
szCodeRetour   resb 100
;=======================================
; segment de code
;=======================================
segment .text
    global Main
 extern afferreur,affconsoleP,saisieClavier
Main:
 sub rsp,8h
 sub rsp,20h
    ;recup handle de l'instance du programme
 mov rcx,0
 call GetModuleHandleA
 cmp  rax,NULL
 je   .gestionerreurs
 mov  [hMain],rax
 mov  byte[szFile],0
 ;préparation pour la fenêtre de choix du fichier source à compiler
 mov dword[ofn+OPENFILENAME.lStructSize],LGOFN   ; longueur de la structure
 mov dword[ofn+OPENFILENAME.lpstrFilter],szFilter ; filtre des fichiers
    mov dword[ofn+OPENFILENAME.lpstrFile],szFile
 mov dword[ofn+OPENFILENAME.lpstrInitialDir],NULL
 mov dword[ofn+OPENFILENAME.lpstrDefEx],szDefExt
 mov dword[ofn+OPENFILENAME.lpstrTitle],szTitreChoix ;titre de la fenetre
 mov dword [ofn+OPENFILENAME.lpstrFileTitle],szFileTitle ;
 mov dword[ofn+OPENFILENAME.hwndOwner],NULL   ; fenetre sans parent
 mov dword [ofn+OPENFILENAME.Flags], OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST
 mov rcx,ofn
 call GetOpenFileNameA  ; affichage fenetre de choix du fichier
 mov  r9,__LINE__
 cmp rax,0
 je .gestionerreurs
 ; preparer la commande de compilation
 mov rsi, [ofn+OPENFILENAME.lpstrFile]  ; récuperation du nom complet du fichier choisi
 mov rax,0
 mov ax, [ofn+OPENFILENAME.nFileOffset]   ; position du nom du fichier (donc sans le répertoire)
 add rsi, rax ; copie du nom uniquement
 mov rcx,0
 mov cx, [ofn+OPENFILENAME.nFileExtension] ; position du début de l'extention
 sub rcx, rax ; on ne copie pas l'extention  
 mov rdi, szPgmName  ; adresse de la zone receptrice dans la commande de compilation
 rep movsb                 ; copie du nom
 dec rdi                   ; car il reste le . de l'extention
 mov dword [rdi], ".asm" ; puis ajout de l'extention asm
 add rdi, 4
 mov dword [rdi], " -l " ; puis ajout de l'option
 add rdi, 4
 ; puis le nom sans l'extention
 mov rsi, [ofn+OPENFILENAME.lpstrFile]  
 mov rax,0
 mov ax, [ofn+OPENFILENAME.nFileOffset]
 add rsi, rax ; copie du nom uniquement
 mov rcx,0
 mov cx, [ofn+OPENFILENAME.nFileExtension]
 sub rcx, rax ; on ne copie pas l'extention  
 rep movsb
 dec rdi            ; pour enlever le . qui reste
 ;on ajoute l'extention txt pour le listing
 mov dword [rdi], ".txt"
 add rdi, 4
 mov dword [rdi],0 ; puis le 0 final
 ;verif de la chaine
 push szCompil
 call affconsoleP
 push szRetourLigne ; pour afficher un retour à la ligne
 call affconsoleP
 ;lancement process de compilation
 mov dword[sinf+STARTUPINFO.cb],LGSINF  ; alimentation de la taille de la structure
 add rsp,20h
 push pi              ; adresse du processinformation
 push sinf            ; adresse du startupinfo
 push NULL            
 push NULL
 push 0
 push FALSE
 sub rsp,20h
 mov rcx, NULL
 mov rdx,szCompil        ; adresse de la ligne de commande
 mov r8, NULL
 mov r9, NULL
 call CreateProcessA  ; création du process
 add rsp,48   ; 6 push
 mov r9,__LINE__
 cmp rax,NULL
 je .gestionerreurs
 mov rcx, [pi+PROCESS_INFORMATION.hProcess]  ; handle du process de compilation
 mov rdx,10000    ; attente 10s
    call WaitForSingleObject  ; on attend la fin du process pour lancer le linker
 ;
 ;récuperation du code retour de la compilation
 mov rcx,[pi+PROCESS_INFORMATION.hProcess]  ; handle du process de compilation
 mov rdx, szCodeRetour   ; zone de reception du code
 call GetExitCodeProcess
 mov r9,__LINE__
 cmp rax,NULL
 je .gestionerreurs
    cmp byte [szCodeRetour],0   ; test du code retour
 jne .erreur_compil

 ;Compilation Ok, préparation du linker
 mov rsi, [ofn+OPENFILENAME.lpstrFile]  ; mêmes opérations pour installer le bon nom du
 mov rax,0                                    ; fichier objet à traiter
 mov ax, [ofn+OPENFILENAME.nFileOffset]
 add rsi, rax ; copie du nom uniquement
 mov rcx,0
 mov cx, [ofn+OPENFILENAME.nFileExtension]
 sub rcx, rax ; on ne copie pas l'extention  
 mov rdi, szLinkerObj
 rep movsb
 dec rdi
 mov dword [rdi], ".obj" ; ;on ajoute l'extention obj pour l'objet
 ; lancement du linker
 ;lancement process du linker
 mov dword[sinf+STARTUPINFO.cb],LGSINF  ; alimentation de la taille de la structure
 add rsp,20h
 push pi              ; adresse du processinformation
 push sinf            ; adresse du startupinfo
 push NULL            
 push NULL
 push 0
 push FALSE
 sub rsp,20h
 mov rcx, NULL
 mov rdx,szLinkerDeb       ; adresse de la ligne de commande
 mov r8, NULL
 mov r9, NULL
 call CreateProcessA  ; création du process
 add rsp,48
 mov r9,__LINE__
 cmp rax,NULL
 je .gestionerreurs
 mov rcx, [pi+PROCESS_INFORMATION.hProcess]  ; handle du process de compilation
 mov rdx,15000    ; attente 15s  que le link soit terminée
    call WaitForSingleObject  ; on attend la fin du process pour afficher le message de fin
 jmp .main_fin
.gestionerreurs:
 call afferreur
 mov  rax,1
 jmp .fin
.erreur_compil:
 push szMessErrCompil
 call affconsoleP
 push szRetourLigne ; pour afficher un retour à la ligne
 call affconsoleP
.main_fin:
    ;push __LINE__
 ;call afftoutregistres
    push szMessFin
 call affconsoleP
 call saisieClavier
 mov rax,0
.fin:
 mov rcx, rax          ; code retour
 call ExitProcess  ; fin du programme


Vous trouverez dans le fichier joint, le fichier include des constantes windows, des structures et des fonctions appelées. Attention, ce fichier est incomplet et il faut donc ajouter de nouvelles fonctions ou structures suivant les besoins.
Attention : pour pouvoir être mis sur ce forum; l'extension .inc a été remplacée par .txt . La remettre donc si nécessaire.
Fichiers joints
windowsinc64.txt Vous n'avez pas la permission de télécharger les fichiers joints.(18 Ko) Téléchargé 0 fois


Dernière édition par Admin le Lun 5 Déc - 15:10, édité 1 fois
avatar
Admin
Admin

Messages : 37
Date d'inscription : 28/11/2016

Voir le profil de l'utilisateur http://assembleur64.forumactif.com

Revenir en haut Aller en bas

Re: Programme de lancement de la compilation et du linker

Message par poppush64 le Lun 5 Déc - 15:04

Le fichier des includes n'est pas joint au sujet !

poppush64

Messages : 1
Date d'inscription : 05/12/2016

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum