Programme de lancement de la compilation et du linker
2 participants
Page 1 sur 1
Programme de lancement de la compilation et du linker
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 :
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.
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
Dernière édition par Admin le Lun 5 Déc - 15:10, édité 1 fois
Re: Programme de lancement de la compilation et du linker
Le fichier des includes n'est pas joint au sujet !
poppush64- Messages : 1
Date d'inscription : 05/12/2016
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|