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 :

[TASM] Quelles sont les erreurs dans ce programme ?


Sujet :

x86 16-bits Assembleur

  1. #1
    S.H
    S.H est déconnecté
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Points : 31
    Points
    31
    Par défaut [TASM] Quelles sont les erreurs dans ce programme ?
    Salut à tous
    Est-ce qu'il y a quelqu'un dites-moi
    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
    stackk  segment 
    f    db      10 dup('?') 
    stackk  ends 
    data    segment 
    tab      db      ('?') 
    data    ends 
    code    segment 
    main    proc    far 
            assume  ss:stackk, ds:data, cs:code 
            mov     ax,data 
            mov   ds,ax 
            mov   ax,1100;  700+400
            mov   cx,0 
            mov   bl,0
    z:      sub   ax,10
            cmp   bl,9
            jg    z
            mov   bh,1
            mov   Tab[bh],bl
            inc   cx
            inc   bh
            cmp   ax,9
            jg    z
            mov   Tab[bh],bl
            call  print 
            mov   ah,4ch 
            int   21h 
    main          endp 
    print         proc     near 
            mov   ah,02h 
    s:      mov   dl,Tab[cx]
            add   dl,30h
            int   21h 
            loop s
            ret 
    print         endp 
    code          ends 
                  end       main

  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
    he he
    bein il y en a des tas...
    premierement on addresse pas la memoire avec un registre 8bits, il faut le convertir en 32 bits ou 16 bits...
    sauf qu'en 16 bits, c'est vachement limité et lent, donc 32 bits...

    puis, la pile n'a pas besoin d'etre definie, et enfin, il faut utiliser fasm pour coder en asm, c plus clair comme syntaxe...
    les end proc, proc near et compagnie, tres peu pour moi, merci...

    donc, pour resumer, passe(z) a fasm, dispo sur le site http://flatassembler.net

    puis si tu(vous) pouviez ecrire le code dans un tag [ code ] [ /code ] avec une belle mise en page, tabulation pour les instructions, label a gauche, pas de code sur la ligne d'une label, sauf si c'est une donnée..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
               org 100h
               mov bla,bla
               shr bla,bla
    blabla:
               mov bal,bla
    blablabla:
               int blabla
               ret
    ça aide a rendre le code digeste pour tout le monde...

  3. #3
    S.H
    S.H est déconnecté
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Points : 31
    Points
    31
    Par défaut
    merci edfed de votre reponce desole j'ai rient comprais parceque J'utilise TASM (16bit) et ce program affiche le resultat 1100

    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
     
    stackk  segment 
            db      10 dup(' ') 
    stackk  ends 
    data     segment 
    tab       db      () 
    data     ends 
    code     segment 
    main     proc      far 
               assume  ss:stackk, ds:data, cs:code 
                mov     ax,data 
                mov     ds,ax 
                mov     ax,1100;  700+400
                mov     cx,0 
                mov     bl,0
    z:         sub      ax,10
                cmp     bl,9
                jg       z
                mov     bh,1
                mov     Tab[i],bl
                inc       cx
                inc       bh
                cmp     ax,9
                jg        z
               mov      Tab[i],bl
               call       print 
               mov      ah,4ch 
               int        21h 
    main     endp 
    print     proc     near 
               mov     ah,02h 
    s:        mov     dl,Tab[cx]
               add     dl,30h
               int      21h 
               loop     s
               ret 
    print     endp 
    code     ends 
               end       main
    alors ou est les erreurs

  4. #4
    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
    bon, bein, c'est pas du tout ça qu'il faut ecrire pour afficher un chiffre a l'ecran...
    oui, l'asm, c'est tres epprouvant au debut...
    si tu prend fasm, ton cerveau aura moins mal, tasm fait vachement cogiter avec ses directives et les mode d'addressages... mais bon, assez de troll...

    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
    47
    48
    49
    50
    51
    52
    53
     
    format MZ
    stack 100h        ;taille de la pile = 100h soit 256 octets...
     
    entry icode:start  ;où commencer l'execution du programme?
    segment icode     ;segment de code, icode est un nom choisi arbitrairement 
    ;comme le symbile start et le reste, on peu tou appeler en toto ou pipi si on veu
    start:
            mov ax,idata   ;initialiser ds
            mov ds,ax
    .loop:
            mov ebx,tab    ;ebx=tab
            call extra:print  ;la fonction print est dans un autre segment
    ;c'est un far call
    ;les near call sont possibles aussi
            in al,60h    ;entrer le scancode du clavier
            cmp al,1   ;=echap?
            jne .loop   ;non, alors continuer
            mov ax,3  ;sortie de base
            int 10h
            int 20h
     
    segment extra
    print:                   ;ceci est une procedure, 
                              ;tu peu chercher le endp un bon moment, il y est pas
            push esi edi eax ebx ecx edx es
            mov ax,0b800h        ;l'ecran texte commence au segment 0b800h
            mov es,ax               ;utiliser es pour pointer dans l'ecran
            add ebx,4               ;l'index des données a afficher
            mov edi,[ebx-4]       ;charger le curseur texte
            xor esi,esi               ;pointeur de la chaine de caracteres = 0
            mov ah,51h             ;attributs de couleur = 51h, violet derriere, bleu devant
    .s:
            mov al,[ebx+esi]      ;charger un caractere
            or al,al                   ;le caractere = 0?
            je .e                     ;bein ouais, alors on sort
            cmp edi,160*50       ;on est en bas de l'ecran? 
            jl @f                     ;oui alors on reset le pointeur de l'ecran
            xor edi,edi
    @@:
            mov [es:edi],ax     ;on transfere le caractere complet dans la memoire texte
            add edi,2   ; Pointeur Ecran + 2 taille d'un pixel en octet
            inc esi       ;pointeur chaine +1  taille d'un caractere texte en octet
            jmp .s       
    .e:
            mov [ebx-4],edi  ;sauver le curseur ecran
            pop es edx ecx ebx eax edi esi
            retf               ;retour depuis un autre segment
     
    segment idata
    tab:                      ;ceci est la zone de données pointée par DS
    .ptr dd 0    ;ici sera stocké le pointeur ecran
    db 'heu heu heu heu euuuheufh dfheuhudehu ehuhd hudehue hdu hduehu',0
    voilà, bon, c'est pas pour ecrire des chiffres, mais ça te donne une idée de comment afficher du texte a l'ecran

    pour le reste, il faut reflechir au point de le comprendre comme l'alphabet...

  5. #5
    S.H
    S.H est déconnecté
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup Edfed
    Je suis débutant et je travaille en Tasm 16 bits et je crois ton program est en Fasm 32 bits et Fasm est très difficile pour moi
    Regarde mon programme, j'ai trois fautes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov     Tab[i],bl
    mov      Tab[i],bl
    mov     dl,Tab[cx]
    Ou il faut changer tout le programme

  6. #6
    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 : 49
    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
    Salut S.H.

    Sans parler d'erreurs, je ne vois pas le bout de code qui fait la convertion
    Chiffre en base 10 --> ASCII

    a+ Francois

  7. #7
    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
    fasm est plus simple que les autres... largement plus simple, c'est d'ailleur pour ça que je l'utilise...

    bon, les erreurs, [i], c'est quoi [i]?
    en asm il existe les symboles, et les mnemoniques...
    [i] n'est ni l'un ni l'autre, car il n'est pas declaré...

    ensuite, ton algorythme de convertion est faux, archi faux...
    sub ax,10
    cmp bl,9
    je vois pas le rapport, quand on modifie un registre, les autres registres ne sont pas affectés, donc, cmp bl,9 n'a rien a faire là... il faut un test du genre cmp ax,9
    puis meme là, ça va durer longtemps... car une convertion ne se fait pas comme ça.

    il faut faire un idiv, et recuperer le modulus pour l'afficher...

    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
     
    topofbuffer rd 1
    .buffer rb 32
    endofbuffer db 0
    dectoascii:
    ; eax = number to convert
            mov esi,endofbuffer
            dec esi
            mov ebx,10
            mov ch,' '
            cmp eax,0
            jge .positif
            neg eax
            mov ch,'-'
    .positif:
    .next:
            cdq
            idiv ebx
            mov cl,dl
            and cl,0fh
            add cl,'0'
            mov [esi],cl
            dec esi
            cmp eax,0
            jne .next
            cmp ch,'-'
            je @f
            mov ch,cl
            inc esi
    @@:
            mov [esi],ch
            mov [topofbuffer],esi
            ret
    cette fonction converti un nombre decimal en ascii, le resultat est une chaine de caractere...

  8. #8
    S.H
    S.H est déconnecté
    Nouveau membre du Club
    Inscrit en
    Octobre 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 122
    Points : 31
    Points
    31
    Par défaut
    merci beaucoup mes amis

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

Discussions similaires

  1. les erreurs dans un programme
    Par slamdank123 dans le forum C
    Réponses: 3
    Dernier message: 11/03/2013, 10h08
  2. [XL-2007] Quelle sont les nombres dans une plage leures sommes equale un nombre connue
    Par iliesss dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/09/2012, 21h16
  3. Quelles sont les phases d'un programme?
    Par patchi225 dans le forum Débuter
    Réponses: 3
    Dernier message: 01/07/2011, 18h33
  4. quelles sont les références dans les annonceurs ?
    Par michael866 dans le forum Publicité
    Réponses: 0
    Dernier message: 08/06/2011, 22h17
  5. Réponses: 116
    Dernier message: 15/02/2010, 11h50

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