
- •В.А. Афанасьев
- •Часть 1 Лабораторный практикум
- •Предисловие
- •1. Краткая характеристика операционной среды ms-dos в компьютерах с операционной системой Windows
- •2. Составные части ms-dos и её инициализация
- •3. Взаимодействие Ассемблерной программы с ms-dos и аппаратными средствами Компьютера
- •4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде ms-dos
- •Распределение первого мегабайта памяти компьютера
- •Содержание некоторых полей области данных bios
- •5. Программная модель 32-разрядных процессоров i80x86
- •Назначения сегментных регистров
- •6.2.2. Путь выполнения команды
- •6.2.3. Трансляция программы. Опции командной строки
- •6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •Сегменты упрощенной модели памяти Small
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •6.2.5. Работа с отладчиком Turbo Debugger (td)
- •6.2.6. Форматы машинных команд и их кодирование
- •Определение эффективного адреса
- •Косвенные виды адресации
- •6.2.6.2. Использование 32-битных регистров
- •6.2.7. Работа над синтаксическими ошибками при ассемблировании программы
- •6.3. Задание к работе. Порядок выполнения
- •6.4. Контрольные вопросы
- •Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
- •Машинные коды команд базового процессора i8086
- •П.1.2. Демонстрационные файлы
- •П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
- •А) Листинг prog_com. Lst
- •Содержимое префикса программы psp
- •А) Листинг prog_exe.Lst
- •Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
- •Формат заголовка исполняемого .Exe – файла на диске
- •7.2.2. Ввод с клавиатуры символьной информации
- •7.2.2.1. Буфер ввода данных с клавиатуры
- •7.2.2.2. Системные функции dos ввода данных с клавиатуры
- •Сравнительная характеристика функций dos ввода с клавиатуры
- •7.2.3. Функции dos вывода данных на экран
- •7.2.4. Расширенные коды ascii и управление программой с клавиатуры
- •Расширенные коды для функциональных клавиш
- •7.2.5. Строковые команды. Общая характеристика
- •Команды обработки строк
- •7.3. Задания к работе. Подготовка и выполнение
- •7.4. Контрольные вопросы
- •Приложения к лабораторной работе № 2 Приложение п.2.1. Примеры реализаций типового задания
- •Приложение п.2.2. Esc-последовательности
- •Параметры Esc-последовательности
- •Приложение п.2.3. Таблица символов в кодировке ascii
- •8.2.2. Прямое программирование видеобуфера в текстовом режиме
- •8.2.3. Справочные данные по функциям bios
- •8.2.3.1. Прерывание int 10h. Видеофункции bios
- •Текстовые видеорежимы и страницы в стандарте vga, поддерживаемые современными видеоконтроллерами
- •8.2.3.2. Рекомендации по использованию видеосервиса bios
- •8.2.3.3. Прерывание int 16h
- •8.2.3.4. Задержка программных операций
- •Int 15h, функция 86h
- •8.3. Варианты индивидуального задания
- •8.4. Контрольные вопросы
- •Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры
- •П.3.2. Листинг 3.5. Демонстрационная программа использования функций bios для работы с экраном и клавиатурой
- •9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •Представление чисел в 16- разрядном компьютере
- •9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •9.2.4. Задание к работе. Порядок выполнения
- •Варианты заданий 1-7
- •Варианты заданий 8-14
- •9.2.5. Вопросы построения многомодульных программ
- •9.2.6. Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •9.3. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
Данное преобразование представляет собой процесс обратный предыдущему. На первом этапе происходит формирование младших двоичных тетрад для соответствующих ASCII-цифр (символов), на втором – получение собственно ASCII-кодов.
Первый этап реализуется путём последовательного использования операции деления исходного двоичного числа и его частных на основание соответствующей системы счисления P. Полученные остатки и представляют собой двоичные тетрады соответствующих байтов ASCII-кодов (первый остаток определяет младшую цифру преобразуемого числа, последний – старшую). Цикл деления, в котором формируется нулевое значение частного, означает конец преобразования.
Второй этап преобразования сводится к выполнению операции сложения полученных остатков с числом 30h (Р = 2, 8, 10 и, выборочно, для формирования ASCII-кодов младших цифр 16-теричного числа). Для формирования ASCII-символов A,B,...,F используется число 37h. Чтобы не заниматься хранением промежуточных результатов первых этапов, рекомендуется в каждом цикле преобразования объединять оба этапа (прямого или обратного).
П
Номер шага деления
числа и его частных Частное Остаток ASCII-
код
на основание 10
1 (((0*10)+02)*10 + 03 07 37h (Мл.
байт)
2 ((0*10) + 02) 03 33h
3 0 02 32h (Ст. байт)
Десятичное число в ASCII-формате:
32 33 37.
Рассмотренный алгоритм преобразования двоичного числа в десятичное ASCII-число реализован в программе, представленной в листинге 4.2.
Листинг 4.2. Подпрограмма преобразования 16-битового двоичного дополнительного кода из регистра ах в десятичное ASCII-число со знаком в буфере dec_buf (знак+5цифр). Адрес буфера находится в регистре bx.
Comment /*
Вход: ax – 16-битовый двоичный дополнительный код,
bx – адрес буфера dec_buf десятичного ASCII- числа размером 6 байт.
Выход: десятичное ASCII- число в буфере dec_buf (знак+5цифр),
ax – сохраненный двоичный дополнительный код.
Дополнительные условия: младший разряд десятичного ASCII -числа должен располагаться в последнем, старшем по адресу, байте буфера.*/
Proc Bin_#dec
push dx di cx
push ax ;Сохраним знак преобразуемого числа
mov cx,6 ;Размер буфера в байтах
Blank: mov [byte bx],' ' ;Очистим буфер, т.е. заполним его пробелами
inc bx
loop Blank
dec bx ;Установим адрес последнего элемента буфера
mov di,10 ;Введём основание десятичной системы счисления
or ax,ax ;Установим флаг знака SF
jns trans ;Перейдём к преобразованию, если SF=0
neg ax ;Изменим знак
trans: sub dx,dx ;Сделаем dx=0
div di ;ax=quot(dx:ax/10), dx=rem(dx:ax/10)
add dl,'0' ;Сформируем десятичную ASCII-цифру
mov [byte bx],dl ;Занесём в буфер
dec bx ;Движение назад
or ax,ax ;Преобразование закончено?
jnz trans ;Повторить, если АХ>0
pop ax ;Восстановить исходное число,
or ax,ax ;с целью определения его знака
jns out_ trans ;Выходим из подпрограммы, если SF=0
mov [byte bx],'-' ;Запишем знак '-' для отрицательного числа
pop cx di dx
out_trans: ret
Endp Bin_#dec
End