begin process at 2010 02 09 19:23:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

[nasm] ligne de commande


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[nasm] ligne de commande

mardi 24 juillet 2007 à 23:51:49 | [nasm] ligne de commande

Kevin68

Bonjour :),

Je suis débutant en assembleur, j'utilise nasm sous linux.

J'ai cherché partout un exemple de code source qui me permettrait de récupérer les arguments d'un programme en ligne de commande. Je n'ai pas encore assez d'expérience pour en implémenté un moi même. Je suis conscient du fait qu'il s'agit d'un problème 'concret' que le règlement du site réprouve, mais je ne sais pas vers qui me tourner, personne ne connais l'assembleur dans mon entourage et la documentation que j'ai pu trouver ne m'a pas aidé sur ce sujet. Je sais que ça n'est pas un code court, je ne demande pas qu'on le poste ici, mais si l'un de vous a une adresse ou un conseil à me donner je suis preneur. Voilà désolé si ma question est déplacée, je m'excuse, déranger n'est pas mon souhait.

Merci.
mercredi 25 juillet 2007 à 10:00:35 | Re : [nasm] ligne de commande

BruNews

Administrateur CodeS-SourceS
Demande tout à fait normale, un forum est aussi là pour obtenir de l'info.
Sous Windows, je t'aurais indiqué GetCommandLine() mais je ne pratique pas Linux.

ciao...
BruNews, MVP VC++
mercredi 25 juillet 2007 à 11:20:21 | Re : [nasm] ligne de commande

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

pas assez calé non plus, regarde ça:
[ Lien ]

@++

mercredi 25 juillet 2007 à 11:36:42 | Re : [nasm] ligne de commande

_dune2_

Membre Club
Salut,


Lors de l'éxecution de ton binaire, dés le début la pile est constituée comme suit (chaque donnée de la pile est sur 4 octets en mode 32bits) :

[    ARGC   ] -> nb arguments

[ @ARGV0 ] -> ptr vers le 1er octet de la chaine terminée par NULL du premier argument
[ @ARGV1 ] -> ptr vers le 1er octet de la chaine terminée par NULL du second argument
.... etc autant de fois que d'argument
[  NULL     ] -> ptr NULL pour indiquer la fin des ARGV

[ @ENVP0 ] -> ptr vers la chaine terminée par NULL de la première variable d'environnement
[ @ENVP1 ] -> ptr vers la chaine terminée par NULL de la seconde variable d'environnement
... etc autant de fois que de variable d'environnement
[ NULL ] -> ptr NULL pour indiquer la fin des ENVP


ex: le 1er "pop ECX" te retournera ARGC, le suivant ARGV[0], le suivant ARGV[1] ... etc

Voilà, j'espère que cela va te permettre d'avancer ;)


Gentoo... que du bonheur ...
mercredi 25 juillet 2007 à 11:41:59 | Re : [nasm] ligne de commande

patatalo

Membre Club Administrateur CodeS-SourceS
re,


oui, c'est juste int main(int argc,char * argv[]) c'est expliqué ici [ Lien ]

@++
jeudi 23 août 2007 à 14:10:04 | Re : [nasm] ligne de commande

Kevin68

Réponse acceptée !
Bonjour,

Des excuses s'imposent. Je suis sincèrement désolé d'avoir mis autant de temps à remercier les personnes qui m'ont aidé. Il s'est écoulé presque un mois avant que je donne signe de vie. C'est donc avec humilité que je vous présente mes plus plates excuses. Je aussi suis venu donner la solution de mon problème afin que cela profite à ceux qui, comme moi, ont débuté en assembleur et qui souhaite exploiter la ligne de commande, plus particulièrement avec nasm.

Tout d'abord, un grand merci à BruNews, patatalo et dune2 pour votre accueil et vos réponses. Concrètement, vos réponses n'ont pas pu aider le débutant que je suis ^^. J'avais besoin d'un exemple de code. directement utilisable. Je n'ai, depuis mon premier message, fait que 2 à 3 heures d'asm, mais je commence maintenant à comprendre un peu mieux.

Maintenant, je remet le code ente les mains des débutant en espérant que ça leur servira.

Le code suivant affiche les arguments envoyés par la ligne de commande dans la console. Un argument par ligne. J'ai rappelé les instructions de compilation dans le code, pour un assemblage sous linux (donc le format d'exécutable ELF). Je recommande à ce propos de mettre des instruction dans un script (qu'on nommera par exemple 'assemble.sh') cela simplifie les choses.

[code]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PARSE.ASM (nasm)
;
; définition:
; -----------
;
; Affiche les arguments envoyés par la ligne de commande
;
; instructions de compilation:
; ----------------------------
;
; nasm -f elf -o parse.o parse.asm
; ld -O0 -o parse parse.o
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

section .data

new_line_char:
    db    0x0A
 
section .text
    global    _start
    align    4

_start:
    mov    ebp,esp    ; store esp in ebp

again:
    add    esp,4        ; esp ---> next parameter on stack
    mov    eax,[esp]    ; move next parameter into eax
    test    eax,eax        ; eax (parameter) == NULL pointer?
    jz    end_again    ; get out of loop if yes
    call    putstring    ; output parameter to stdout.
    jmp    again        ; repeat loop

end_again:
    xor    eax,eax        ; eax = 0
    inc    eax        ; eax = 1, system call _exit ()
    xor    ebx,ebx        ; ebx = 0, normal program exit.
    int    0x80        ; execute _exit () system call

    ; prints string to stdout
putstring:
    push    ebp
    mov    ebp,esp
    mov    ecx,[ebp+8]
    xor    edx,edx

count_chars:
    mov    al,[ecx+edx]
    test    al,al
    jz    done_count_chars
    inc    edx
    jmp    count_chars

done_count_chars:
    mov    eax,4
    xor    ebx,ebx
    inc    ebx
    int    0x80
    mov    eax,4
    mov    ecx,new_line_char
    xor    edx,edx
    inc    edx
    int    0x80
    mov    esp,ebp
    pop    ebp
    ret
[/code]

Ce code n'est peut-être pas parfait. Cependant, c'est à mon humble avis une base suffisante, vous devriez pouvoir vous débrouiller avec.

Pour ceux qui veullent aller plus loin, vous serez comblez par 'The Art of Assembly', une référence en la matière, disponible en anglais à l'adresse :

[ Lien ]

Je crois que tous ce qu'on a besoin de savoir ce trouve là, à mettre dans les favoris ^^. Plus précisément, le chapitre 13.3.12 traite de la ligne de commande et des arguments :

[ Lien ]

Sur ce, je renouvelles mes excuses pour mon manque de politesse et de rapidité, et souhaite à tous les développeurs assembleur une très bonne continuation.

Kevin68


Cette discussion est classée dans : ligne, code, commande, assembleur, nasm


Répondre à ce message

Sujets en rapport avec ce message

Quel est l'assembleur le plus rapide ? [ par epineurien ] Salut à tous !Une nouvelle question , suite à quelques infos trouvées sur le net ...J'utilise MASM32 , mais de nombreux sites dises qu'il produit un c mettre un son avec nasm [ par ricardvince ] bonjour je suis debutant en assembleur et jaurais aimais savoir s'il ete possible de mettre un son dans un programme en assembleur (avec nasm)???merci assembleur et afficheur LCD ?!!? [ par bugeur ] Bonjour,j'ai un programme a faire en assembleur pour l'affichageur d'un LCD ressemblant à :txtlcd           fcc       "__________"           fcb       Dur dur de compiler le code des autres... [ par sirehanack ] Bonjour à toutes et à tous!Je suis tout nouveau ici et dans le monde de l'assembleur. En fait je suis aussi nouveau dans l'informatique, je n'ai pour assembleur FPU [ par spiky31 ] Bonjour Est ce que quelqu'un pourrait me dire comment insérer du code asm avec des instructions FPU dans un programme C avec des explications ou un e [Assembleur inline C++] Récupérer l'offset d'un label [ par ShivX ] Bonjour a tous, J'ai un léger problème avec l'assembleur inline dans un programme en C++, n'étant pas un expert en asm j'espère que vous pourrez m'éc assembleur [ par calamsro ] j'ai commencé à étudier le langage machine l'assembleur que j'utilise est nasm mais manifestement la plupart des sources asm proposées sont faites pou lecture de date au clavier asm [ par w120 ] salut!! je suis un déééééééébutant en langage assembleur j'ai essayé de le comprendre seul mais au niveau de l'application je trouve tant de diffucul


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales