Приведем текст файла 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