; (c) xrnd [2010] [http://asmworld.ru/] ; inputhex.asm - ввод шестнадцатеричных чисел use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h mov cx,print_str ;Адрес процедуры print_str mov bx,print_endline ;Адрес процедуры print_endline in_byte_lp: mov di,s_byte call cx ;Вывод строки 'byte:' call input_hex_byte ;Ввод байта call bx ;Вывод конца строки jnc in_word_lp ;Если нет ошибки, переход к вводу слова mov di,s_error call cx ;Вывод строки 'ERROR!' jmp in_byte_lp ;Переход к началу цикла in_word_lp: mov di,s_word call cx ;Вывод строки 'word:' call input_hex_word ;Ввод слова call bx ;Вывод конца строки jnc exit ;Если нет ошибки, переход к выходу из программы mov di,s_error call cx ;Вывод строки 'ERROR!' jmp in_word_lp ;Переход к началу цикла exit: mov di,s_pak call cx ;Вывод строки 'Press any key...' mov ah,8 ;Функция DOS 08h - ввод символа без эха int 21h mov ax,4C00h ;\ int 21h ;/ Завершение программы ;------------------------------------------------------------------------------- ;Процедура ввода байта с консоли в шестнадцатеричном виде ; выход: AL - байт (в случае ошибки AL = 0) ; CF = 1 - ошибка input_hex_byte: push dx ;Сохранение DX mov al,3 ;Ввод максимум 2 символов (FF) + конец строки call input_str ;Вызов процедуры ввода строки call str_to_hex_byte ;Преобразование строки в байт pop dx ;Восстановление DX ret ;------------------------------------------------------------------------------- ;Процедура ввода слова с консоли в шестнадцатеричном виде ; выход: AX - слово (в случае ошибки AX = 0) ; CF = 1 - ошибка input_hex_word: push dx ;Сохранение DX mov al,5 ;Ввод максимум 4 символов (FFFF) + конец строки call input_str ;Вызов процедуры ввода строки call str_to_hex_word ;Преобразование строки в слово pop dx ;Восстановление DX ret ;------------------------------------------------------------------------------- ;Процедура преобразования шестнадцатеричной строки в байт ; вход: AL - длина строки ; DX - адрес строки, заканчивающейся символом CR(0Dh) ; выход: AL - байт (в случае ошибки AL = 0) ; CF = 1 - ошибка str_to_hex_byte: push cx ;Сохранение CX mov cx,ax ;Сохранение AX в CX cmp al,2 ;Проверка длины строки jg sthb_error ;Если больше 2, возвращаем ошибку call str_to_hex_word ;Преобразование строки в слово jnc sthb_exit ;Если нет ошибки, то переход к выходу из процедуры sthb_error: stc ;CF = 1 sthb_exit: mov ah,ch ;Восстановление AH pop cx ;Восстановление CX ret ;------------------------------------------------------------------------------- ;Процедура преобразования шестнадцатеричной строки в слово ; вход: AL - длина строки ; DX - адрес строки, заканчивающейся символом CR(0Dh) ; выход: AX - слово (в случае ошибки AX = 0) ; CF = 1 - ошибка str_to_hex_word: push cx ;Сохранение регистров push dx push si movzx cx,al ;CX = счётчик цикла = длина строки jcxz sthw_error ;Если длина строки = 0, возвращаем ошибку cmp cx,4 jg sthw_error ;Если длина строки больше 4, возвращаем ошибку xor ax,ax ;AX = 0 mov si,dx ;SI = адрес строки sthw_lp: mov dl,[si] ;Загрузка в DL очередного символа строки inc si ;Инкремент адреса строки call convert_hex_digit ;Преобразование шестнадцатеричной цифры в число jc sthw_error ;Если ошибка, то возвращаем ошибку shl ax,4 ;Сдвиг AX на 4 бита влево or al,dl ;Добавление преобразованной цифры loop sthw_lp ;Команда цикла jmp sthw_exit ;CF = 0 sthw_error: xor ax,ax ;AX = 0 stc ;CF = 1 sthw_exit: pop si ;Восстановление регистров pop dx pop cx ret ;------------------------------------------------------------------------------- ;Процедура преобразования шестнадцатеричной цифры в число ; вход: DL - символ-цифра ; выход: DL - значение цифры (0-15, в случае ошибки DL = 0) ; CF = 1 - ошибка convert_hex_digit: cmp dl,'0' ;Сравнение с символом '0' jl chd_error ;Если меньше, возвращаем ошибку cmp dl,'9' ;Сравнение с символом '9' jg chd_a_f ;Если больше, то возможно это буква a-f или A-F sub dl,'0' ;Преобразование цифры в число ret ;Возврат из процедуры (здесь всегда CF = 0) chd_a_f: and dl,11011111b ;Преобразование буквы в верхний регистр cmp dl,'A' ;Сравнение с символом 'A' jl chd_error ;Если меньше, возвращаем ошибку cmp dl,'F' ;Сравнение с символом 'F' jg chd_error ;Если больше, возвращаем ошибку sub dl,'A'-10 ;Преобразуем букву в число ret ;Возврат из процедуры (здесь тоже всегда CF = 0) chd_error: xor dl,dl ;DL = 0 stc ;CF = 1 ret ;Возврат из процедуры ;------------------------------------------------------------------------------- ;Процедура ввода строки c консоли ; вход: AL - максимальная длина (с символом CR) (1-254) ; выход: AL - длина введённой строки (не считая символа CR) ; DX - адрес строки, заканчивающейся символом CR(0Dh) input_str: push cx ;Сохранение СX mov cx,ax ;Сохранение AX в CX mov ah,0Ah ;Функция DOS 0Ah - ввод строки в буфер mov [buffer],al ;Запись максимальной длины в первый байт буфера mov byte[buffer+1],0 ;Обнуление второго байта (фактической длины) mov dx,buffer ;DX = aдрес буфера int 21h ;Обращение к функции DOS mov al,[buffer+1] ;AL = длина введённой строки add dx,2 ;DX = адрес строки mov ah,ch ;Восстановление AH pop cx ;Восстановление CX ret ;------------------------------------------------------------------------------- ;Процедура вывода строки на консоль ; DI - адрес строки print_str: push ax mov ah,9 ;Функция DOS 09h - вывод строки xchg dx,di ;Обмен значениями DX и DI int 21h ;Обращение к функции DOS xchg dx,di ;Обмен значениями DX и DI pop ax ret ;------------------------------------------------------------------------------- ;Процедура вывода конца строки (CR+LF) print_endline: push di mov di,endline ;DI = адрес строки с символами CR,LF call print_str ;Вывод строки на консоль pop di ret ;------------------------------------------------------------------------------- ; Данные s_byte db 'byte: $' s_word db 'word: $' s_error db 'ERROR!',13,10,'$' s_pak db 'Press any key...$' endline db 13,10,'$' buffer rb 7