IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Mes débuts en asm :p


Sujet :

x86 16-bits Assembleur

  1. #1
    Invité
    Invité(e)
    Par défaut Mes débuts en asm :p
    Salut a tous,
    Voila, programmant depuis quelques mois en C et m'interessant a l'informatique, il était obligatoire que je tombe la dedans est cela est fait.
    Sous les conseils d'un amis j'ai installé DOS (émulé) et fasm, et c'est parti !

    Alors je commences avec quelques petits programmes, mais j'aimerais bien pourvoir afficher par exemple le résultat d'une addition que je viens de faire...

    Ou avec les chaines de caractères, par exemple j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mov ah, 09h
    mov dx, buff ; 
    int 21h
    ...
    buff db 10, 12 dup("$")
    Seulement avec ce code j'affiche aussi les 2 1ers octets du buffer soit ce qui ne m'interesse pas. Donc je me dis facil, je fais :
    Seulement là plus rien ne s'affiche...

    Donc si quelqu'un avait des solutions a mes problèmes, je ne demande surtout pas de code mais quelques explications seraient les bienvenues.
    Merci

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    buff db 10,12 dup $ est un non sens, surtout avec fasm.

    si tu veux afficher une chaine, il faut une chaine à afficher, or, db 10,$,$,$,$,$,$,$,$,$,$,$,$ n'est pas du tout une chaine capable d'etre affichée par int21h.

    le caractère $ indique la fin de chaine, et le caractère 10 indique un saut de ligne (LF)
    donc, primo, avant de pouvoir afficher des nombres, il faut pouvoir afficher des lettres.

    premiere chose à faire, constater qu'avec buffer db 'chaine',$, le mot chaine sera bien affiché à l'ecran.

    ensuite, ecrire une ligne qui modifie le contenu de la chaine, par exemple:
    avec un mov dword[buffer],'tour' le resultat affiché sera la chaine 'tourne' au lieu de 'chaine', car on modifié le premier dword de la chaine, soit 4 octets, soit 4 caractères.

    ensuite, creer un programme qui affiche le contenu d'un registre en hexadecimal, en creant une chaine, ou directement avec le caractère dans le registre al.

    allez, bon courage, ce n'est que le debut.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, je me lance alors :p Par contre juste un petit truc : le buffer que je crée il est fait pour la fonction 0ah de l'int 21h , c'est pour cela que je fais buff db 10, 12 dup('$'). Et cela m'affiche mon texte mais avec 2 octets au début de la chaine, et donc j'ai droit a un symbole au début de mon texte. Et ce qui me frustre c'est que logiquement envoyer buff+2 a dx ça devrait envoyer l'adresse de mon buffer + 2 octets, soit supprimer le symbole au début de ma chaine a l'affichage, non ? Mais cela ne marche pas et ne m'affiche rien.

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonjour,

    La fonction 09h de l'interruption 21h affiche une chaine terminée par "$"
    et n'a besoin de rien d'autre (pas de longueur de chaine en début par exemple)
    Donc aucune valeur n'est nécessaire en début de chaine.

    Un truc comme ça marche parfaitement :
    Tu es sur d'avoir bien initialisé le registre DS ?

    a+ François

  5. #5
    Invité
    Invité(e)
    Par défaut
    Comme je le disais, cette chaine est faite pour la fonction 0ah qui elle nécéssite une taille. Et lorsque j'affiche cette chaine, logiquement il y a les 2 1ers octets qui ne sont pas ma chaine, qui s'affichent ...

  6. #6
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    il manque un gros bout de code, ça aide pour comprendre, car un petit fragment de code n'est pas significatif de l'ensemble.

    quoi qu'il en soit, utiliser les interruptions dos pour afficher et triturer des chaines de caractères, c'est pas malin, ces fonctions sont super lentes.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ba comme je disais dans mon 1er post, un amis m'a conseillé de commencer sous DOS donc je penses pas que y'ai autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    org 100h
     
    mov ah, 0ah
    mov dx, buff
    int 21h
     
    mov ah, 09h
    mov dx, buff
    int 21h
     
    mov ax, 4c00h
    int 21h
     
    buff db 10, 12 dup('$')
    Voila mon code entier. Il marche mais affiche la chaine entrée avec 2 octets au début, donc en général j'ai droit a un smiley ou autre symbol :p Et du coups c'est frustrant je me dis que j'arrive meme pas a me déplacer de X octets pour la lecture.

  8. #8
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    un petit coup d'oeil ici:
    http://docs.huihoo.com/help-pc/int-int_21.html
    http://docs.huihoo.com/help-pc/int-int_21_a.html

    l'entrée au clavier sert à communiquer avec une fonction qui va convertir en données ce que le clavier envoie.

    si le but est de faire une addition avec le clavier, comme pa exemple en ecrivant ceci:
    123+432
    et en tappant entrée, alors ton code est très incomplet.

    tout ce que tu vas pouvoir afficher, ça sera le buffer du clavier DOS.
    le premier octet du buffer indique la taille du buffer.
    le second indique le nombre d'octets retournés par int21h_a
    le reste contient le buffer clavier DOS, à savoir des caractères ascii correspondant aux touches et la page de code du systeme.

    si tu veux calculer, il va te falloir une fonction pour parser la chaine et la convertir en operations que le programme pourra interpreter.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Non sur ce code je voulais juste afficher la chaine sans les 2 premiers octets. Donc je me disais qu'un simple mov dx, buff+2 marcherait mais non. Et c'est cela le but de ma question. Pour ce qui est des calculs de nombre je ne m'y suis pas encore mis.

  10. #10
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonjour,

    Je me suis permis de modifier un peu ton code pour faire des essais...

    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
    org 100h
     
    debut:
     
    ; saute une ligne pour plus de lisibilité
    mov ah, 02h
    mov dl,10
    int 21h
    mov ah, 02h
    mov dl,13
    int 21h
     
    ; saisie dans le buffer
    mov ah, 0Ah
    mov dx, buff
    int 21h
     
    ; saute une ligne pour plus de lisibilité
    mov ah, 02h
    mov dl,10
    int 21h
    mov ah, 02h
    mov dl,13
    int 21h
     
    ; affichage du buffer
    mov ah, 09h
    mov dx, buff+2
    int 21h
     
    ; Attend une touche clavier, si <> Echap (code 27) on boucle
    mov ah, 07h
    int 21h
    cmp al,27
    jnz debut
     
    ; fin du prog
    mov ax, 4c00h
    int 21h
     
    buff db 11,0, 12 dup '$'
    J'ai modifié l'initialisation des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buff db 10, 12 dup('$')
    J'ai remplacé 10 par 11 car le buffer se terminera par le code 13 (touche enter)

    Il manquait le 2eme octet du buffer (longueur enregistrée) que j'initialise à 0

    Par contre, il faudrait remettre la chaine à "$$$$$$$$$$" avant chaque saisie
    sinon comme à la fin de la saisie la fonction 0Ah place un retour chariot (code 13)
    à la fin de la chaine, ça fout le bordel à l'affichage.

    par exemple :
    Entrée de "1234567890"
    Affichage : "1234567890"
    Entrée de "AZE"
    Affichage : "567890"

    En fait, dans lors de la 2eme saisie, "AZE" a bien été affiché, mais comme
    il y a un code ASCII 13 après, le curseur revient en début de chaine
    pour afficher 567890 et enfin arrêter l'affichage au "$"
    Le contenu de buff+2 = "AZE*567890$" (j'ai remplacé le code 13 par *)

    Comme l'a dit Edfed, tu devrais éviter d'utiliser les interruption du DOS.
    Elles sont lentes, et comme tu peux le constater, pas toujours très compatibles entre elles

    a+ François

  11. #11
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Je pensais à un truc tout bête/facile
    Plutôt que de lire la chaine en format ASCII$, tu peux la lire comme elle
    a été enregistrée cad en tenant compte de la longueur dans le buffer.

    un exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mov cl,[buff+1] ; longueur dans CL
    cmp cl,0           ; ça c'est au cas ou il n'y aurait rien dans le buffer
    jz rien_a_afficher ; sinon ça va afficher 256 caractère
    mov si,buff+2 ; SI pointe le début de la chaine
    boucle_affiche:
    mov ah,02h ; fonction 02h = sortie de caractère
    mov dl,[si] ; DL = caractère pointé par SI
    int 21h
    inc si ; SI = SI+1 pour pointer l'octet suivant
    dec cl ; CL = CL-1
    jnz boucle_affiche ; si CL = 0 on passe à la suite
    rien_a_afficher:
    a+ François

  12. #12
    Invité
    Invité(e)
    Par défaut
    Salut et merci tous de vos réponses, je met le sujet en résolu

    Pour info j'en ai eu mare de DOS émulé et tout ça :p Je suis passé à nasm en 32 bits sous linux et je m'amuse autrement Les appels systèmes c'est sympa ! :p

    Et par dessus tout maintenant les codes asm que je compile ont une entête ELF. Du coups la syntaxe nasm me plait vachement car je retrouve mes sections et tout ce que je connais plus ou moins de la structure d'un programme. Comparé a DOS (qui pour moi est rustique, ne me lynchez pas, je suis née en 1992 xD), c'est le paradis je m'y retrouve la !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mes débuts en Perl, un peu d'aide svp
    Par Kiyoshi dans le forum Langage
    Réponses: 7
    Dernier message: 22/09/2008, 10h43
  2. [Windows Server 2003] - Mes débuts
    Par franck1001 dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 11/07/2008, 00h05
  3. [POO] Mes débuts en OO sur PHP
    Par oranocha dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2008, 17h46
  4. mes débuts
    Par steph35 dans le forum Mon site
    Réponses: 6
    Dernier message: 09/06/2006, 20h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo