[Turbo Assembleur] Récup données

Discussion dans 'Web, design' créé par Angy, 15 Décembre 2006.

Statut de la discussion:
Fermée.
  1. Offline
    Angy \o/
    Bonjour!

    J'ai un petit problème, comme je suis assez novice en turbo assembleur. J'essaie de récupérer un nombre que j'ai entré au clavier pour pouvoir faire une soustraction dessus. Mais je n'arrive pas à récupérer les chiffres exacts que j'ai encodé :[]

    J'ai besoin de soustraire de 30 chacun des chiffres (vu qu'ils sont en ascii) pour les avoir décimal, mais sachant que je n'arrive pas à récuperer, je suis un peu mal en point :-D

    Quelqu'un saurait un peu m'éclairer?

    Merci bien :p

    Code:
    .386
    
    Donnees SEGMENT PARA PUBLIC USE16
    	Question db 'Bonjour,quel est votre nom? ','$'
    	Question1 db 'De quel nombre voulez vous connaitre la parite? ','$'
    	Repet db 'Bonjour, ','$'
    	Nom db 18 dup(20)	
            Maj db 1 dup(20)
    	Nb db 2 dup(0)
    	nbcar db 2 dup(0)
    	parite db ' est un nombre ','$'
    	
    Donnees ENDS
    
    Code SEGMENT PARA PUBLIC USE16
    	ASSUME DS: Donnees,CS:Code
    debut:
    	mov AX,Donnees
    	MOV DS,AX
    	
    	MOV DX,offset question
    	call affiche ; affiche la demande de nom
    	call passeligne
    	mov dx,offset Nom
    	call encode ; encodage du nom
    	call passeligne	 ; passage a la ligne suivante
    	mov dx,offset repet
    	call affiche ; affiche bonjour,
    	mov dx, offset nom[2]
    	call affiche ; affiche le nom
    	call passeligne
    	mov dx, offset question1
    	call affiche ; affiche la demande du nombre
    	call passeligne
    	mov dx, offset nb
    	call encode ; encodage du nombre	
    		
    	call passeligne ;passage a la ligne suivante
    
    	call calculparite
    
    	mov dx, offset nb
    	call affiche ; affichage du nombre
    	mov dx, offset parite	
    	call affiche ; affiche est un nombre
    	
    	mov ah,4cH
    	int 21h
    	
    	affiche proc near
    	push ax
    	mov ah,09h
    	int 21h
    	pop ax
    	ret
    	endp		
    	
    	encode proc near
    	push bx
    	mov bx,dx
    	mov [bx],ah
    	mov ah,0Ah
    	int 21H
    	mov ah,[bx+1]
    	pop bx
    	ret
    	endp
    	
    	passeligne proc near
    	push ax
    	push dx
    	mov dl,0dh
    	mov ah,02h
    	int 21h
    	mov dl,0ah
    	mov ah,02h
    	int 21h
    	pop dx
    	pop ax
    	ret
    	endp
    		
    	calculparite proc near
    	push ax
    	push dx
    	push bx
    	mov bl,02
    	mov ax, offset nb
    	div bl
    	pop bx
    	pop ax
    	pop dx
    	ret
    	endp
    	
    		
    Code ENDS
    Pile SEGMENT PARA stack USE16 'stack'
    	db 256 dup (?)
    Pile ENDS
    end debut
    Angy, 15 Décembre 2006
    #1
  2. Offline
    Froggy fake geek
    tu parviens à récupérer le nom mais pas les chiffres ? o_O


    bon j'ai bine relu le truc, donc 2 choses :

    1. faut éclaircir cette histoire de nombre qui ne rentre pas mais bien le nom.

    2. a ta place, je mettrais mon passageligne après avoir calculé la parité, comme ça tu t'assure de pas changer la valeur du registre ou se trouver ton nombre après l'encodage et tu le réutilise tout de suite ;)
    Froggy, 15 Décembre 2006
    #2
  3. Offline
    Angy \o/
    Ben en faite, mon problème c'est que avec le nom, je mets bien

    mov dx, offset nom[2] pour le récuperer.

    mais pour le nombre, si j'encore un nombre, ensuite que je fais

    mov dx, offset nb
    ou
    mov dx, offset nb[2]

    Il me met quelque chose qui a rien avoir avec le nombre encoder :-(
    Angy, 16 Décembre 2006
    #3
  4. Offline
    Ahava Revenant
    T'es sur que c'est 30 ? J'ai souvenir que 0 -> 48 donc à faire -48 pour avoir la vraie valeur :gne:


    Je peux totalement me tromper et j'ai fait juste de l'ASM, pas du Turbo ASM (je savais meme pas que ça existait)... :oops:



    edit : je crois que c'est ça, le code de 0 est bien en ASCII 48, suffit de regarder là :

    [IMG]
    Ahava, 16 Décembre 2006
    #4
  5. Offline
    Froggy fake geek
    oué en effet ... c'est 48 :-D

    le v'la ton pb :D
    Froggy, 16 Décembre 2006
    #5
  6. Offline
    Angy \o/
    Ah ouais... merci c'était ça haha :-D

    Merci beaucoup :oops: :oops:


    Sinon autre problème: Pour calculer la parité, je sais que je dois diviser par 2 le nombre obtenu, s'il y a un reste c'est un pair sinon un impair.

    Et donc, je dois faire "div bl" et ça divisera ax par bl (ici je mets bl à 2) mais quand je fais la division, il me dit Divide by zero/overflow error.

    (ps: j'ai dans ax: 0202 pour 22, ca vient de la l'erreur?)

    Code:
    calculparite proc near
    	push ax
    	push dx
    	push bx
    	mov bl,02
    	div bl
    	pop bx
    	pop ax
    	pop dx
    	ret
    	endp
    Angy, 17 Décembre 2006
    #6
  7. Offline
    Ahava Revenant
    t'es pas censé diviser AX par BX, ou AL par BL ?


    Regarde bien ce qui est divisé par quoi, c'est pas évident, avec les 3 possibilités existantes.. ( soit AL , soit AX soit EAX )...


    Jparie que c'est ça, t'a un zéro qui traine qque part et boum divided by zero =]
    Ahava, 17 Décembre 2006
    #7
  8. Offline
    Froggy fake geek
    en effet ... j'coirs bien que peut importe la plate forme, cette règle la elle bouge pas donc ... =]

    (ptin comment on voit trop qu'on est dans la même école et que c'est la seule a faire de l'ASM :cool:)
    Froggy, 18 Décembre 2006
    #8
  9. Offline
    Angy \o/
    Ah d'accord :-D

    Sinon, si mon chiffre est 22, il met 0202 dans AX après la soustraction.

    Il considère 0202 comme 202 ou comme 22?
    Angy, 18 Décembre 2006
    #9
  10. Offline
    Froggy fake geek
    bah ca dépend de ce à quoi tu regardes.

    si ax : 0202 ou 202, ça équivaut à la même chose

    si al : 02 ou 2

    si ah : 02 ou 2

    =] 'tention que ce soit bien en hexa que tu parles hein ;) parce que 202(16) != 202(10) aussi :)
    Froggy, 19 Décembre 2006
    #10
  11. Offline
    Angy \o/
    Merci beaucoup! :-D
    Angy, 19 Décembre 2006
    #11
  12. Offline
    Ahava Revenant
    [horssujet]

    Vous êtes tous les deux à l'ESI ? :p

    [/horssujet]
    Ahava, 20 Décembre 2006
    #12
  13. Offline
    Angy \o/
    Non, pas moi :oops:
    Angy, 20 Décembre 2006
    #13
  14. Offline
    Froggy fake geek
    non non c'est de toi et moi que je parlais :D ('fin il me semble non ? :cool:)
    Froggy, 21 Décembre 2006
    #14
  15. Offline
    Ahava Revenant
    Oui ! bien qu'on se soit jamais parlé en vrai à l'école, si ? :oops:

    Tfacon reste 2 jours de cours pour moi, dont today exam :-(
    Ahava, 21 Décembre 2006
    #15
  16. Offline
    Froggy fake geek
    non je pense pas qu'on se soit jamais vu à l'école ... mais c'est normal ça fais un bout de temps que je n'ai plus été (doit d'ailleurs aller chercher l'horaire des exams... :-D) vu que je double ma première et que les cours du premier semestre en première sont pas vraiment ... "difficile" :D

    j'préfère me préparé déjà pour le second semestre (projets et autres) chez moi plutot que d'aller à des cours que j'ai déjà réussi sans avoir 12 l'année passée ... :roll:
    Froggy, 21 Décembre 2006
    #16
  17. Offline
    Angy \o/
    J'ai un autre problème...

    Pour autre chose, j'essaie de mettre mes sous routines dans un autre fichier, et grâce au link, de lier mon programme principal au fichier de sous routines. Mais je vois vraiment pas comment on fait pour les rendre externe et tout :-(
    Angy, 21 Décembre 2006
    #17
  18. Offline
    Froggy fake geek
    en asm de base me semble que tu dois mettre GLOBAL devant les routines et ensuite indiquer dans le souce qui les appelles qu'elles sont externe en mettant EXTERN nomdelaroutine... Maintenant c'est p-e autre chose en turbo ... :/
    Froggy, 21 Décembre 2006
    #18
  19. Offline
    Angy \o/
    Arf! je mettais EXTRN dans celui de routine moi :[]

    Pour Global, tu sais me donner un exemple ou le mettre exactement?
    Angy, 21 Décembre 2006
    #19
  20. Offline
    Froggy fake geek
    rien dis ... voir post plus loin ... saleté de bouton éditer :[]
    Froggy, 21 Décembre 2006
    #20
Statut de la discussion:
Fermée.