2013-04-10 2 views
0

Je ne vois pas ce que je fais mal. J'ai besoin de calculatrice binaire quel format d'entrée est quelque chose comme "00000001b + 00000010b ... la sortie doit être en binaire aussi ... l'opérateur peut être +, -, *,/assemblage lecture nombre binaire en décimal 8086 (MSNA)

Je veux lire le premier numéro et le convertir en décimal ... mon code est quelque chose comme ça

%include "asm_io.inc" 

segment .text 
    global _asm_main 
_asm_main: 
    enter 0,0 
    pusha 


    call read_int 
    cmp al,'b' 
    je vypis 

vypis: 
    call print_int 


koniec: 
    popa     ; terminate program 
    mov EAX, 0 
    leave 
    ret 

le programme fonctionne très bien lorsque l'entrée commence par le numéro un par exemple (10101010b), mais lorsque l'entrée commence par zéro, il DonT fonctionne correctement ...

ma question qu'est-ce que je fais mal ou comment puis-je le faire mieux?


print_int et read_int sont des fonctions qui nous déjà donné, ils travaillent à 100% ... autres fonctions que je peux utiliser sont read_char, print_char et print_string ...

read_int: 
    enter 4,0 
    pusha 
    pushf 

    lea eax, [ebp-4] 
    push eax 
    push dword int_format 
    call _scanf 
    pop ecx 
    pop ecx 

    popf 
    popa 
    mov eax, [ebp-4] 
    leave 
    ret 

print_int: 
    enter 0,0 
    pusha 
    pushf 

    push eax 
    push dword int_format 
    call _printf 
    pop ecx 
    pop ecx 

    popf 
    popa 
    leave 
    ret 

Répondre

0

Il me semble que read_int renvoie simplement une valeur entière (en eax) qui a été lue par scanf. Je ne suis pas sûr pourquoi vous attendez que l'octet le moins significatif de cet entier soit 'b' (?).

Bien que je ne sais pas quelle implémentation scanf vous utilisez, je n'en ai vu aucune qui lit directement les nombres binaires. La mise en œuvre de cette fonctionnalité est assez simple.
Voici quelques exemples de code en C montrant le principe:

char bin[32]; 
unsigned int i, value; 

scanf("%[01b]", bin); // Stop reading if anything but these characters 
         // are entered. 

value = 0; 
for (i = 0; i < strlen(bin); i++) { 
    if (bin[i] == 'b') 
     break; 
    value = (value << 1) + bin[i] - '0'; 
} 
// This last check is optional depending on the behavior you want. It sets 
// the value to zero if no ending 'b' was found in the input string. 
if (i == strlen(bin)) { 
    value = 0; 
} 
+0

vous a aidé beaucoup ... merci beaucoup: P –