Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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 :
    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 expérimenté Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 563
    Points
    563

    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
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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 émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    493
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 39
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 493
    Points : 953
    Points
    953

    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
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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 expérimenté Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 563
    Points
    563

    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
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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 :
    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 expérimenté Avatar de edfed
    être humain
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 563
    Points
    563

    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
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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 émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    493
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 39
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 493
    Points : 953
    Points
    953

    Par défaut

    Bonjour,

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

    Code :
    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 :
    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 émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    493
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 39
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 493
    Points : 953
    Points
    953

    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 :
    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
    Nouveau Membre du Club
    Homme Profil pro Romain
    Inscrit en
    avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Nom : Homme Romain
    Âge : 22
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : avril 2011
    Messages : 60
    Points : 30
    Points
    30

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •