Приведем текст файла SERVIS.ASM, содержащий помимо процедур ввода и вывода многозначных чисел дополнительно процедуры очистки экрана, установки курсора, вывода строки текста на экран.
Текст этого файла:
PUBLIC Vvod,Vyvod,Clear,Write_Str,Cursor StackSg SEGMENT PARA Stack 'Stack' DW 132 DUP (?) StackSg ENDS CodeSg SEGMENT PARA PUBLIC Assume CS:CodeSg, SS:StackSg Vvod PROC FAR ;Процедура ввода числа. ;Число помещается в регистр BX. ;------------------ Сохранение регистров -------------- PUSH AX PUSH CX PUSH DX ;------------------ Ввод с клавиатуры ----------------- MOV BX,0000 ;Введенное число. MOV CX,0000 ;Количество помещений в стек. MOV DX,1 ;Множитель. @V1: MOV AH,01 INT 21H CMP AL,0DH ;Это клавиша Enter? JE @V2 ;Переход на обработку числа. CMP AL,'-' ;Это знак '-'? JE @V3 ;Ничего вычитать не надо. SUB AL,30H @V3: MOV AH,0 PUSH AX ;Поместить цифру в стек. INC CX ;Увеличить счетчик на 1. JMP @V1 ;Переход на ввод новой цифры. ;------------------ Получение числа -------------------- @V2: POP AX ;Достать цифру из стека. CMP AL,'-' ;Это '-'? JNE @V4 ;Нет - перейти на обработку. NEG BX ;Да - сменить знак числа. JMP @V5 ;Выход из процедуры. @V4: MUL DL ;Умножить ее на множитель. ADD BX,AX ;Прибавить произведение к результату. ;Получить очередной множитель. MOV AX,DX MOV DX,000AH MUL DL MOV DX,AX ;Поместить множитель в DX. LOOP @V2 ;Извлечь очередную цифру. ;-- Выход из процедуры. Восстановление регистров -------- @V5: POP DX POP CX POP AX RET Vvod ENDP Vyvod PROC FAR ;Процедура вывода числа на экран. ;Число находится в регистре BX. ;------------------ Сохранение регистров -------------- PUSH AX PUSH CX PUSH DX ;------------------ Проверяем знак числа -------------- CMP BX,0 JGE @K1 ;Да - число неотрицательное. MOV AH,02 ;Выводим на экран символ '-'. MOV DL,'-' INT 21H NEG BX ;Меняем знак. ;------------------ Получаем цифры числа --------------- @K1: MOV AX,BX MOV BX,0000 MOV DX,000AH;Делитель. MOV CX,0000 ;Количество помещений в стек. @K2: DIV DL MOV BL,AH ;Остаток от деления - в стек. PUSH BX MOV AH,0 INC CX ;Увеличить счетчик на 1. CMP AX,0 JNE @K2 ;Получение следующей цифры. ;------------------ Вывод цифр на экран ----------------- MOV AH,02 @K3: POP DX ADD DL,30H INT 21H LOOP @K3 ;-- Выход из процедуры. Восстановление регистров -------- POP DX POP CX POP AX RET Vyvod ENDP Clear PROC FAR ;Процедура очистки экрана. PUSH AX PUSH BX PUSH CX PUSH DX MOV AX,0600H ;Запрос на очистку экрана. MOV BH,07 ;Нормальный атрибут (черно/белый). MOV CX,0000 ;Верхняя левая позиция. MOV DX,184FH ;Нижняя правая позиция. INT 10H ;Передача управления в BIOS. POP DX POP CX POP BX POP AX RET Clear ENDP Write_Str PROC FAR ;Процедура вывода строки на экран. PUSH AX MOV AH,09 ;Запрос вывода на экран. INT 21H ;Вызов DOS-прерывания. POP AX RET Write_Str ENDP Cursor PROC FAR ;Процедура установки курсора. PUSH AX PUSH BX MOV AH,2 ;Запрос на установку курсора. MOV BH,0 ;Экран 0. INT 10H ;Передача управления в BIOS. POP BX POP AX RET Cursor ENDP CodeSg ENDS END