2013-04-10 3 views
0

Я не вижу, что я делаю неправильно. Мне нужен двоичный калькулятор, формат ввода которого «что-то вроде« 00000001b + 00000010b ... выход должен быть в двоичном тоже ... оператор может быть +, -, *, /.сборка чтение двоичное число до десятичного числа 8086 (NASM)

Я хочу читать первое число и преобразовать его в десятичную ... мой код что-то вроде этого

%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 

программа работает нормально, когда вход запуска с номером один, например (10101010b), но когда вход начать с нуля это DonT работайте правильно ...

мой вопрос, что я делаю неправильно или как я могу сделать это лучше?


print_int и read_int являются функциями, которые уже даны нам, они работают на 100% ... другие функции, которые я могу использовать это read_char, print_char и 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 

ответ

0

Мне кажется, что read_int просто возвращает целочисленное значение (в eax), которое было прочитано scanf. Я не уверен, почему вы ожидаете, что младший значащий байт этого целого будет 'b' (?).

Хотя я не знаю, какую из scanf реализации вы используете, я не видел ни одного, который будет напрямую читать двоичные числа. Однако реализовать эту функциональность довольно легко.
Вот некоторые примеры кода в C показывает принцип:

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

вы помогли много ... спасибо очень много: P –

Смежные вопросы