Операции с большими числами!

Тема в разделе "WASM.BEGINNERS", создана пользователем AlexCorvis, 10 фев 2007.

  1. AlexCorvis

    AlexCorvis New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2007
    Сообщения:
    3
    Столкнулся с проблемой...
    нужно ввести в программу числа, которые могут достигать размера в 8 байт (64-бит соответственно), а потом производить с ним основные математические операции.
    в ассемблере пару дней... накатал кое-что
    процедура ввода цифр
    помещаю цифры в массив buf
    если первым символом при вводе был знак минуса я это отмечаю...
    хотелось бы чтобы программа могла работать на 8086!
    не могу разобраться как мне из последовательности цифр в моем буфере buf
    восстановить скажем двоичное число в 64 разряда и разместить его в переменной


    Код (Text):
    1. SCAN_NUM        PROC    NEAR
    2.         PUSH    DX        ;тут сохраняю текущие значения регистров
    3.         PUSH    AX
    4.         PUSH    SI
    5.         MOV     SI, 0
    6.         MOV     CX, 0
    7.  
    8.         MOV     AH, 00h
    9.         INT     16h
    10.         ; проверяем не минус ли у нас первый символ
    11.         CMP     AL, '-'    ;сравниваем содержимое AL и
    12.         JE      set_minus ;если равно идем к set_minus
    13.        
    14.         jmp nx_dg         ; прыгаем к nx_dg это чтобы пропустить лишний ввод
    15.  
    16. set_minus:
    17.         ;тут пока пропускаю... нужно будет сохранить в какую-нибудь переменную единичку скажем
    18.         JMP      next_digit  
    19.        
    20. next_digit:
    21.         MOV     AH, 00h    ;считываем символ
    22.         INT     16h           ;и по прерыванию получаем его код в AL
    23.  
    24. nx_dg:            
    25.                ; тут хочу проверить не вылезает ли число за пределы 8-ми байт...
    26.                ;только для этого нужно его получить из отдельных цифр
    27.                ;пока ограничился просто вводом 8-ми цифр
    28.                ;      cmp     SI, 8d       ;проверяем нет ли еще 8-ми цифр
    29.                ;      je      stop_input   ;если  уже 8 завершаем процедуру...
    30.  
    31.  
    32.  
    33.         CMP     AL, 0Dh     ;проверяем не Enter ли это
    34.         je      stop_input   ;Если Enter, то переходим к stop_input
    35.        
    36.         CMP     AL, 8         ;проверяем не BackSpaсe ли у нас этот символ
    37.         JE     backspace     ;если
    38.                  
    39.         cmp     AL, '0'        ;сравниваем введенный символ и символ '0'
    40.         jl      next_digit      ;если у нас прочитанный символ ниже '0' в таблице кодов, то возвращаемся к next_digit
    41.         cmp     AL, '9'        ;сравниваем введенный символ и символ '9'
    42.         jg      next_digit     ;если у нас прочитанный символ выше '9' в таблице кодов, то возвращаемся к next_digit
    43.        
    44.        ;таким образом я исключаю попадание символов отличных от цифр от 0, до 9
    45.  
    46.         MOV     buf[SI], AL ;теперь я записываю в элемент массива buf с номером SI число, которое ввел пользователь
    47.         inc     SI               ;увеличиваю SI на единицу
    48.          
    49.         MOV     AH, 0Eh     ;вывожу число на экран
    50.         INT     10h            ;по прерыванию
    51.        
    52.         jmp next_digit        ;перехожу к next_digit для ввода нового символа
    53.  
    54. stop_input:
    55.         POP     SI           ;тут восстанавливаю значения регистров
    56.         POP     AX
    57.         POP     DX
    58.         RET
    59.        
    60. backspace:
    61.         ;тут пока не знаю как сделать... нужно удалять последний символ
    62.         JMP     next_digit   ;перехожу к next_digit для ввода нового символа
    63.  
    64. SCAN_NUM        ENDP
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Просто совет:
    лучше воспользоваться стандартной функцией ввода строки (которая обработает и бакспейс, и остальное) а уже потом проверить, правильное ли это число, и если нет - сказать об этом и попросить ввести число еще раз.