cs_andromida
Messages postés14Date d'inscriptionvendredi 15 octobre 2010StatutMembreDernière intervention 9 novembre 2010
-
19 oct. 2010 à 19:18
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 2014
-
29 oct. 2010 à 01:03
S.V.P aidez moi a écrire un code tasm qui fait:
*saisir 20 entiers comme etant des ages dans un tableau
*determiner en un seul parcours le maximum et le minimum
*calculer la moyenne de ces 20 valeurs
*afficher le max , le min et la moyenne comme ça:
le max est:
le min est:
la moyenne est:
cs_andromida
Messages postés14Date d'inscriptionvendredi 15 octobre 2010StatutMembreDernière intervention 9 novembre 20101 22 oct. 2010 à 19:46
je connait déjà printf mais c'est pas permis d'utilisé des fonctions prédéfinies il faut manipulé tout avec les instructions de bas niveau tel que mov, add, mul
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 20 oct. 2010 à 09:00
Tasm ou masm se ressemble.
La grosse différence est que les exemples de masm sont beaucoup plus étoffés.
En masm cela donnerais:
Utiliser inputbox
Utiliser une fonction de conversion atodw (ascii to dword)
utiliser les macros de masm
.if eax > dword ptr [tableau+index] (incrément 4)
.endif
- extraire la moyenne peut demander le FPU
FDIV
reconvertir dwtoa (dword to ascii)
Faire un affichage par messagebox.
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 20 oct. 2010 à 09:28
Peut être même pas besoin du FPU pour calculer la moyenne.
En mettant des indices de 1 a 20 pour les nombres
Moyenne=((NombreMin+ecart1) +(Nombremin+ecart2 )+..)/20
Moyenne = NombreMin + (Somme des écarts/20)
Ou
Moyenne = NombreMin + Ecart1/20 + Ecart2/20 + ...
Si les entiers rentre dans un dword,pas de risque de débordement de capacité en procédant comme ça.
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 20 oct. 2010 à 14:55
La lecture étant quelque peut pénible,je te conseille une chose.
Tasm accepte une compatiblité masm (même syntaxe).
Ci dessous,la solution en masm32,qui peut te faire avoir un zero a ton problème pour copie.
Elle marche,j'ai vérifié et en plus elle est lisible.
include \masm32\include\masm32rt.inc
.const
.data
serie dd 45h,0f12h,10h,7f23h,732h,0
minimum dd 0
maximum dd 0
moyenne dd 0
CPT dd 0
SommeReste dd 0
.code
start:
;------- minimum ------------
mov CPT,LENGTHOF serie
;chercher le plus petit
lea edx,serie
;prendre le premier comme référence
mov eax,[edx]
mov minimum,eax
.while(CPT)
mov eax,[edx]
.if eax < minimum
mov minimum,eax
.endif
add edx,4
dec CPT
.endw
;------- maximum -----------
mov CPT,LENGTHOF serie
;chercher le plus grand
lea edx,serie
;prendre le premier comme référence
mov eax,[edx]
mov maximum,eax
.while(CPT)
mov eax,[edx]
.if eax > maximum
mov maximum,eax
.endif
add edx,4
dec CPT
.endw
;--------- moyenne -----------
;appliquer moyenne = minimum + SommeEcart /20 + SommeRestes/20
mov eax,minimum
mov moyenne,eax
mov CPT,LENGTHOF serie
;chercher le plus grand
push edi
lea edi,serie
.while(CPT)
mov eax,[edi]
mov ecx,minimum
sub eax,ecx
mov ecx,LENGTHOF serie
mov edx,0
div ecx
add moyenne,eax
add SommeReste,edx
;-----------------
add edi,4
dec CPT
.endw
pop edi
;----- ajouter les restes -------
mov eax,SommeReste
mov ecx,LENGTHOF serie
mov edx,0
div ecx
add moyenne,eax
invoke ExitProcess,0
;------- proc içi ------------
end start
cs_andromida
Messages postés14Date d'inscriptionvendredi 15 octobre 2010StatutMembreDernière intervention 9 novembre 20101 20 oct. 2010 à 18:45
merci beaucoup "ToutEnMasm" c'est tès gentil mais j'ai déjà dit que je cherche le code en tasm et n'est pas en masm car il y a des instructions en masm que je ne comprends pas et vous savez je suis un débutant car c'est le premier code que j'ai essayé d'écrire et je serais tres reconnaissant de votre aide
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 21 oct. 2010 à 10:08
Voila,ça devrait degossir pas mal le problême
;\TASM\EXAMPLES\USRGUIDE\ASMWIN exemple window 16 bits
LOCALS
.MODEL LARGE, WINDOWS PASCAL
.286
extrn ExitProcess:PROC
.DATA
serie dw 45h,0f12h,10h,7f23h,732h,0
minimum dw 0
maximum dw 0
moyenne dw 0
CPT dw 0
SommeReste dw 0
.code
start:
push di
;------- minimum ------------
mov CPT,6;LENGTHOF serie
;chercher le plus petit
lea di,serie
;prendre le premier comme référence
mov ax,[di]
mov minimum,ax
Boucle_min:
mov ax,[di]
cmp ax,minimum
ja pas_min ;forward,plus loin @B back,arriere
mov minimum,ax
pas_min:
add di,2
dec CPT
jnz Boucle_min
;------- maximum -----------
mov CPT,6;LENGTHOF serie
;chercher le plus grand
lea di,serie
;prendre le premier comme référence
mov ax,[di]
mov maximum,ax
Boucle_max:
mov ax,[di]
cmp ax,maximum
jbe pas_max ;non signé
mov maximum,ax
pas_max:
add di,2 ;taille mot
dec CPT
jnz Boucle_max
;--------- moyenne -----------
;appliquer moyenne = minimum + SommeEcart /20 + SommeRestes/20
mov ax,minimum
mov moyenne,ax
mov CPT,6 ;LENGTHOF serie
;chercher le plus grand
lea di,serie
Boucle_moyenne:
mov ax,[di]
mov cx,minimum
sub ax,cx
mov cx,6;LENGTHOF serie
mov dx,0
div cx
add moyenne,ax
add SommeReste,dx
;-----------------
add di,4
dec CPT
jnz Boucle_moyenne
pop di
;----- ajouter les restes -------
mov ax,SommeReste
mov cx,6;LENGTHOF serie
mov dx,0
div cx
add moyenne,ax
call ExitProcess,0
;------- proc içi ------------
end start
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 21 oct. 2010 à 15:48
Pour finir une solution presque complete.
**Probleme pour avoir un tasm complet , voir mon site en bas de la page de lien,chercher TASM.
*** compiler
Make ou embrouille c'est la même chose
J'utilise un batch
@echo off
SET PATH=%PATH%;D:\tasm\bin
SET THEINCLUDE=D:\tasm\include
SET LIB=D:\tasm\lib
TASM /Zi moyenne.asm
REM TLINK /Twe /v /s moyenne, moyenne, moyenne,import.lib,moyenne
TLINK /Twe /v /s moyenne, moyenne,,\tasm\lib\import.lib,moyenne,
pause
le .def utilisé par tlink est simplement le .def de l'exemple \TASM\EXAMPLES\USRGUIDE\ASMWIN
Il a juste changé de nom
**** le code
il fait apparaitre une messagebox,reste a traduire l'hexa en ascii et a créer un groupe de ligne a envoyer a la messagebox.
La méthode de calcul de la moyenne supporte un nombre quelconque de chiffres.
;\TASM\EXAMPLES\USRGUIDE\ASMWIN exemple window 16 bits
title age
LOCALS
.MODEL LARGE, WINDOWS PASCAL
.286
include \tasm\include\windows.inc
;include windows.inc
extrn MESSAGEBOX:PROC
.stack 100h
.data
.DATA
aMessage db "CouCou$",0
Titre db "Titre$",0
serie dw 45h,0f12h,10h,7f23h,732h,0
minimum dw 0
maximum dw 0
moyenne dw 0
CPT dw 0
SommeReste dw 0
.code
start:
push di
;------- minimum ------------
mov CPT,6;LENGTHOF serie
;chercher le plus petit
mov ax,@data
mov ds,ax
mov di,offset serie
;prendre le premier comme référence
mov ax,[di]
mov minimum,ax
Boucle_min:
mov ax,[di]
cmp ax,minimum
ja pas_min ;forward,plus loin @B back,arriere
mov minimum,ax
pas_min:
add di,2
dec CPT
jnz Boucle_min
;------- maximum -----------
mov CPT,6;LENGTHOF serie
;chercher le plus grand
mov di,offset serie
;prendre le premier comme référence
mov ax,[di]
mov maximum,ax
Boucle_max:
mov ax,[di]
cmp ax,maximum
jbe pas_max ;non signé
mov maximum,ax
pas_max:
add di,2 ;taille mot
dec CPT
jnz Boucle_max
;--------- moyenne -----------
;appliquer moyenne = minimum + SommeEcart /20 + SommeRestes/20
mov ax,minimum
mov moyenne,ax
mov CPT,6 ;LENGTHOF serie
;chercher le plus grand
mov di,offset serie
Boucle_moyenne:
mov ax,[di]
mov cx,minimum
sub ax,cx
mov cx,6;LENGTHOF serie
mov dx,0
div cx
add moyenne,ax
add SommeReste,dx
;-----------------
add di,2
dec CPT
jnz Boucle_moyenne
pop di
;----- ajouter les restes -------
mov ax,SommeReste
mov cx,6;LENGTHOF serie
mov dx,0
div cx
add moyenne,ax
;affichage
call MessageBox PASCAL, NULL, DS, OFFSET aMessage, \
DS, OFFSET Titre, MB_OK
mov ah,4ch ;DOS: terminate program
mov al,0 ;return code will be 0
int 21h ;terminate the program
; call ExitProcess,0
;------- proc içi ------------
end start
cs_andromida
Messages postés14Date d'inscriptionvendredi 15 octobre 2010StatutMembreDernière intervention 9 novembre 20101 22 oct. 2010 à 15:14
merci pour votre aide
mais c'est tres compliqué pour moi: par exemple je connait pas ".MODEL LARGE"
je travaille seulement qu'avec "model small"
aussi je ne connait pas cette instuction ""include \tasm\include\windows.inc ""
en plus votre code ne contient pas la boucle de saisie des entiers dans un tableau qui est la partie la plus difficile pour moi car tasm n'accepte que des caractères et non pas des entiers et je sais qu'il ya un truc pour transformer les caracters en entiers mais je le sait pas
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 22 oct. 2010 à 16:33
Il ne faut pas se laisser impressioné par la syntaxe.
.MODEL LARGE est a usage unique du compilateur.
Seul le fabricant sait exactement quels modifications seront apportées a la compilation en choisissant ce model.
Il le faut pour windows 16,on le met,c'est tout.
INCLUDE veut dire inclure au source le fichier dont le chemin est \tasm\include\windows.inc.
On peut le voir avec notepad.
Après le code fourni ne fait pas tout,ce n'est pas moi qui vais être noté.
Le dumpbin de tasm permet de voir le contenu des librairies,il y a surement quelques fonctions utilisables pour finir le travail.
La conversion se fait d'un dword,word à l'ascii (texte).
Dans le genre il y a dwtoascii ,toascii ...