Столкнулся с проблемой... нужно ввести в программу числа, которые могут достигать размера в 8 байт (64-бит соответственно), а потом производить с ним основные математические операции. в ассемблере пару дней... накатал кое-что процедура ввода цифр помещаю цифры в массив buf если первым символом при вводе был знак минуса я это отмечаю... хотелось бы чтобы программа могла работать на 8086! не могу разобраться как мне из последовательности цифр в моем буфере buf восстановить скажем двоичное число в 64 разряда и разместить его в переменной Код (Text): SCAN_NUM PROC NEAR PUSH DX ;тут сохраняю текущие значения регистров PUSH AX PUSH SI MOV SI, 0 MOV CX, 0 MOV AH, 00h INT 16h ; проверяем не минус ли у нас первый символ CMP AL, '-' ;сравниваем содержимое AL и JE set_minus ;если равно идем к set_minus jmp nx_dg ; прыгаем к nx_dg это чтобы пропустить лишний ввод set_minus: ;тут пока пропускаю... нужно будет сохранить в какую-нибудь переменную единичку скажем JMP next_digit next_digit: MOV AH, 00h ;считываем символ INT 16h ;и по прерыванию получаем его код в AL nx_dg: ; тут хочу проверить не вылезает ли число за пределы 8-ми байт... ;только для этого нужно его получить из отдельных цифр ;пока ограничился просто вводом 8-ми цифр ; cmp SI, 8d ;проверяем нет ли еще 8-ми цифр ; je stop_input ;если уже 8 завершаем процедуру... CMP AL, 0Dh ;проверяем не Enter ли это je stop_input ;Если Enter, то переходим к stop_input CMP AL, 8 ;проверяем не BackSpaсe ли у нас этот символ JE backspace ;если cmp AL, '0' ;сравниваем введенный символ и символ '0' jl next_digit ;если у нас прочитанный символ ниже '0' в таблице кодов, то возвращаемся к next_digit cmp AL, '9' ;сравниваем введенный символ и символ '9' jg next_digit ;если у нас прочитанный символ выше '9' в таблице кодов, то возвращаемся к next_digit ;таким образом я исключаю попадание символов отличных от цифр от 0, до 9 MOV buf[SI], AL ;теперь я записываю в элемент массива buf с номером SI число, которое ввел пользователь inc SI ;увеличиваю SI на единицу MOV AH, 0Eh ;вывожу число на экран INT 10h ;по прерыванию jmp next_digit ;перехожу к next_digit для ввода нового символа stop_input: POP SI ;тут восстанавливаю значения регистров POP AX POP DX RET backspace: ;тут пока не знаю как сделать... нужно удалять последний символ JMP next_digit ;перехожу к next_digit для ввода нового символа SCAN_NUM ENDP
Просто совет: лучше воспользоваться стандартной функцией ввода строки (которая обработает и бакспейс, и остальное) а уже потом проверить, правильное ли это число, и если нет - сказать об этом и попросить ввести число еще раз.