Bonjour a tous, je desirerai savoir comment récupérer des arguments passé en ligne de commande. Quelles interruptions font ca ? y aurait il de la doc quelque part ??
ex : monprog arg1 arg2 ....
Voila, merci et bon noel
Bonjour a tous, je desirerai savoir comment récupérer des arguments passé en ligne de commande. Quelles interruptions font ca ? y aurait il de la doc quelque part ??
ex : monprog arg1 arg2 ....
Voila, merci et bon noel
Y'a pas d'interruption, c'est dans le PSP
Benoît explique justement très bien ce que c'est dans son tutorial sur l'assembleur http://benoit-m.developpez.com/assem...s/sommaire.php. C'est vers le début du tuto.
Par contre, je ne sais pas vraiment comment on peut y accéder avec les fichiers EXE.
Dans un fichier EXE (au début du programme), les registres DS et ES pointent vers le PSP donc on y accède avec ES:[offset_de_l_octet_dans_le_PSP]Envoyé par Biglo
Oui, j'y ai pensé quelques heures après avoir posté mon message
Sinon j'ai lu qu'il y avait toujours moyen de récupérer l'adresse du PSP avec la fonction 62h du DOS.
Exact
Bonsoir, alors j'ai cherché sur comment recupérer un argument.
Voici ce a quoi j'arrive :
J'arrive a recupérer l'argument en restant dans le PSP. voici comment :
(nb c'est avc un fichier EXE) :
aisni, ma variable zzz aura l'adresse du debut des arguments.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 xor ax, ax ; ax = 0 mov di, 81h ; di = Offset de debut de chaine mov al, ds:[80h] ; On lit la longeur de la chaine add di, ax ; di = Offset_Chaine + Longeur mov byte ptr [di], '$' ; on place un caracter de fin (pour Fnt 9, int 21h) mov zzz, 81h ; Pointe le debut de la chaine
si je fait
Ca fonctionne, ca m'affiche bien mes arguments.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 xor dx,dx mov dl, zzz mov ah, 09h int 21h
Mais ensuite je dois charger les données, ce que l'on fait a chaque debut de programme :
Et a partir de ce moment, zzz devient n'importe quoi puisque je ne suis plus dans le PSP.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mov Ax,@data mov Ds,Ax
J'ai pourtant besoin absolument de savoir les arguments en ayant mis @data dans Ds, puisque dans le coeur de mon programme je me sert des arguments....
Alors j'ai essayé la fonction DOS :
entrée = AH = 62h
sortie = BX = Adresse du segment PSP, en faisant comme ca :
Donc la theoriquement BX contient au depart l'adresse du PSP, et j'ajoute 81h (selon le tableau), pour aller au debut de la chaine contenant les arguments. Ensuite je remet Bl dans ma variable zzz, et quand je veux l'afficher ca ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 mov ah, 62h int 21h add bx, 81h mov zzz, bl
quelqu'un aurait il une solution s'il vous plait je suis vraiment en galere.
Merci.
++
euh charger la valeur du segment de donnees au début du programme c pas systematiquement obligatoire. Bon effectivement c'est très frequent. Mais si tu peux traiter lla ligne de commande avant de changer la valeur de ds, fais le. Sinon on té dit egalement que es, contenait le segment du PSP. Donc fait le avec ES et non pas a vec DS. Et enfin
ca c'est un peu n'importe quoi. bx contient le segment pas l'offset. Si tu fais un truc du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int 21h add bx, 81h mov zzz, bl
[code]
mov ax, [zzz+4]
[code]
ce sera exactement la même chose que
[code:6c0c95aac1]
mov ax, ds:[zzz+4]
[/code:6c0c95aac1]
tu peux pas additioner l'offset (81h) au segment (bx)
Donc utilises un registre segment :
[code:6c0c95aac1]
mov ah, 62h
int 21h
mov ax, bx
mov es, ax
[/code:6c0c95aac1]
puis plus loin pour reproduire ce que tu as fait precedement :
[code:6c0c95aac1]
xor ax, ax
mov al, es:[80h]
mov di, al
mov byte ptr es:[di+81h], '$'
[/code:6c0c95aac1]
Puis si l'interruption pour afficher les caractères demande ds comme segment, il faut sauvegarder ds, et mettre es dedans.
Quoiqu'il en soit, il me semble que les fonctions du BIOS sont bien mieux adaptés pour afficher les arguments.
bonsoir, comme je suppose que d'autres personnes chercheront comment faire, et qu'a la suite de ces différents postes j'étais encore dubitatif sur la maniere de proceder, je poste ici ma fonction qui tout simplement regarde si on a entré un argument t ou g, et passe mon programme en mode texte ou en mode graphique.
Attentio, on ne peut utiliser cette fonction qu'avant la premier utilisation du registre es. exemple :
mov ax, adresse_memoire_video
mov adresse_memoire_video, ax
call argument
ca ne fonctionnera pas. Il faut appeler Argument avant.
Bon voila, amusez vous bien. ++
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 Argument Proc push ax push bx push cx xor ax,ax xor bx,bx xor cx,cx mov cl, byte ptr es:[80h] ; Cf tableau --> 80h -> longueur de la chaine d'argument. cmp cl, 0 ; pas d'argument je aucun_argument mov al, byte ptr es:[82h] ;access aux differents elements de la chaine d'arguments. CF tableau. 82h --> deuxieme éléments de la chaine, apres l'espace ;-- Test sur g cmp al, 'g' jne al_pas_g mov Graphik, '1' ; Mode Graphique jmp fin_argument ; Ca ne permet de ne pas executer ce qui vient a chaque fois al_pas_g : ; --- test sur t cmp al, 't' jne al_pas_t mov Graphik,'0' ; Mode texte jmp fin_argument al_pas_t : jmp aucun_argument aucun_argument : xor dx,dx lea dx, pas_d_argument mov ah, 9 int 21h ; Constraint Error : on quitte le programme !! mov ah,4ch int 21h fin_argument : pop cx pop bx pop ax ret Argument EndP
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager