Assembleur conversion

Fermé
tux23 - 27 déc. 2005 à 13:39
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 29 mai 2008 à 19:31
bonjour
j'arrive pa a réaliser en assembleur un programme qui fait la conversion d'un nombre binaire en chaine ASCII
est ce que qqun peut m'aider???

2 réponses

Yonnel.BALEZ Messages postés 7 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 6 février 2006 2
27 janv. 2006 à 11:55
Voici une procédure en MASM qui est appelable de l'assembleur, mais aussi du PASCAL ou du FORTRAN ou de tout lngage de haut niveau qui utilise l'empilement des paramètre en STDCALL.
;-------------------------------------------------------------
;-> Procédure de conversion d'un nombre entier en zone ascii
;-> version 4.1 du 15/5/2004
;-> procedure KCNA(kle,kcr,chs,pas,chd,pad)
page 80,110
.386
.model flat,stdcall
;include debog.inc
LUDP proto
KNOP proto :dword,:dword,:dword,:dword,:dword,:dword,:dword,:dword
KNEG proto :dword,:dword,:dword,:dword,:dword,:dword
;-------------------------------------------------------------
pile struct ; variables de travail internes à la procédure
as word ? ; abscisse source
ls word ? ; longueur source
ad word ? ; abscisse destination
ld word ? ; longueur destination
is word ? ; signe des opérandes(0 si + et 1 si -)
pr word ? ; primitive de knop
m1 word ? ; opérande 1 de KNOP
m2 word ? ; opérande 1 de KNOP
m3 word ? ; opérande 1 de KNOP
af word ? ; ascisse fin de zone ascii à conserver
lf word ? ; longueur de la zone ascii à conserver
kl word ? ; limite d'erreur dans la procédure
ay word ? ; abscisse de fin de la zone source, puis courante
ly word ? ; longueur de la zone source puis courante
cr word ? ; compte rendu interne à la procédure
nf word ? ; contient soit le signe - (45), soit le zéro (48)
nn word ? ; nombre de zéros de tête après conversion
pile ends
;-------------------------------------------------------------
.code
KCNA proc uses ebx ecx edx esi edi\
kle:ptr word,kcr:ptr word,chs:ptr byte,pas:ptr word,
chd:ptr byte,pad:ptr word
local pil:pile
;------------------------------------------------------
pushf
;-----------------------------------------------------------
mov ah,-1 ;>>cr compte rendu interne
;->erreur dans le décompactage de la zone source
mov ecx,chs ;adresse de la chaine source
mov esi,pas ;adresse du pavé zone source
call ludp ;décompactage du pavé
test ax,ax ;test compte rendu en sortie
jl e990 ;si erreur dans ludp
mov word ptr pil.as,cx ;abscisse source
mov word ptr pil.ls,si ;longueur source
mov di,si ;conservé dans di
;-----------------------------------------------------------
mov ah,-3 ;>>cr compte rendu interne
;->erreur dans le décompactage de la zone destination
mov ecx,chd ;adresse de la chaine destination
mov esi,pad ;adresse du pavé zone destination
call ludp ;décompactage du pavé
test ax,ax ;test compte rendu en sortie
jl e990 ;si erreur dans ludp
mov word ptr pil.ad,cx ;abscisse destination
mov word ptr pil.ld,si ;longueur destination
;-----------------------------------------------------------
mov word ptr pil.m2,10 ;m2=10
mov word ptr pil.m3,0 ;m3=0
add cx,si ;af=ad+ld-1 si contenait
dec cx ; l'abscisse de début et cx la
mov word ptr pil.af,cx ;longueur de la zone ascii
mov word ptr pil.lf,si ;destination
;-----------------------------------------------------------
test di,di ;contient ls longueur source
jg short e100 ;vérif si elle est > 0
mov word ptr pil.m2,0 ;sinon m2 (base de calcul =0)
mov word ptr pil.is,0 ; et is=0 (signe +)
jmp e300
eee990:jmp short ee990
;-----------------------------------------------------------
e100: mov ax,word ptr pil.as ;ax=as
add ax,word ptr pil.ls
dec ax ;ax=as+ls-1 abscisse fin du source
cwde
mov ecx,chs ;ecx=@chs zone source
mov al,[eax+ecx-1] ;al=dernier octet de la zone source
shr al,7 ;le bit 0 contient le signe
mov byte ptr pil.is,al ;le signe est placé dans is
;printtext "signe e100"
jmp @F
jmp e300
ee990: jmp e990
;-----------------------------------------------------------
@@: test al,al ;vérif si le signe est négatif
je short e300 ;si positif aller en 300
mov ah,-5 ;cr=-5
;la longueur de la zone destination est insuffisante
test si,si ;si contient la longueur zone destin.
jle ee990
;-----------------------------------------------------------
mov word ptr pil.kl,-6 ;>>cr compte rendu interne
;->passage du nombre entier binaire en négatif
invoke kneg,addr pil.kl,addr pil.cr,chs,pas,chs,pas
mov bx,ax
shl ax,8 ;ah= le compte rendu
test bx,bx ;test de CR
jl ee990 ;si erreur
;-----------------------------------------------------------
e300: mov word ptr pil.m1,0 ;m1=0
mov si,word ptr pil.as ;ay=as+ls-1 abscisse de fin de zone
movzx ecx,word ptr pil.ls ; source
add si,cx ;si contient l'abscisse courante
dec si ;et ecx contient la longueur courante
;printtext "e300 ay ly"
;printhex esi
;printhex ecx
mov ax,word ptr pil.m2 ;vérif. si m2 est nul et dans
test ax,ax ;dans ce cas on ne fait pas de
je e500 ;calcul
mov word ptr pil.pr,7 ;Primitive de knop 7=> division
mov word ptr pil.kl,-13 ;>>cr compte rendu interne
;->KNOP erreur dans le calcul des divisions successives
;-----------------------------------------------------
e400: mov word ptr pil.ay,si ;abscisse courante mise dans ay
invoke knop,addr pil.kl,addr pil.cr,addr pil.pr,chs,addr pil.ay,
addr pil.m1,addr pil.m2,addr pil.m3
mov bx,ax
shl ax,8 ;ah= le compte rendu
test bx,bx ;test de CR
jl e990 ;si erreur
dec si ;ay=ay-1
loop e400 ;cx=cx-1 et sortie si cx=0
;-----------------------------------------------------------
e500: mov ax,word ptr pil.m1 ;m1 contient le chiffre cherché
add eax,48 ;pour le transformer en ASCII
movzx ebx,word ptr pil.af ;emplacement du caractère
mov ecx,chd ;@chd chaine destination
mov byte ptr [ebx+ecx-1],al;envoyé dans son emplacement
mov ax,word ptr pil.af
dec ax ;af=af-1
mov word ptr pil.af,ax
;---------------------------------------------------
mov ax,word ptr pil.lf ;traitement d'un chiffre trouvé
dec ax ;lf=lf-1
mov word ptr pil.lf,ax
test ax,ax ;if(ld.lt.0) goto 600
jg e300
;jmp e800
;-----------------------------------------------------------
e600: mov ah,-16 ;
;->la zone destination a une longueur insuffisante
mov bx,word ptr pil.m1 ;if(m1.ne.0) goto 990
test bx,bx
jne e990
mov cx,word ptr pil.lf ;cx=longueur zone destination
mov word ptr pil.nn,0 ;nn=0
mov word ptr pil.nf,48 ;nf=48 soit '0'
;-----------------------------------------------------------
e700: mov ebx,chd ;@chd
movzx eax,word ptr pil.ad ;abscisse destination
mov al,byte ptr [ebx+eax-1] ;octet courant
cmp al,48 ;test si c'est un zéro
jne e720
;---------------------------------------------------
inc word ptr pil.nn ;nn=nn+1 (nombre de zéros de tête
mov ebx,chd ;ebx=@chd
movzx eax,word ptr pil.ad ;
mov byte ptr [ebx+eax-1],32 ;remplacer zéro par espace
inc word ptr pil.ad ;ad=ad+1
loop e700
jmp e730
;---------------------------------------------------
e720: mov al,byte ptr pil.is ;test du signe
test al,al
jz e800
mov word ptr pil.cr,-16 ;>>cr Compte rendu interne
;->Zone destination trop petite:manque de place pour le signe -
mov ah,byte ptr pil.cr ;ah contient le n° d'erreur
mov bx,word ptr pil.nn ;nombre de zéros de tête
test bx,bx ;il doit rester au moins un caractère
jle e990 ;..pour y placer le moins
mov word ptr pil.nf,45 ;nf=45 soit '-'
;-------------------------------------------------------------------
e730:
mov ecx,chd ;ebx=@chd
movzx eax,word ptr pil.ad ;
mov bx,word ptr pil.nf
mov byte ptr [ecx+eax-2],bl ;placer zéro ou - dans la zone dest.
;---------------------------------------------------
e800: mov ax,word ptr pil.is ;si ok le compte rendu = le signe
jmp finok
;-------------------------------------------------------------------
e990:
mov al,ah ;n° d'erreur interne mis dans al
cbw ;puis étendu à ax
mov ebx,kle ;ebx=@kle
mov bx,word ptr [ebx] ;ebx=valeur de kle (limite d'erreur)
add ax,bx ;ax=ax+bx
inc ax ;le n° d'erreur = kle+cr+1
finok: mov ebx,kcr ;ebx=@kcr
mov word ptr [ebx],ax ; le n° d'erreur final mis dans KCR
;-----------------------------------------------------------------
popf ;restitution des indicateurs en sortie
ret
;----------------------------------------------------------------
KCNA endp
end
0
Salut
j'ai un programme en asssembleur qui fait la conversion d'un nombre decimal en binaire et vice versa. chaque fois je compile il a plein de bugs. est-ce qu'il ya quelqu'un qui peut m'aider?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 mai 2008 à 19:31
Salut,

Avec quel logiciel? Si c'est pas nasm je pourrai pas t'aider.
0