
- •В.А. Афанасьев
- •Часть 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.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
В вычислительной технике принято считать отрицательными все числа, у которых старший (знаковый) бит равен 1, т. е. в 16-разрядном компьютере это соответствует числам в диапазоне 8000h...0FFFFh. При этом отрицательные числа записываются в дополнительном коде. Положительные числа 0000h ... 7FFFh имеют нулевой старший бит. В табл. 4.1 представлены числа из отмеченных выше диапазонов, которые могут быть определены в сегменте данных программы с помощью директивы DW.
Таблица 4.1
Представление чисел в 16- разрядном компьютере
Десятичное число |
8-ричные и 16-ричные числа |
Представление чисел в памяти, (hex) |
Примечание |
65535 ... 32768 |
177777q=FFFFh ... 100000q=8000h |
FFFF ... 8000 |
1 |
32767 ... 127 ... 1 0 |
77777q=7FFFh ... 177q=7Fh ... 1q=1h 0 |
7FFF ... 007F ... 0001 0000 |
2 |
-1 ... -128 ... -32768 |
-1q=-1h ... -200q=-80h ... -100000q=-8000h |
FFFF ... 0080 ... 8000 |
3 |
-32769 ... -65535 -65536 |
-100001q=-8001h ... -177777q=-FFFFh -200000q=-10000h |
7FFF ... 0001 0000 |
4 |
Определим основные области представления чисел в табл. 4.1: 1 – область старших беззнаковых чисел, 2 – область младших беззнаковых чисел или положительных знаковых чисел, 3 – область отрицательных знаковых чисел, 4 – "квази-область" положительных чисел. Пользоваться этой формой задания чисел, допускаемой ассемблером, не рекомендуется.
В заключение отметим, что знак числа условен. Одно и то же число 0FFFFh может рассматриваться как максимальное число, а в другом – как отрицательное число –1, представленное в дополнительном коде. Таким образом, знак числа является характеристикой не самого числа, а способа его обработки.
9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
Задания к лабораторной работе предусматривают использование чисел с различным основанием (2, 8, 10 и 16), поэтому здесь рассматривается способ, не зависящий от основания системы счисления. Преобразование числовых ASCII-строк в двоичное число обычно реализуется в два этапа. На первом этапе каждая ASCII-цифра (байт) преобразуется в неупакованный формат со старшей нулевой тетрадой, а затем, на втором этапе, цепочка неупакованных байтов преобразуется в число по правилу Горнера.
Наиболее просто реализуется первый этап для чисел с основанием P, равным 2, 8, и 10, и несколько усложняется для основания P = 16.
Из табл. 4.2 следует, что в последнем случае при переходе от ASCII-кода цифры к двоичному коду цифры (младшая тетрада) необходимо предварительно выполнить операцию сравнения на принадлежность ASCII-кода к цифре или прописной букве (A, B, ...F). В первом случае выполняется операция вычитания с числом 30h, а во втором – с числом 37h.
Таблица 4.2
Таблица ASCII- кодов цифр
Цифра (символ) |
0 |
1 |
|
9 |
A |
|
F |
16-теричное значение ASCII- кода символа |
30 |
31 |
|
39 |
41 |
|
46 |
Неупакованный формат (младшая тетрада) |
0000 |
0001 |
|
1001 |
1010 |
|
1111 |
Реализацию схемы Горнера на втором этапе для n-разрядного числа А = anan-1...a1 с основанием Р можно представить в следующем виде:
anan-1...a2a1=((...(0 * P + an)P + an-1)P +...+a2)P + a1.
П
Неупакованный формат Схема
Горнера Двоичное число
02 03 07 (((0*10) + 02)*10 + 03)*10 + 07 11101101
Пример преобразования десятичного числа: 237(10) = 11101101(2).
Рассмотренный алгоритм преобразования десятичного ASCII-числа в двоичное число реализован в программе, представленной в листинге 4.1.
Листинг 4.1. Преобразовать знаковое десятичное ASCII-число из буфера (6 байт = знак + 5 цифровых разрядов) по адресу в bx в 16-разрядное двоичный код в регистре ax.
Comment /*
Вход: Знаковое десятичное ASCII-число в буфере байтового типа с начальным адресом в BX,
CX -количество ASCII-символов числа, включая знак '-'.
Расположение числа в буфере: в первом байте буфера располагается старший цифровой разряд положительного числа или знак "минус" отрицательного.
Выход: ax -16-разрядное двоичный код в регистре ax,
Флаг cf=1, если преобразуемое число больше 32767 или меньше -32768, иначе cf=0. */
proc #dec_bin
cmp [byte bx],'-' ;Отрицательное число?
jne positive
inc bx ;Продвинем указатель и
dec cx ;уменьшим счётчик цикла
call conv ;Преобразуем модуль отрицательного десятичного числа.
;На выходе: ax – двоичный код,
;сf=1, если преобразуемое число превышает значение 65535 (т.е. регистр ax переполнится в процессе преобразования)
jc overflow ;Число > 65535?
cmp ax,32768
ja overflow ;Число >32768
neg ax ;Сформируем дополнительный код
js good ;Закончим преобразование
positive: call conv ;Преобразуем модуль положительного десятичного числа.
jc overflow ; Число > 65535?
cmp ax,32767
jbe good ;Число< 32767
overflow: stc ;cf=1
jmp n_good ;Выйдем из преобразования
good: clc ;cf=0
n_good: ret
endp #dec_bin
proc conv ;
push dx di
xor ax,ax ;Очистим регистр двоичного числа
mov di,10 ;10- основание системы счисления
cycl: mul di ;dx:ax = ax*10
jc over_flow ;Переход, если CF=1
mov dl,[bx] ;Выберем очередную ASCII-цифру
sub dl,30h ;Образуем двоичное число
add ax,dx ;Промежуточная сумма
jc over_flow ;Переход, если CF=1
inc bx
loop cycl ;Продолжим, если cx>0
clc ;Нет, сбросим флаг CF=1
over_flow: pop di dx
ret
endp conv