Assembleur conversion

tux23 -  
kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. Yonnel.BALEZ Messages postés 7 Statut Membre 2
     
    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
  2. Bengenie
     
    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
    1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
       
      Salut,

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