;Процедуры ввода-вывода знаковых и беззнаковых чисел (размером 1 и 2 байта) ;Процедура: in_value ;Описание: ;Ввод двухбайтового десятичного числа с контролем ввода и BackSpace ;Параметры: нет ;Возвращает: ;ax - вводимое число ;Примечание: ;Дополнительно используются регистры cx, dx и si in_value proc near ;ввод числа в ax mov si, 0 ;установка счетчика в 0 in_value_m1: ;цикл mov ah, 08h ;функция ввода символа без эха с ожиданием int 21h cmp al, 08h ;сравнение с BackSpace jnz in_value_l2 ;введен именно он cmp si, 0 ;сравниваем число введенных символов с 0 jz in_value_l2 ;введен хотя бы один символ mov dl, 08h ;выводимый символ - BackSpace mov ah, 02h ;функция вывода одного символа int 21h mov dl, ' ' ;выводимый символ - Пробел mov ah, 02h ;функция вывода одного символа int 21h mov dl, 08h ;выводимый символ - BackSpace mov ah, 02h ;функция вывода одного символа int 21h dec si ;уменьшаем число цифр на 1 pop ax ;забираем из стека введенную цифру jmp in_value_m1 ;переходим ко вводу следующей цифры in_value_l2: ;отсутствие BackSpace или невозможность его выполнения cmp al, 0Dh ;сравнение с Enter jnz in_value_l3 ;введен именно он cmp si, 0 ;сравниваем число введенных символов с 0 jz in_value_l3 ;введен хотя бы один символ mov dl, 0Dh ;выводимый символ - Enter mov ah, 02h ;функция вывода одного символа int 21h mov dl, 0Ah ;выводимый символ - VerticalTab mov ah, 02h ;функция вывода одного символа int 21h jmp in_value_l4 ;переходим к формированию введенного числа in_value_l3: ;отсутствие Enter или невозможность его выполнения cmp si, 3 ;сравниваем число введенных символов с 3 jz in_value_m1 ;ждем ввода очередного символа sub al, '0' ;номер цифры cmp al, 9 ;сравниваем с 9 jz in_value_l1 ;если равно 9 jc in_value_l1 ;если меньше 9 jmp in_value_m1 ;переходим к новой цифре in_value_l1: ;al находится в интервале 0..9 mov ah, 0 ;обнуляем верхушку ax push ax ;заносим ax в стек add al, '0' ;находим код цифры (al) mov dl, al ;выводимый символ - введенная цифра mov ah, 02h ;функция вывода одного символа int 21h inc si ;увеличиваем число введенных цифр на 1 jmp in_value_m1 ;в начало цикла in_value_l4: ;формируем число из цифр в стеке mov bx, 1 ;начальное значение порядка цифр mov cx, 0 ;начальное значение формируемого числа in_value_m2: ;цикл pop ax ;вытаскиваем из стека очередную цифру (ax) mul bx ;домножаем ее на порядок add cx, ax ;и прибавляем к формируемому числу mov ax, bx ;пересылаем bx в ax mov dl, 10 ;основание системы для вывода mul dl ;наращиваем ax (порядок) mov bx, ax ;пересылаем порядок обратно (ax в bx) dec si ;уменьшаем счетчик cmp si, 0 ;сравниваем номер текущей цифры с нулем jnz in_value_m2 ;в начало цикла mov ax, cx ;пересылаем сформированное число в ax ret ;выход из процедуры in_value endp ;Процедура: out_value ;Описание: ;Вывод числа в системе счисления с основанием, не большим 10 ;Параметры: ;ax - выводимое число ;bl - основание системы счисления для вывода (не более 10) ;Возвращает: нет ;Примечание: ;Дополнительно используются регистры cx и dx out_value proc near ;выводит на экран число в ax cmp bl, 10 ;сравниваем с 10 jz out_value_l1 ;если равно 10 jc out_value_l1 ;если меньше 10 mov bl, 10 ;записываем в bl 10 out_value_l1: ;теперь bl меньше либо равно 10 cmp bl, 0 ;сравниваем с 0 jnz out_value_l2 ;не равно 0 mov bl, 10 ;равно 0 out_value_l2: ;теперь bl больше 0 и не меньше 10 mov bh, 0 ;установка верхушки bx в 0 mov cx, 0 ;установка счетчика в 0 out_value_m1: ;цикл mov dx, 0 ;обнуляем верхушку двойного слова dx:ax div bx ;ax / bx -> ax, ax % bx -> dx push dx ;заталкиваем в стек очередную цифру (dx) inc cx ;наращиваем счетчик cmp ax, 0 ;сравниваем частное от деления с нулем jnz out_value_m1 ;в начало цикла out_value_m2: ;цикл pop dx ;вытаскиваем из стека очередную цифру (dx) add dl, '0' ;корректируем код цифры в ASCII mov ah, 02h ;подготовка к выводу символа int 21h dec cx ;уменьшаем счетчик cmp cx, 0 ;сравниваем номер текущей цифры с нулем jnz out_value_m2 ;в начало цикла ret ;выход из процедуры out_value endp ;Процедура: out_signed_byte ;Описание: ;Вывод числа в системе счисления с основанием, не большим 10 (со знаком) ;Параметры: ;al - выводимое число ;bl - основание системы счисления для вывода (не более 10) ;Возвращает: нет ;Примечание: ;Дополнительно используются регистры cx и dx out_signed_byte proc near ;выводит на экран число в al mov cl, al ;сохраняем al в cl and al, 80h ;домножаем на 80h (1 в старшем разряде) cmp al, 0 ;сравниваем результат с нулем jz out_signed_byte_l1 ;al - положительное число mov dl, '-' ;выводимый символ - знак "минус" mov ah, 02h ;функция вывода одного символа int 21h neg cl ;инвертируем знак out_signed_byte_l1: ;знак, если он есть, уже выведен mov ah, 0 ;обнуляем верхушку ah mov al, cl ;вынимаем значение из cl call out_value ;выводим абсолютное значение al ret ;выход из процедуры out_signed_byte endp ;Процедура: out_signed_word ;Описание: ;Вывод числа в системе счисления с основанием, не большим 10 (со знаком) ;Параметры: ;ax - выводимое число ;bl - основание системы счисления для вывода (не более 10) ;Возвращает: нет ;Примечание: ;Дополнительно используются регистры cx и dx out_signed_word proc near ;выводит на экран число в ax mov cx, ax ;сохраняем ax в cx and ax, 8000h ;домножаем на 8000h (1 в старшем разряде) cmp ax, 0 ;сравниваем результат с нулем jz out_signed_word_l1 ;ax - положительное число mov dl, '-' ;выводимый символ - знак "минус" mov ah, 02h ;функция вывода одного символа int 21h neg cx ;инвертируем знак out_signed_word_l1: ;знак, если он есть, уже выведен mov ax, cx ;вынимаем значение из cx call out_value ;выводим абсолютное значение ax ret ;выход из процедуры out_signed_word endp