Assembleur
Jean
-
Yonnel.BALEZ Messages postés 7 Statut Membre -
Yonnel.BALEZ Messages postés 7 Statut Membre -
Bonjour,
Je suis étudiant et en ce moment j'ai un petit travail à faire (en assembleur). Je m'explique.
Je dois convertir un nombre en chaîne de caractère, si quelqu'un peut m'aider et me mettre sur la voie cela serait fort sympathique.
Merci
Je suis étudiant et en ce moment j'ai un petit travail à faire (en assembleur). Je m'explique.
Je dois convertir un nombre en chaîne de caractère, si quelqu'un peut m'aider et me mettre sur la voie cela serait fort sympathique.
Merci
A voir également:
- Assembleur
- Logiciel assembleur - Télécharger - Édition & Programmation
- Assembleur pdf - Guide
- Assembleur - Forum Programmation
- Assembleur pc gamer ✓ - Forum Études / Formation High-Tech
- Problème assembleur - Forum Assembleur
1 réponse
J'ai réalisé il y a quelques années ce traitement en fortran.
Il te permettra de voir le principe, même si tu ne connaît pas ce langage car je programme toujours proche de l'assembleur.
Le C en début de ligne signifie que le reste de la ligne est un commentaire
L'appel de cette procédure en assembleur MASM serait:
invoke kcnl,addr kle, addr kcr, addr chn, addr pan, addr chl, addr pal
; EAX contient le compte rendu en sortie qui s'il est négatif indique une erreur par exemple un manque de place dans la chaîne de sortie
Les pav , pan, pal sont des tableaux de deux word: le premier word contient l'abscisse de début de zone (1 en général) et le second word contient la longueur de la zone.
En fortran on commence par déclarer une variable puis avec un data on l'initialise, alors qu"n assembleur on fait l'opération sur la même ligne.
Character = byte
toutes les autres variables sont des word (intéger*2)
La procédure kudp décompose le pavé sur deux word le premier contient l'abscisse, le second contient la longueur de la zone.
La procédure kucp fait l'inverse avec deux valeur elle reconstitue le tableau de 2 word.
Un goto(100,200,300) i si i=1 va en 100 si =2 va en 200 etc...
la procédure kmzz concatenne deux chaines ce qui permet de fabriquer bout par bout le texte à partir du nombre
Les procédure ibl et ibs (écrites en assembleur) permettent respectivement de récupérer un octet dans une zone ou d'envoyer un octet dans une zone.
la procédure irde restitue le reste de la division entière et le quotient zt iqde obtient le quotient est le reste. C'est en fait le meême programme en assembleur avec deux entrées.
La procédure kcba converti une zone contenant un chiffre ou un nombre en binaire en une zone contenant l'ASCII et kcab fait le contraire.
La procédure kmoz correspond à un mov d'une zone vers une autre avec cadrage et à droite ou à gauche et remplissage avec un caractère donné dans la partie non utilisée.
Si tu veux plus de précisions n'hésite pas.
$pagesize:65
$title:' ----- KCNL.FOR -----'
$nodebug
c -----------------------------------------------------------------
c-> sous prog. fonction d'un nombre en lettres. KCNL.FOR
c-> Version 2 du 18/3/97
c -----------------------------------------------------------------
integer*2 function kcnl ( kle , kcr , chn , pan , chl , pal )
implicit integer*2(a-z)
dimension pav(2),pat(2),iuta(20),idta(7),imta(7),lnl(6)
character*50 luta(2),ldta,lmta(2)
equivalence (lnl(1),k),(lnl(4),j)
data iuta/1,3,7,12,18,22,25,29,33,37,40,44,49,55,63,69,74,82,
_90,98/,idta/1,6,12,20,29,37,49/,imta/1,6,13,20,34,53,73/
data luta/'undeuxtroisquatrecinqsixsepthuitneufdixonzedouzetr',
_ 'eizequatorzequinzeseizedix-septdix-huitdix-neuf '/
data ldta/'vingttrentequarantecinquantesoixantequatre-vingt '/
data lmta/'millemillionmillardmille-milliardmillion de millia',
_ 'rdmilliard de milliard '/
if(kudp(-1,cr,chn,pan,an,ln).lt.0) goto 990
c ->analyse du pav‚ de la zone source.
cr=-3
c ->la zone … convertir doit contenir 1 … 21 chiffres
if((ln.le.0).or.(ln.gt.21)) goto 990
if(kudp(-4,cr,chl,pal,al,ll).lt.0) goto 990
c ->analyse du pav‚ de la zone destination.
pv=cr
if(kucp(-6,cr,1,0,pat).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
i=ln+1
fp=0
ik=1
200 i=i-1
c call kvie('KCNL en 200 i$',0,i,-2)
if(i.le.0) goto 500
r=irde(i,3,q)
c call kvie('KCNL en 200 an$',0,an,-2)
c call kvie('KCNL en 200 ln$',0,ln,-2)
ix=ibl(chn,an+ln-i)-47
if(ix.eq.-15) goto 200
c call kvie('KCNL en 200 ix$',0,ix,-2)
cr=-8
c ->la zone … convertir contient des caractŠres non chiffres ou espace.
if((ix.lt.1).or.(ix.gt.10)) goto 990
c call kvie('KCNL en 200 r$',0,r,-2)
goto(210,270,230) r+1
210 goto(200,220,215) ix
215 k=ix
j=1
goto 300
220 cr=-9
c ->longueur insuffisante pour la zone destination.
c call kvie('KCNL en 220 r$',0,r,-2)
if(pat(2)+4.gt.ll) goto 990
if(kmzz(-10,cr,1,' ',chl,pat,'cent',-4).lt.0) goto 990
c ->concat‚nation de 'cent'.
goto 200
230 if(ix.gt.2) goto 250
if(kucp(-20,cr,an+ln-i,2,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 230 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 230 pav(2)$',0,pav(2),-2)
if(kcab(-22,cr,chn,pav,k,-2).lt.0) goto 990
c ->conversion en binaire des 2 chiffres … droite d'une triade.
if(k.eq.0) goto 240
k=k+1
j=2
goto 300
240 i=i-1
goto 400
250 k=ix
ik=ix
c call kvie('KCNL en 250 k$',0,k,-2)
if(k.ge.8) k=k-1
if(k.eq.9) k=8
260 il=idta(k-1)-idta(k-2)
cr=-30
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-31,cr,idta(k-2),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 260 pat(1)$',0,pat(1),-2)
c call kvie('KCNL en 260 pat(2)$',0,pat(2),-2)
c call kvie('KCNL en 260 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 260 pav(2)$',0,pav(2),-2)
if(kmzz(-33,cr,1,' ',chl,pat,ldta,pav).lt.0) goto 990
c ->concat‚nation des dizaines.
fp=1
goto 200
270 k=ix
if((ik.eq.8).or.(ik.eq.10)) goto 272
if(k.ne.2) goto 275
if((ik.lt.3).or.(ik.gt.8)) goto 275
goto 274
272 k=k+10
if(ik.eq.10) goto 275
274 cr=-43
c ->longueur insuffisante pour la zone destination.
if(pat(2)+2.gt.ll) goto 990
if(kmzz(-44,cr,1,' ',chl,pat,'et',-2).lt.0) goto 990
c ->concat‚nation de "et".
275 if(k.eq.1) goto 400
if(k.ne.2) goto 290
if((i.eq.4).or.(i.eq.13)) goto 400
290 j=3
c call kvie('KCNL en 275 j$',0,j,-2)
300 il=iuta(k)-iuta(k-1)
c call kvie('KCNL en 300 j$',0,j,-2)
cr=-54
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-55,cr,iuta(k-1),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
if(kmzz(-57,cr,1,' ',chl,pat,luta,pav).lt.0) goto 990
c ->concat‚nation des unit‚s de 1 … 19.
fp=1
goto (220,240,400) j
400 if(q.eq.0) goto 200
il=imta(q+1)-imta(q)
cr=-67
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-68,cr,imta(q),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
if(kmzz(-70,cr,1,' ',chl,pat,lmta,pav).lt.0) goto 990
c ->concat‚nation des milles (de mille … un milliard de milliards).
fp=1
420 if(kucp(-80,cr,an+ln-i+1,3,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 420 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 420 pav(2)$',0,pav(2),-2)
if(kcab(-82,cr,chn,pav,k,-2).lt.0) goto 990
c ->conversion d'une triade.
if(k.ne.0) goto 200
i=i-3
if(i.le.1) goto 200
goto 420
500 if(pv.ne.0) goto 520
if(kmoz(-90,cr,-1,0,pat,-4,pal,-4).lt.0) goto 990
c ->transfert si pav‚ r‚el.
520 cr=pat(2)
c call kvie('KCNL en 520 cr$',0,cr,-2)
c call kvia('KCNL en 520 chl$',0,chl,-100)
990 kcnl=kufe(kle,kcr,cr)
return
end
$nolist
Il te permettra de voir le principe, même si tu ne connaît pas ce langage car je programme toujours proche de l'assembleur.
Le C en début de ligne signifie que le reste de la ligne est un commentaire
L'appel de cette procédure en assembleur MASM serait:
invoke kcnl,addr kle, addr kcr, addr chn, addr pan, addr chl, addr pal
; EAX contient le compte rendu en sortie qui s'il est négatif indique une erreur par exemple un manque de place dans la chaîne de sortie
Les pav , pan, pal sont des tableaux de deux word: le premier word contient l'abscisse de début de zone (1 en général) et le second word contient la longueur de la zone.
En fortran on commence par déclarer une variable puis avec un data on l'initialise, alors qu"n assembleur on fait l'opération sur la même ligne.
Character = byte
toutes les autres variables sont des word (intéger*2)
La procédure kudp décompose le pavé sur deux word le premier contient l'abscisse, le second contient la longueur de la zone.
La procédure kucp fait l'inverse avec deux valeur elle reconstitue le tableau de 2 word.
Un goto(100,200,300) i si i=1 va en 100 si =2 va en 200 etc...
la procédure kmzz concatenne deux chaines ce qui permet de fabriquer bout par bout le texte à partir du nombre
Les procédure ibl et ibs (écrites en assembleur) permettent respectivement de récupérer un octet dans une zone ou d'envoyer un octet dans une zone.
la procédure irde restitue le reste de la division entière et le quotient zt iqde obtient le quotient est le reste. C'est en fait le meême programme en assembleur avec deux entrées.
La procédure kcba converti une zone contenant un chiffre ou un nombre en binaire en une zone contenant l'ASCII et kcab fait le contraire.
La procédure kmoz correspond à un mov d'une zone vers une autre avec cadrage et à droite ou à gauche et remplissage avec un caractère donné dans la partie non utilisée.
Si tu veux plus de précisions n'hésite pas.
$pagesize:65
$title:' ----- KCNL.FOR -----'
$nodebug
c -----------------------------------------------------------------
c-> sous prog. fonction d'un nombre en lettres. KCNL.FOR
c-> Version 2 du 18/3/97
c -----------------------------------------------------------------
integer*2 function kcnl ( kle , kcr , chn , pan , chl , pal )
implicit integer*2(a-z)
dimension pav(2),pat(2),iuta(20),idta(7),imta(7),lnl(6)
character*50 luta(2),ldta,lmta(2)
equivalence (lnl(1),k),(lnl(4),j)
data iuta/1,3,7,12,18,22,25,29,33,37,40,44,49,55,63,69,74,82,
_90,98/,idta/1,6,12,20,29,37,49/,imta/1,6,13,20,34,53,73/
data luta/'undeuxtroisquatrecinqsixsepthuitneufdixonzedouzetr',
_ 'eizequatorzequinzeseizedix-septdix-huitdix-neuf '/
data ldta/'vingttrentequarantecinquantesoixantequatre-vingt '/
data lmta/'millemillionmillardmille-milliardmillion de millia',
_ 'rdmilliard de milliard '/
if(kudp(-1,cr,chn,pan,an,ln).lt.0) goto 990
c ->analyse du pav‚ de la zone source.
cr=-3
c ->la zone … convertir doit contenir 1 … 21 chiffres
if((ln.le.0).or.(ln.gt.21)) goto 990
if(kudp(-4,cr,chl,pal,al,ll).lt.0) goto 990
c ->analyse du pav‚ de la zone destination.
pv=cr
if(kucp(-6,cr,1,0,pat).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
i=ln+1
fp=0
ik=1
200 i=i-1
c call kvie('KCNL en 200 i$',0,i,-2)
if(i.le.0) goto 500
r=irde(i,3,q)
c call kvie('KCNL en 200 an$',0,an,-2)
c call kvie('KCNL en 200 ln$',0,ln,-2)
ix=ibl(chn,an+ln-i)-47
if(ix.eq.-15) goto 200
c call kvie('KCNL en 200 ix$',0,ix,-2)
cr=-8
c ->la zone … convertir contient des caractŠres non chiffres ou espace.
if((ix.lt.1).or.(ix.gt.10)) goto 990
c call kvie('KCNL en 200 r$',0,r,-2)
goto(210,270,230) r+1
210 goto(200,220,215) ix
215 k=ix
j=1
goto 300
220 cr=-9
c ->longueur insuffisante pour la zone destination.
c call kvie('KCNL en 220 r$',0,r,-2)
if(pat(2)+4.gt.ll) goto 990
if(kmzz(-10,cr,1,' ',chl,pat,'cent',-4).lt.0) goto 990
c ->concat‚nation de 'cent'.
goto 200
230 if(ix.gt.2) goto 250
if(kucp(-20,cr,an+ln-i,2,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 230 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 230 pav(2)$',0,pav(2),-2)
if(kcab(-22,cr,chn,pav,k,-2).lt.0) goto 990
c ->conversion en binaire des 2 chiffres … droite d'une triade.
if(k.eq.0) goto 240
k=k+1
j=2
goto 300
240 i=i-1
goto 400
250 k=ix
ik=ix
c call kvie('KCNL en 250 k$',0,k,-2)
if(k.ge.8) k=k-1
if(k.eq.9) k=8
260 il=idta(k-1)-idta(k-2)
cr=-30
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-31,cr,idta(k-2),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 260 pat(1)$',0,pat(1),-2)
c call kvie('KCNL en 260 pat(2)$',0,pat(2),-2)
c call kvie('KCNL en 260 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 260 pav(2)$',0,pav(2),-2)
if(kmzz(-33,cr,1,' ',chl,pat,ldta,pav).lt.0) goto 990
c ->concat‚nation des dizaines.
fp=1
goto 200
270 k=ix
if((ik.eq.8).or.(ik.eq.10)) goto 272
if(k.ne.2) goto 275
if((ik.lt.3).or.(ik.gt.8)) goto 275
goto 274
272 k=k+10
if(ik.eq.10) goto 275
274 cr=-43
c ->longueur insuffisante pour la zone destination.
if(pat(2)+2.gt.ll) goto 990
if(kmzz(-44,cr,1,' ',chl,pat,'et',-2).lt.0) goto 990
c ->concat‚nation de "et".
275 if(k.eq.1) goto 400
if(k.ne.2) goto 290
if((i.eq.4).or.(i.eq.13)) goto 400
290 j=3
c call kvie('KCNL en 275 j$',0,j,-2)
300 il=iuta(k)-iuta(k-1)
c call kvie('KCNL en 300 j$',0,j,-2)
cr=-54
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-55,cr,iuta(k-1),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
if(kmzz(-57,cr,1,' ',chl,pat,luta,pav).lt.0) goto 990
c ->concat‚nation des unit‚s de 1 … 19.
fp=1
goto (220,240,400) j
400 if(q.eq.0) goto 200
il=imta(q+1)-imta(q)
cr=-67
c ->longueur insuffisante pour la zone destination.
if(pat(2)+il.gt.ll) goto 990
if(kucp(-68,cr,imta(q),il,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
if(kmzz(-70,cr,1,' ',chl,pat,lmta,pav).lt.0) goto 990
c ->concat‚nation des milles (de mille … un milliard de milliards).
fp=1
420 if(kucp(-80,cr,an+ln-i+1,3,pav).lt.0) goto 990
c ->pr‚paration d'un pav‚ de travail.
c call kvie('KCNL en 420 pav(1)$',0,pav(1),-2)
c call kvie('KCNL en 420 pav(2)$',0,pav(2),-2)
if(kcab(-82,cr,chn,pav,k,-2).lt.0) goto 990
c ->conversion d'une triade.
if(k.ne.0) goto 200
i=i-3
if(i.le.1) goto 200
goto 420
500 if(pv.ne.0) goto 520
if(kmoz(-90,cr,-1,0,pat,-4,pal,-4).lt.0) goto 990
c ->transfert si pav‚ r‚el.
520 cr=pat(2)
c call kvie('KCNL en 520 cr$',0,cr,-2)
c call kvia('KCNL en 520 chl$',0,chl,-100)
990 kcnl=kufe(kle,kcr,cr)
return
end
$nolist