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 :

Lecture de chiffre avec TASM


Sujet :

x86 16-bits Assembleur

  1. #1
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut Lecture de chiffre avec TASM
    Bonsoir tout le monde,

    je cherche à faire un programme de calcul factoriel d'un chiffre lu en entrée tout en utilisant le registre BP. Voila ce que j'ai essayé :

    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
    data segment
    	bienvenu db 10,13,"***Ce programme Calcul le factoriel d'un nombre donnee en entree***",10,13,'$'
    	msg db 10,13,"donnez votre chiffre",'$'
    	msg1 db 10,13,"le resultat est:",'$'
    	result db ?	
    	erreur db 10,13,"Erreur,veuillez rentré un chiffre",'$' 
    data ends
    ma_pile                 segment   stack 
            dw       256 dup (?)
    TOS     LABEL    WORD
    ma_pile                   ends	  
    code segment
    	assume cs:code,ds:data, ss:ma_pile
    debut:
    	mov ax,data
    	mov dx,ax
    	mov ah, 9
    	lea dx, bienvenu
    	int 21h
    	;affichage du message bienvenu
    	lea dx,msg
    	MOV BX,0
    	MOV CX,10
    	;LECTURE ET CONVERTION DES DU NOMBRE LU DANS LE REGISTRE BX
    LECT:
    	MOV AH,01H ;on lit un caractaire
    	INT 21H
    	CBW
     
    	SUB AL,30H ;si oui on lui soustrait 30H
    	push ax
    	call near ptr fact
    	pop cx
    	pop bp
    	;fin de la procedure fact
    	lea dx,msg1
    	mov ah,9
    	int 21h
    	;pour afficher 'le resultat est'
    	lea dx,result	
    	mov ah,9
    	int 21h
    	;pour afficher le resultat
    	mov ax,4c00h
    	int 21h
     
    	;retour au systeme
     
    fact near ptr proc
    		push bp
    		mov bp, sp
    		push cx
    		mov cx, [bp+4]
    		;cx reçoit la valeur du chiffre
    		mov ax, 1
    		boucle1:
    			mul cx
    		loop boucle1
    		;appel recursive jusqu'a trouvé la valeur 1
    		mov result,cx
    		;pour l'affichage du resultat
    	ret
    fact endp		
    ends code
     
    end debut
    et j'ai eu les erreurs suivantes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C:\Users\reda\Desktop\TASM>tasm/l fact.asm
    Turbo Assembler  Version 3.2  Copyright (c) 1988, 1992 Borland International
     
    Assembling file:   fact.asm
    **Error** fact.asm(32) Undefined symbol: FACT
    **Error** fact.asm(49) Illegal instruction
    **Error** fact.asm(60) Operand types do not match
    **Error** fact.asm(63) Unmatched ENDP: FACT
    Error messages:    4
    Warning messages:  None
    Passes:            1
    Remaining memory:  398k
    Je ne comprends pas quel est le problème avec ma procédure fact…

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Il faut que tu modifies la variable d'environnement PATH pour ajouter le chemin d'installation de TASM
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    pourquoi personne ne me répond?

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Si tu compiles avec du TASM avec une syntaxe MASM, forcément TASM va râler...

    Si tu tiens absolument à utiliser la syntaxe MASM, installe MASM
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  5. #5
    En attente de confirmation mail
    Inscrit en
    Mars 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    bonsoir
    vous vous trompez je n'est jamais utiliser une syntaxe de MASM d'ailleurs je ne l'ai jamais utilisé au paravent,la seul syntaxe que j'applique c'est celle du TASM,après tous ce n'est qu'un simple programme donc la méthode elle est universelle

  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 : 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
    Oui, la syntaxe me rappelle bien ce que j'utilisais avec TASM
    (mais ça fait bien 15 ans que je n'y ai pas touché)

    pour les erreurs :
    **Error** fact.asm(32) Undefined symbol: FACT
    FACT n'a pas été déclaré
    Cette erreur va disparaitre quand la ligne 49 sera corrigée

    **Error** fact.asm(49) Illegal instruction
    Justement cette déclaration ne marche pas (d'où l'erreur du dessus)
    Essayes de mettre juste "FACT proc"

    **Error** fact.asm(60) Operand types do not match
    ligne 5 "result db ?"
    result est déclaré faire 1 octet , et cx c'est du 16 bits.
    Il faut donc choisir la taille de ton résultat et t'y tenir

    **Error** fact.asm(63) Unmatched ENDP: FACT
    Cette erreur va disparaitre quand la ligne 49 sera corrigée


    a+ François

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par cobra150 Voir le message
    Bonsoir.
    Vous vous trompez. Je n'ai pas utilisé une syntaxe de MASM, d'ailleurs, je ne l'ai jamais utilisée auparavant. La seule syntaxe que j'applique est celle du TASM. Après tout, ce n'est qu'un simple programme, donc la méthode est universelle. ;)
    Oui.
    Suivez les conseils de Forthman pour éliminer les erreurs d'assemblage dont la syntaxe d'un appel proche :

    ln 32 : call fact
    ln 49 : fact proc near

    Ensuite revoyez la logique du programme :
    - appel proche (CALL NEAR) donc paramètre en [bp+2] ;
    - 8! tient dans un mot (le registre 16 bits AX) mais une fois multipliée par 9 pour obtenir 9!, le résultat sera dans DX:AX (32 bits) et constituera la valeur limite ;
    - le service 9 du DOS sert seulement à afficher une chaîne de caractères se terminant par le symbole dollar ($).

  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
    le service 9 du DOS sert seulement à afficher une chaîne de caractères se terminant par le symbole dollar ($).
    methode qui est tellement bancale qu'il vau mieu creer une fonction pour afficher des chaines asciiZ, c'est à dire terminées par un octet = 0

    db 'chaine',0

    car comment afficher le caractère dollar avec ce service DOS tout pourrit? ça semble un peu difficille, il faut alors utiliser un autre service (INT21h,2) , juste pour le caractère $...misère..


    remarquez que les fonctions DOS qui demandent une chaine en paramètre vont utiliser une chaine asciiZ, et non une chaine ascii$. donc, encore une fois, le passé bancal de MS ressurgit.

    personnelement, je prefere utiliser le BIOS qui à l'avantage de ne pas dependre du DOS, et d'etre present sous DOS.
    ou mieu, creer une fonction de toutes pièces, avec ou sans lien avec DOS/BIOS. soit en direct to screen, soit en utilisant les fonctions d'affichage de caractères un par un (int 10h, 0Ah ; int 21h,6 ; INT21h, 2) . ce qui permet d'avoir un contrôle total sur le comportement de notre printf.

    seul bemol, si nous avons besoin d'utiliser STDOUT, il faut passer par INT 21h,9, mais là encore, si c'est pour generer une page HTML (CGI), il faut croiser les doigts pour que $ n'apparaisse jamais dans le code à envoyer...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Le service d'affichage de chaîne du DOS est hérité de la fonction BDOS 9 de CP/M. D'ailleurs, la version 3 de ce système propose la fonction BDOS 110 pour remplacer le dollar comme indicateur de fin de message.
    Citation Envoyé par John Elliott's original CP/M archive
    BDOS function 9 - Output string
    Supported by: All versions

    Entered with C=9, DE=address of string.

    Display a string of ASCII characters, terminated with the $ character. Thus the string may not contain $ characters - so, for example, the VT52 cursor positioning command ESC Y y+32 x+32 will not be able to use row 4.

    Under CP/M 3 and above, the terminating character can be changed using BDOS function 110.
    N.B. : le dollar ($) correspond au caractère ASCII 36 soit 32 + 4.

Discussions similaires

  1. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  2. [16 bits] Compilation avec TASM
    Par SaladinDev dans le forum Assembleur
    Réponses: 9
    Dernier message: 24/10/2005, 17h35
  3. Lecture de mail avec TIdPop3
    Par skywaukers dans le forum Web & réseau
    Réponses: 1
    Dernier message: 06/07/2005, 10h52
  4. [LG]Lecture de fichier avec une adresse internet
    Par forbin dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2005, 19h00
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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