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 :

fonction entrer un entier


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut fonction entrer un entier
    salut a tous, j'ai programmé la fonction 'scanner nember' mais toujours l'écran n'affiche pas une résultat.
    les étapes de ma fonction sont : -afficher un message a l'utilisateur '"Entrer le nombre des lignes: $"' puis il donne la main a l'utilisateur de saisir ce nombre .
    voila ma code et j'en sais ou se trouve l'erreur exactement , j'essayé plusieurs fois a corrigé mais rien a changer

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    ; multi-segment executable file template.
     
    data segment               
     
        pkey db "Entrer le nombre des lignes:   $" 
        nbr_lignes dw 0
        nbr_colonnes dw 0  
     
        tab_colonnes db 2,?, 2 dup(?) 
        tab_lignes db 2,?, 2 dup(?)
     
    ends
     
     
    saisir_nbre_ligne PROC   
     
        xor si,si
        xor ax,ax 
        xor cx,cx
        xor bx,bx
        xor dx,dx
     
       lea dx, pkey
        mov ah, 9
        int 21h
     
    saisir: mov ah,0Ah
            int 21h
     
            mov dh,1      
     
         mov bx,offset tab_lignes
     
    verif: mov cl, [bx+1]
            mov si,cx
           mov dl,[bx+si+1] 
           cmp dl,'0'
           jl saisir 
     
           cmp dl,'9'
     
           jg saisir
     
           sub dl,'0'
     
          mov al,dh
          mul dl
     
     mov nbr_colonnes,ax
     
          dec si
          cmp si,0    
     
        je fin
     
    fin:mov al,dh
        xor cl,cl
        mov cl,10
        mul cl
        mov dh,al
     
        jmp verif   
     
     
    ret
     
     saisir_nbre_ligne endp       
     
     
     
    ;stack segment
      ;  dw   128  dup(0)
    ;ends
     
    code segment
    start:
    ; set segment registers:
        mov ax, data
        mov ds, ax
        mov es, ax
     
     
              call  saisir_nbre_ligne
     
     
     
        ;lea dx, pkey
        ;mov ah, 10h
        ;int 21h        
     
     
        ; wait for any key....    
        ;mov ah, 1
        ;int 21h
     
     
     
        mov ax, 4c00h ; exit to operating system.
        int 21h    
    ends
     
    end start ; set entry point and stop the assembler.

    j'ai une petite question ; est ce que possible de déclarer un tableau de 2 dimensions en ASM !

    Merci mes ami(e)s

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut, pour ton problème de array 2D, oui c'est effectivement possible (tous ce que font les compilateurs est possible de le retranscrire en asm, car après tout, c'est le langage passerelle entre langage du cpu et langage de programmation lisibles).

    Qu'un tableau soit à 1D ou 50D, c'est juste dans la manière dont tu parcours ton tableau, si c'est a 1D, tu n'as besoin que d'un indice (offset du début de l'array), en 2D, tu auras 2 indices, l'un sélecteur de ligne et l'autre sélecteur de colonne, en 3D = 3 indices (1 sélecteur de la coordonnée sur l'axe x, un autre sur l'axe y et l'autre sur l'axe z), après pour les autres dimensions, désolé mon esprit est trop peu évolué pour donner une image à une telle structure ^^ juste qu'il te faudra y indice = y dimension)

    Après pour ton problème principale, à moins de l'analyser manuellement, je n'ai pas de windows 32 bit sous la main, ni de dosbox.

    (sous x64, la DOS API n'est plus disponibles, car apparement, elle est codée en 16 bit )

  3. #3
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Salut, pour ton problème de array 2D, oui c'est effectivement possible (tous ce que font les compilateurs est possible de le retranscrire en asm, car après tout, c'est le langage passerelle entre langage du cpu et langage de programmation lisibles).

    Qu'un tableau soit à 1D ou 50D, c'est juste dans la manière dont tu parcours ton tableau, si c'est a 1D, tu n'as besoin que d'un indice (offset du début de l'array), en 2D, tu auras 2 indices, l'un sélecteur de ligne et l'autre sélecteur de colonne, en 3D = 3 indices (1 sélecteur de la coordonnée sur l'axe x, un autre sur l'axe y et l'autre sur l'axe z), après pour les autres dimensions, désolé mon esprit est trop peu évolué pour donner une image à une telle structure ^^ juste qu'il te faudra y indice = y dimension)

    Après pour ton problème principale, à moins de l'analyser manuellement, je n'ai pas de windows 32 bit sous la main, ni de dosbox.

    (sous x64, la DOS API n'est plus disponibles, car apparement, elle est codée en 16 bit )
    merci bine pour ton explication, mais c'est possible de me donner un tutoriel explicatif pour la déclaration d'un tableau en 2 dimensions ?

    pour ce qui connait langage assembleur n'hésite pas de m'aider pour corriger la fonction 'scanner nember'

  4. #4
    Invité
    Invité(e)
    Par défaut
    Et bien, comme tout ne reviens qu'à faire un tableaux a 1D en RAM (gros tableaux 1D).

    Tu fais par exemple:
    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
     
     
    ; vmovss - vmulss - vaddss = instruction avx, single instruction for multipl data
     
    ; Prepare data
        vmovss      ymm0, [y]
        vmovss      ymm1, [screen_x]
        vmovss      ymm2, [x]
     
    ; Calculus of (y * screen_x + x)
        vmulss      ymm0, ymm0, ymm1
        vaddss      ymm0, ymm0, ymm2
     
    ; Store the output in screen[]
        vcvtps2dq   ymm0, ymm0              ; 8 * float32 -> 8 * int32
        vmovss      [temp], ymm0
        mov         eax, [temp]
        mov         [screen + eax] dword 0
     
    ; data
        screen:     times (1024*800)    dd  0
     
        y           dd  0           ; en float
        x           dd  0           ; ...
     
        screen_y    dd  800.0
        screen_x    dd  1024.0
     
        temp        dd  0
    Dernière modification par Invité ; 10/05/2015 à 19h51.

  5. #5
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Et bien, comme tout ne reviens qu'à faire un tableaux a 1D en RAM (gros tableaux 1D).

    Tu fais par exemple:
    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
     
    ; vmovss - vmulss - vaddss = instruction avx, single instruction for multiple data
     
    ; Prepare data
        vmovss      ymm0, [y]
        vmovss      ymm1, [screen_x]
        vmovss      ymm2, [x]
     
    ; Calculus of (y * lenght + x)
        vmulss      ymm0, ymm0, ymm1
        vaddss      ymm0, ymm0, ymm2
     
    ; data
        screen:     times (1024*800)    dd  0
     
        y           dd  0       ; en float
        x           dd  0       ; ...
     
        screen_y    dd  800.0
        screen_x    dd  1024.0


    s'il vous plait tu peut mettre des commentaire car j'ai étudié l'ASm et j'ai pas vu les instructions de ce programme
    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vmovss = move     32 bit data
    vmulss = multiply 32 bit data
    vaddss = add      32 bit data
    Et ca reste des instructions du cpu intel: https://software.intel.com/en-us/isa...ions/intel-avx

    Voilà voilà

  7. #7
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vmovss = move     32 bit data
    vmulss = multiply 32 bit data
    vaddss = add      32 bit data
    Et ca reste des instructions du cpu intel: https://software.intel.com/en-us/isa...ions/intel-avx

    Voilà voilà
    je travaille sur la version emu8086

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bon bah alors sois tu utilises le fpu pour gérer les float ou tu te focalise sur les entiers et dans ce cas, ça serait plutôt (no fpu, un peu chiatique lol):

    (MUL r/m32 - Unsigned multiply (EDX:EAX ← EAX ∗ r/m32))

    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
     
    ; Prepare data
        mov      eax, [y]
        mov      ebx, [x]
     
    ; Calculus of (y * screen_x + x)
        mul     [screen_x]
        add     eax, ebx
     
    ; Store the output in screen[]
        mov     [screen + eax] dword 0
     
    ; data
        screen:     times (1024*800)    dd  0
     
        y           dd  0
        x           dd  0
     
        screen_y    dd  800
        screen_x    dd  1024
    L'exemple donné, montre l'utilisation des var x et y en tant que selectionneur de byte dans screen[], si tu veut que ça soit en tant que dword, tu multiplie x et y par 4.

  9. #9
    Membre habitué
    Femme Profil pro
    Architecte de système d'information
    Inscrit en
    Février 2012
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2012
    Messages : 404
    Points : 127
    Points
    127
    Par défaut
    d'accord je vous essayé de faire . merci encore

  10. #10
    Invité
    Invité(e)
    Par défaut
    Pas de soucis, sinon où penses-tu être bloqué dans ton code ?

    Si c'est une question de fonctions, tu peux regarder du coté de ce site: http://www.gladir.com/LEXIQUE/INTR/INT21.HTM?Target=C


    (ça ne serait pas plutôt scanner number ?)
    Dernière modification par Invité ; 10/05/2015 à 20h30.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/09/2009, 19h07
  2. [XL-2002] Problème de parametre fonction : tableau d'entier
    Par Floriang33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2009, 17h42
  3. affichage de texte en fonction d'un entier
    Par fylzz dans le forum JSF
    Réponses: 3
    Dernier message: 19/01/2009, 10h15
  4. Fonction donnant l'entier inférieur
    Par pitizone dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/03/2007, 17h24
  5. la fonction puissance pow() ? entier, réel ?
    Par italiasky dans le forum C
    Réponses: 9
    Dernier message: 03/12/2006, 17h41

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