2017-10-19 36 views
0

Je suis un begginer dans emu8086 et j'ai un problème avec ce code que je ne semble pas être en mesure de réparer. J'ai besoin de convertir de décimal en binaire et parfois il le fait bien, par exemple, quand j'utilise des nombres comme 4,8,15,16,255 tout fonctionne bien. Mais si j'utilise par exemple, 2,9,17,254 il ne montre pas le bon nombre. J'ai vraiment besoin d'aide avec ça.Convertir de décimal en binaire en utilisant des tableaux

.model small 

.data 

exp db 8 dup (?) 

num dw 09 

var dw 2 

.code 

start: 
    mov ax,@data 
    mov ds,ax 

    mov di,0 
    mov ax,num ;I put my number in ax 

    Binary: ;Here I make the conversion from decimal to binary 
     div var 
     mov exp[di],dl 
     inc di 
     cmp al,0 ;If my number is equal to 0 it breaks the cicle and shows the array in the next function 
     ja Binary 


    dec di  
    mov cx,di   
    Show: ;Here I show the array backwards so we can see the real binary number 
     mov bl,exp[di] 
     add bl,30h 

     mov dl,bl 
     sub bl,30h 

     mov ah,2 
     int 21h  
     dec di 
    loop Show 

int 21h  
end start: 

fin

+0

N'utilisez pas 'div' pour diviser par 2! Il est environ 30x plus lent qu'un quart de travail, et il ne peut pas prendre un opérande immédiat. https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-my-hand-written-assembly-for-testing-the-collat/40355466#40355466 –

+0

Merci Peter. –

Répondre

1

div var divise dx:ax par var. Vous devez mettre à zéro dx avant l'instruction de division.

+0

Il y a un Q & A canonique pour l'échec de zéro ou de signer prolonger dans [e] dx: [e] ax avant div ou idiv qui fait une assez bonne cible de dup. (Il y a un lien dans le [wiki tag x86] (https://stackoverflow.com/tags/x86/info), il suffit de chercher 'div'). –