Résultats de 1 à 4 sur 4

Sujet : passage de paramètre

  1. #1
    Membre MP
    Inscrit
    août 2013
    Messages
    1

    passage de paramètre

    bonjour je cherche a faire un programme en fasm
    et j\'ai un petit problem...

    je cherche comment on peut faire pour qu\'un utilisateur puissent entrer un paramètre au lancement de mon programme si je le met en *.exe

    ex: personne.exe harry potter

    nom: harry
    prenom: Potter

    j\'espere avoir une réponse rapidement merci a tous :wink:

  2. #2
    Membre MP
    Inscrit
    août 2013
    Localisation
    12100
    Messages
    687
    Bonjour,
    Suite à votre demande, il n\'est pas précisé si le programme est sous DOS ous Windows.
    Mais compte tenu du lancement proposé je suppose qu\'il s\'agit de DOS.
    J\'ai écrit un programme en assembleur qui effectue cette opération.
    que je vous livre. Il est appelable soit du FORTRAN 77 soit probablement du PASCAL, mais je l\'ai pas vérifié pour le pascal. Il est écrit en MASM

    Code:
    page 45,132
    ;--------------------------------------------------------
    ; Fonc.de transfert kmlc  de la ligne de commande              KMLC.ASM
    ; KCR = KMLC ( KLE , KCR , CHA , PAV )
    ;--------------------------------------------------------
    pile      struc                        ;structure de la pile
    debpil    dw        ?                  ;indicateur de pav‚ fictif
    savbp     dw        ?                  ;sauve de BP
    savds     dw        ?                  ;sauve de ds
    retour    dd        ?                  ;@ # de retour
    pav       dd        ?                  ;@ # pav‚ descripteur
    cha       dd        ?                  ;@ # chaine contenant zone
    kcr       dd        ?                  ;@ # compte rendu d\'éxécution
    kle       dd        ?                  ;@ # limite d\'erreur
    finpil    db        ?                  ;valeur de fin de pile
    pile      ends                         ;fin de la structure
              ;------------------------------------------------
    cgroup    group     kmsl
    kmsl      segment   public \'code\'
    assume    cs:cgroup
    extrn     udp:far
    public    KMLC
              ;------------------------------------------------
    KMLC      proc      far
              ;                               int 3 ; pour debug
              push      ds                  ;save registre ds
              push      bp                  ;save registre bp
              sub       sp,savbp-debpil     ;accroissement pile
              mov       bp,sp               ;bp pointe sur la pile
              ;------------------------------------------------
              lds       di,[bp].pav         ; ds:di sur pav
              les       si,[bp].cha         ; es:si sur pav
              call      udp                 ; dx abscisse cx longueur
              cmp       ax,0                ; ax R‚el/Virtuel
              jl        error
              ;------------------------------------------------
              mov       word ptr [debpil+bp],ax ; ax=0 si pav‚ r‚el
              ;------------------------------------------------
              mov       ah,2Fh              ;ah= fonction acquisition dta
              int       21h                 ;Requéte à DOS ES:BX
              ;------------------------------------------------
              push      es                  ;@ du PSP  ligne de commande
              pop       ds                  ; ..mis dans DS:SI
              mov       si,bx               ;# du PSP
              ;------------------------------------------------
              mov       bl,byte ptr[si]     ; Nb.caractères re‡us
              xor       bh,bh               ; bh=0
              mov       ax,bx
              cmp       bl,2                ; sortie si pas de caractères
              jl        apav                ; sortis dans ligne de comde.
              dec       bx                  ; pour enlever l\'espace
              ;------------------------------------------------
              cmp       cx,bx               ; v‚rification si la place
              mov       ax,-3               ; est suffisante
              jl        error
              inc       si                  ; pour sauter les deux premiers
              inc       si                  ; octets
              ;------------------------------------------------
              les       di,[bp].cha         ;di=#     es=@ de la chaine
              add       di,dx               ;di = adresse d‚but de zone
              dec       di                  ;di = di+dx-1
              ;------------------------------------------------
              mov       cx,bx               ; nombre de caractères  à  recevoir
              cld                           ; sens du transfert
              rep       movsb               ; transfert
              ;------------------------------------------------
              mov       ax,bx               ; nombre transf‚r‚
    apav:     cmp       word ptr [debpil+bp],0 ; pav‚ réel ou virtuel
              jne       correc
              lds       di,[pav+bp]         ; envoi de la longueur dans
              mov       [di+2],ax           ; le pav‚ r‚el
              jmp       correc
              ;------------------------------------------------
    error:    lds       di,[bp].kle         ; di:ds sur ler
              mov       cx,word ptr [di]    ; cx = ler
              add       ax,cx               ;
              inc       ax                  ; cre = ler + cre + 1
    correc:   lds       di,[bp].kcr         ; di:ds sur cre
              mov       word ptr [di],ax    ; cre = ax
              ;------------------------------------------------
              add       sp,savbp-debpil     ; restitution pile
              pop       bp                  ;restitution bp
              pop       ds                  ;restitution ds
              ret       finpil-retour-4     ;return et restitution pile
    KMLC      endp
    kmsl      ends
              end
    Je pense avoir répondu à la question si ce n\'est pas le cas merci de le préciser
    Moby
    moby

  3. #3
    Membre MP
    Inscrit
    août 2013
    Messages
    1
    Salutations,
    aprés étude du sp proposé:
    - il manque de SP UDP donné dans le prog.
    - je ne comprend pas bien la notion de pavé
    - a quoi servent les paramètres KLE et KCR
    Quelques explications me serainet utiles.
    Myc

  4. #4
    Membre MP
    Inscrit
    août 2013
    Localisation
    12100
    Messages
    687
    page 45,132
    ;--------------------------------------------------------
    ; sous prog.interne de décompactage d\'un pavé udp.ASM
    ;--------------------------------------------------------
    cgroup group kmsl
    kmsl segment public \'CODE\'
    assume cs:cgroup
    public udp
    udp proc far
    ;--------------------------------------------------------
    push bx
    mov dx,word ptr [di] ; dx = abscisse
    mov bx,dx ; longueur si pavé virtuel
    neg bx ; bx = -dx
    xor ah,ah ; compte rendu de sortie
    inc ah ; si pavé virtuel
    cmp dx,0 ;
    jl virtel ; si négatif=> pavé virtuel
    jg reel ; si positif=> pavé réel
    ;--------------------------------------------------------
    xor bx,bx ; si dx=0 chaine avec $
    boucl: inc bx ; recherche du caractère $
    mov cx,-2 ; dans la limite de 255 octets
    cmp bx,255 ; sinon sortie en erreur
    jg error
    ;------------------------------------------------
    mov al,byte ptr es:[si+bx-1] ; recherche
    cmp al,\"$\" ; du $ dans la zone
    jne boucl
    dec bx ; longueur zone sans le $
    inc ah ; ah=2 (zone avex $)
    ;--------------------------------------------------------
    virtel: mov dx,1 ; si virtuel et $: abscisse =1
    jmp fin
    ;--------------------------------------------------------
    reel: mov bx,word ptr [di+2] ; bx = longueur
    xor ah,ah ; ah=0 si pavé r‚el
    mov cx,-1 ; erreur -1
    cmp bx,0 ; pav‚ réel, dans ce cas
    jl error ; la longueur ne peut être
    ;------------------------------------------------
    fin: mov cx,bx ; cx=longueur
    xor al,al
    xchg al,ah ; ax=ah
    jmp finok
    ;------------------------------------------------
    error: mov ax,cx ; ax = nø d\'erreur
    xor cx,cx ; sur erreur on fait cx=0
    mov dx,1 ; et dx=1 pour les appelants
    ; qui ne testent pas le code retour
    ;------------------------------------------------
    finok: pop bx
    ret
    ;--------------------------------------------------------
    udp endp
    kmsl ends
    end



    Ci dessus la liste de la procédure UDP.

    Concernant la logique générale de mes procédures:

    a) J’ai généralisé le traitement des chaînes. En assembleur et dans d’autre langages une chaîne contient obligatoirement des textes en ASCII.
    Pour moi une chaîne est une suite d’octets quelconques qui se caractérisent par une adresse de début de chaîne, dont la longueur est indéfinie à compter de cette adresse.
    Une chaîne est divisée en zones caractérisées par une abscisse de 1 à n à partir de l’adresse de la chaîne et une longueur en nombre d’octets.
    Ces deux informations sont rangées dans un tableau (pavé) de deux mots contenant cette abscisse et cette longueur.
    Ces nombres sont: >1 pour l’abscisse et positif pour la longueur.
    Il y a deux cas particuliers traités à part par UDP:
    Abscisse=0 : dans ce cas, la longueur n’a pas de signification. Il s’agit d’une zone en ASCII terminée par un $ qui sert de délimiteur et UDP fait la recherche et calcule la longueur.
    Abscisse négative: dans ce cas la longueur n’a pas de signification et l’abscisse est prise à 1 et la longueur à la valeur absolue de abscisse (c‘est ce que j’appelle pavé virtuel).
    La procédure UDP effectue tout ce travail et fournie l’abscisse réelle et la longueur réelle. En outre il prévient l’appelant s’il s’agissait d’un pavé réel ou d’un pavé virtuel

    b) KLE et KCR
    Un programme détecte des erreurs diverses, soit des erreurs de l’utilisateur, soit des erreurs internes. La première solution consiste à leur affecter un n° d’erreur géré par le programmeur. Ce qui a deux grands inconvénients:
    - la gestion de ces n° est lourde et pénible, les listes ne sont jamais à jour ainsi que les textes. On risque de reprendre deux fois le même numéro…etc
    - quand une procédure est appelée plusieurs fois on retrouve le même n° pour des appels différents…

    J’ai donc réalisé une procédure automatique de numérotation avec production automatique de la liste des erreurs avec le commentaire associé.
    KLE est la limite d’erreur (nombre négatif) donnée par le programme appelant, KCR est le résultat qui est calculée avec KLE.
    Ainsi si une procédure détecte l’erreur -2 et que KLE vaux -100, le résultat de la procédure sera
    -102.
    Si cette procédure est appelé en un autre point du programme KLE sera différent.
    A un n° d’erreur final donné, il y a un seul endroit de toute l’application où ce n° a pu être généré.

    moby
    moby

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé