
- •В. Синицина
- •Содержание
- •Введение
- •Лабораторная работа № 1
- •1.2.2 Путь выполнения команды
- •1.2.3 Трансляция программы. Опции командной строки
- •1.2.4 Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •1.2.5 Работа с отладчиком Turbo Debugger (td)
- •1.2.6 Форматы машинных команд и их кодирование
- •1.2.7 Работа над синтаксическими ошибками при ассемблировании программы
- •1.3. Задание к работе. Порядок выполнения
- •1.4 Контрольные вопросы
- •Лабораторная работа №2 преобразование форматов числовых данных в операциях ввода-вывода
- •2.1 Целевые установки
- •2.2 Методические рекомендации
- •2.2.1 Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •2.2.2 Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •2.2.3 Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •2.2.4 Задание к работе. Порядок выполнения
- •2.2.5 Вопросы построения многомодульных программ
- •%Title "#dec_bin.Asm"
- •%Title"#10bin10.Asm"
- •2.2.6 Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •2.3 Контрольные вопросы
- •Лабораторная работа № 3
- •3.3. Задания к лабораторной работе
- •4.2.2 Краткие комментарии к динамической библиотеке
- •4.3 Контрольные вопросы
- •5.2.2 Ввод с клавиатуры символьной информации
- •5.2.3 Функции dos вывода данных на экран
- •5.2.4 Расширенные коды ascii и управление программой с клавиатуры
- •5.2.5 Строковые команды. Общая характеристика
- •5.3 Задания к работе. Подготовка и выполнение
- •5.4 Контрольные вопросы
- •Лабораторная работа № 6
- •6.2.2 Прямое программирование видеобуфера в текстовом режиме
- •6.2.3 Справочные данные по функциям bios Прерывание int 10h. Видеофункции bios
- •Рекомендации по использованию видеосервиса bios
- •Прерывание int 16h
- •Задержка программных операций
- •Int 15h, функция 86h
- •6.3 Варианты индивидуального задания
- •6.4 Контрольные вопросы
- •Лабораторная работа № 7
- •7.2.2 Oчиcткa буфepa клaвиaтуpы
- •7.2.3 Пpoвepкa cимвoлoв в буфepe
- •7.2.4 Oжидaть ввoд cимвoлa и нe вывoдить eгo нa экpaн
- •7.2.5 Oжидaниe нaжaтия клaвиши и эxo нa экpaн
- •7.2.6 Пpиeм cимвoлa бeз oжидaния
- •7.2.7 Пoлучeниe cтpoки cимвoлoв
- •7.2.8 Пpoвepкa/уcтaнoвкa cтaтуca клaвиш-пepeключaтeлeй
- •7.2.9 Haпиcaниe пpoцeдуpы ввoдa c клaвиaтуpы oбщeгo нaзнaчeния
- •7.2.10 Пepeпpoгpaммиpoвaниe пpepывaния клaвиaтуpы
- •7.2.11 Пepeпpoгpaммиpoвaниe oтдeльныx клaвиш
- •7.2.12 Cвoднaя тaблицa cкaн-кoдoв
- •7.2.13 Cвoднaя тaблицa pacшиpeнныx кoдoв
- •Лабораторная работа № 8
- •8.3 Задания к лабораторной работе
- •Лабораторная работа №9
- •9.2.2 Пpoгpaммиpoвaниe микpocxeмы uart 8250
- •9.2.3 Инициaлизaция пocлeдoвaтeльнoгo пopтa
- •9.2.4 Уcтaнoвкa тeкущeгo кoммуникaциoннoгo пopтa
- •9.2.5 Oпpeдeлeниe cтaтуca кoммуникaциoннoгo пopтa
- •9.2.6 Инициaлизaция и упpaвлeниe мoдeмoм
- •9.2.7 Пepeдaчa дaнныx
- •9.2.8 Пoлучeниe дaнныx
- •9.2.9 Пocылкa/пoлучeниe дaнныx c пoмoщью кoммуникaциoннoгo пpepывaния
- •Список использованных источников
Лабораторная работа №2 преобразование форматов числовых данных в операциях ввода-вывода
2.1 Целевые установки
Программирование операций преобразования чисел с произвольным основанием из ASCII-формата в двоичный код и наоборот.
Освоение принципов многомодульного программирования.
2.2 Методические рекомендации
Для обеспечения высокой производительности процессора при выполнении им арифметико-логических операций над числовыми данными используется их двоичное представление, однако, все данные, поступающие в машину с клавиатуры или выводимые с процессора на принтер или экран дисплея, представляются в кодах ASCII. Следовательно, одной из основных функций процессора является преобразование внешнего формата данных во внутренний двоичный формат и наоборот – из двоичного формата в кодыASCII.
В работе в краткой форме рассматриваются принятые в практике программирования способы преобразования форматов, а также ряд соглашений, связанных с особенностями ввода-вывода знаковых чисел, а также вопросы организации многомодульных программ.
2.2.1 Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
В вычислительной технике принято считать отрицательными все числа, у которых старший (знаковый) бит равен 1, т. е. в 16-разрядном компьютере это соответствует числам в диапазоне 8000h...0FFFFh. При этом отрицательные числа записываются в дополнительном коде. Положительные числа 0000h ... 7FFFhимеют нулевой старший бит. В табл. 2.1 представлены числа из отмеченных выше диапазонов, которые могут быть определены в сегменте данных программы с помощью директивыDW.
Таблица2.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, представленное в дополнительном коде. Таким образом, знак числа является характеристикой не самого числа, а способа его обработки.
2.2.2 Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
Задания к лабораторной работе предусматривают использование чисел с различным основанием (2, 8, 10 и 16), поэтому здесь рассматривается способ, не зависящий от основания системы счисления. Преобразование числовых ASCII-строк в двоичное число обычно реализуется в два этапа. На первом этапе каждаяASCII-цифра (байт) преобразуется в неупакованный формат со старшей нулевой тетрадой, а затем, на втором этапе, цепочка неупакованных байтов преобразуется в число по правилу Горнера.
Наиболее просто реализуется первый этапдля чисел с основаниемP, равным 2, 8, и 10, и несколько усложняется для основанияP = 16.
Из табл. 2.2 следует, что в последнем случае при переходе от ASCII-кода цифры к двоичному коду цифры (младшая тетрада) необходимо предварительно выполнить операцию сравнения на принадлежностьASCII-кода к цифре или прописной букве (A, B, ...F). В первом случае выполняется операция вычитания с числом30h, а во втором – с числом37h.
Таблица2.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.
Листинг 2.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
jaoverflow;Число >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 ;
pushdxdi
xor ax,ax ;Очистим регистр двоичного числа
mov di,10 ;10- основание системы счисления
cycl:muldi;dx:ax=ax*10
jc over_flow ;Переход, если CF=1
mov dl,[bx] ;Выберем очередную ASCII-цифру
sub dl,30h ;Образуем двоичное число
add ax,dx ;Промежуточная сумма
jcover_flow;Переход, еслиCF=1
incbx
loopcycl;Продолжим, еслиcx>0
clc ;Нет, сбросим флаг CF=1
over_flow: pop di dx
ret
endpconv