- .486
- .model flat, stdcall
- option casemap:none
-
- include \masm32\include\kernel32.inc
- include \masm32\include\user32.inc
- include \masm32\include\shell32.inc
-
- includelib \masm32\lib\kernel32.lib
- includelib \masm32\lib\user32.lib
- includelib \masm32\lib\shell32.lib
-
- .data?
- argc db ?
- argv dd 256 dup (?)
-
- .data
- szType db "open",0
-
- .code
-
- start:
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Début de récuperation des arguments passés a la ligne de commande
- ; Code trouvé sur http://www.asmfr.com
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- call GetCommandLine ; On récupère la ligne de commande sous forme de chaine
- mov esi, eax ; On copie le pointeur de début de chaine dans ESI
- lea edi, argv ; On lie le pointeur de argv dans EDI
- xor ecx, ecx ; On met ECX a zéro
-
- cl_skipspace:
- cmp byte ptr [esi], 0 ; Si on est a la fin de la chaine
- je cl_end ; On sort
- cmp byte ptr [esi], 32 ; Sinon si le caractère lu n'est pas un espace
- jne cl_findarg ; On lit l'argument passé en allant jusqu'au prochain espace
- inc esi ; On incrémente esi pour se lire le caractere suivant dans ESI
- jmp cl_skipspace ; On ignore les espaces
-
- cl_findarg:
- mov eax, esi ; On copie le pointeur de ESI vers EAX qui correspond au début de l'argument (son premier caractere)
- mov edx, 32 ; On stoque le caractere espace dans EDX ( code ASCII = 32)
- cmp byte ptr [esi], 34 ; On regarde si le premier caractere de l'argument est un guillemet (code ASCII = 34)
- sete cl ; Dans ce cas, cl = 1 (sinon cl = 0)
- lea edx, [edx + ecx * 2] ; edx = [espace] ou [guillemet]
- add eax, ecx ; Si le premier caractere est un guillement, on se déplace d'un caractere
-
- cl_parsearg:
- inc esi ; On passe au caractere suivant
- cmp byte ptr [esi], 0 ; On regarde si on est a la fin de la chaine
- je cl_storelastarg ; Dans ce cas on stoque le pointeur de début du dernier argument dans le tableau argv
- cmp byte ptr [esi], dl ; On regarde si le premier caractere de l'argument est un guillemet ou un espace
- jne cl_parsearg ; Dans le cas contraire on continue a lister et sauvegarder les pointeurs de début de chaque argument
- mov byte ptr [esi], 0 ; Sinon on met un caractere NULL a la fin de l'argument
- stosd ; On stoque le pointeur dans argv
- inc argc ; On incrémente le compteur (argc)
- inc esi ; On récupere le caractere suivant
- jmp cl_skipspace ; On ignore les espaces jusqu'a l'argument suivant
-
- cl_storelastarg:
- stosd ; On stoque le pointeur dans argv
- inc argc ; On incrémente le compteur (argc)
-
- cl_end:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Fin de récuperation des arguments passés a la ligne de commande
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- lea esi ,argv ; On copie l'adresse du premier élement de argv dans esi
-
- ;;;;;;;;;;;;;;;;;
- ; Debut de boucle
- ;;;;;;;;;;;;;;;;;
- deb_for:
- cmp argc ,1 ; On compare le nombre d'argument restant à 1
- je fin_for ; Si il reste 1 argument on sort de la boucle car le dernier argument et le chemin de l'executable
-
- add esi, 4 ; On incrémente esi de 4 octets soit la taille d'un pointeur
-
- push 0
- push 0
- push [esi]
- push offset szType
- push 0
- call ShellExecute ; On execute l'argument
-
- dec argc ; On décremente le nombre d'arguments
-
- jmp deb_for ; On revient au début de la boucle
- fin_for:
- ;;;;;;;;;;;;;;;
- ; Fin de boucle
- ;;;;;;;;;;;;;;;
-
-
- invoke ExitProcess,0 ; On quitte le programme
- end start
.486
.model flat, stdcall
option casemap:none
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib
.data?
argc db ?
argv dd 256 dup (?)
.data
szType db "open",0
.code
start:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Début de récuperation des arguments passés a la ligne de commande
; Code trouvé sur http://www.asmfr.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call GetCommandLine ; On récupère la ligne de commande sous forme de chaine
mov esi, eax ; On copie le pointeur de début de chaine dans ESI
lea edi, argv ; On lie le pointeur de argv dans EDI
xor ecx, ecx ; On met ECX a zéro
cl_skipspace:
cmp byte ptr [esi], 0 ; Si on est a la fin de la chaine
je cl_end ; On sort
cmp byte ptr [esi], 32 ; Sinon si le caractère lu n'est pas un espace
jne cl_findarg ; On lit l'argument passé en allant jusqu'au prochain espace
inc esi ; On incrémente esi pour se lire le caractere suivant dans ESI
jmp cl_skipspace ; On ignore les espaces
cl_findarg:
mov eax, esi ; On copie le pointeur de ESI vers EAX qui correspond au début de l'argument (son premier caractere)
mov edx, 32 ; On stoque le caractere espace dans EDX ( code ASCII = 32)
cmp byte ptr [esi], 34 ; On regarde si le premier caractere de l'argument est un guillemet (code ASCII = 34)
sete cl ; Dans ce cas, cl = 1 (sinon cl = 0)
lea edx, [edx + ecx * 2] ; edx = [espace] ou [guillemet]
add eax, ecx ; Si le premier caractere est un guillement, on se déplace d'un caractere
cl_parsearg:
inc esi ; On passe au caractere suivant
cmp byte ptr [esi], 0 ; On regarde si on est a la fin de la chaine
je cl_storelastarg ; Dans ce cas on stoque le pointeur de début du dernier argument dans le tableau argv
cmp byte ptr [esi], dl ; On regarde si le premier caractere de l'argument est un guillemet ou un espace
jne cl_parsearg ; Dans le cas contraire on continue a lister et sauvegarder les pointeurs de début de chaque argument
mov byte ptr [esi], 0 ; Sinon on met un caractere NULL a la fin de l'argument
stosd ; On stoque le pointeur dans argv
inc argc ; On incrémente le compteur (argc)
inc esi ; On récupere le caractere suivant
jmp cl_skipspace ; On ignore les espaces jusqu'a l'argument suivant
cl_storelastarg:
stosd ; On stoque le pointeur dans argv
inc argc ; On incrémente le compteur (argc)
cl_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Fin de récuperation des arguments passés a la ligne de commande
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lea esi ,argv ; On copie l'adresse du premier élement de argv dans esi
;;;;;;;;;;;;;;;;;
; Debut de boucle
;;;;;;;;;;;;;;;;;
deb_for:
cmp argc ,1 ; On compare le nombre d'argument restant à 1
je fin_for ; Si il reste 1 argument on sort de la boucle car le dernier argument et le chemin de l'executable
add esi, 4 ; On incrémente esi de 4 octets soit la taille d'un pointeur
push 0
push 0
push [esi]
push offset szType
push 0
call ShellExecute ; On execute l'argument
dec argc ; On décremente le nombre d'arguments
jmp deb_for ; On revient au début de la boucle
fin_for:
;;;;;;;;;;;;;;;
; Fin de boucle
;;;;;;;;;;;;;;;
invoke ExitProcess,0 ; On quitte le programme
end start