
- •В.А. Афанасьев
- •Часть 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. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
П.1.2. Демонстрационные файлы
В данном приложении приводятся файлы, используемые при выполнении заданий к лабораторной работе № 1. Файл hello.exe может быть запущен на исполнение для отработки простого диалога с программой, так и загружен в отладчик TD, для изучения возможностей последнего при отладке ассемблерных программ. Файлы из группы – Mov.asm, Arithmet.asm Logical.asm, LoopCall.asm – демонстрируют применение соответствующей группы команд с использованием различных видов адресации. Поэтому после трансляции их загружают только в TD с целью просмотра форматов машинных команд процессора при изучении принципов их кодирования.
%TITLE "Демонстрационный файл Hello.asm"
IDEAL
MODEL small
STACK 256
DATASEG
Promt DB 'Это время после полудня? (Да/Нет – y/n)$'
GoodMorning DB 13,10,'Доброе утро!',13,10,'$'
GoodAfternoon DB 13,10,'Здравствуйте!',13,10,'$'
CODESEG
Start: mov ax,@data ;Установка в ds адреса сегмента
mov ds,ax ;данных
mov dx,OFFSET Promt ;Сообщение-запрос
mov ah,9 ;Функция Dos вывода сообщения
int 21h ;на экран
mov ah,1 ;Функция Dos ввода символа с
int 21h ;клавиатуры
cmp al,'y' ;y?
jz IsAfternoon ;да, время после полудня
cmp al,'n' ;n?
jz IsMorning ;нет, до полудня
IsAfternoon: mov dx,OFFSET GoodAfternoon ;Указание на "Здравствуйте"
jmp SHORT Disp
IsMorning: mov dx,OFFSET GoodMorning ;Указание на "Доброе утро"
Disp: mov ah,9 ;Функция Dos вывода сообщения на
int 21h ;экран
Exit: mov ax,4C00h ;Функция DOS- выход из программы
int 21h ;Вызов DOS. Останов программы.
END Start ;Конец программы/точка входа
%TITLE "Команды MOV и режимы адресации. Файл mov.asm"
IDEAL
MODEL small
STACK 256
value = 528
DATASEG
b_x DB 1,2,4
w_x DW 8,16,32,64
Label b_var byte
w_var DW 1234h ;Число в памяти: 34h(мл. байт):12h(ст. байт)
CODESEG
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных.
;Непосредственная адресация.
mov al,255 ;255=0FFh-беззнаковое число
mov ah,-1 ;[4] ;-1=0FFh-отрицательное число
mov ax,value/5+20 ;[5] ;Загрузка в ах константного выражения
mov bx,offset w_x; ;[6] ;Адрес переменной w_x в bx (bx=0003h)
;Регистровая и прямая адресации. Символьная переменная, заключённая в квадратные
;скобки (например [b_x]), – выполняет роль адреса этой переменной в памяти
mov dl,al ;[7]
mov al,[b_x] ;В al занести содержимое переменной b_x, т. е. al=b_x[0]=01h.
mov dx,[w_x] ;dx=w_x[0]=0008h.
mov si,[w_var] ;si=1234h
mov al,[b_var] ;al=[b_var]=34h
mov ah,[b_var+1] ;ah=[b_var+1]=12h
;Косвенная регистровая.
mov cx,[bx] ;[13] ;cx=w_x[0]=0008h, т.к. bx=offset w_x
mov [word bx],-2 ;[14] ;w_x[0]= -2=0FFFEh.
;Базовая адресация.
mov ax,[bx+2] ;[15] ;ax=w_x[1]=16=0010h.
mov [word bx+2],24 ;[16] ;w_x[1]=24=0018h.
;Индексная адресация.
mov si,1
mov al,[si+b_x] ;[18] ;al=[b_x+1]=02h.
;Базово индексная адресация.
inc si ;si=2
mov bx,1 ;bx=2
mov ax,[bx+si+w_x] ;[21] ;ax=[4+w_x]=32=0020h.
mov [word bx+si+w_x],128 ;[22] ;w_x[2]=128=0080h.
;Применение команды lea
lea bx,[w_x+si] ;[23] ;bx=offset w_x+si=offset w_x[1]=005h.
Exit: mov ax,4C00h ;Функция DOS- выход из программы.
int 21h ;Вызов DOS. Останов
END Start ;Конец программы/точка входа.
%TITLE "Команды сложения, умножения и деления. Файл arithmet.asm"
IDEAL
MODEL small
STACK 256
DATASEG
op_1 DD 11112222h
op_2 DD 3333DDDEh
b_dst DB 32 ;20h
b_src DB 64 ;40h
w_src DW 512 ;200h
CODESEG
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных.
;Сложение операндов из двойных слов.
mov di,offset op_1
mov si,offset op_2
mov ax,[di] ;Low(op_1)ax.
add ax,[si] ;[6] ;Low(op_1)+Low(op_2)=Low(sum).
mov [di],ax ;Сохранение Low(sum).
mov ax,[di+2] ;High(op_1)ax.
adc ax,[si+2] ;[9] ;High(op_1)+High(op_2)+cf=High(sum).
mov [di+2],ax ;Сохранение High(sum).
;Умножение и деление.
mov al,[b_dst] ;al=32=20h.
Push al
mul [b_src] ;[13] ;ax al*[b_src]- беззнаковое умножение: "8*8=16"
neg [b_src] ;[14] ;[b_src]0-[b_src]
pop al
imul [b_src] ;[16] ;ax al*[b_src]- знаковое умножение: "8*8=16"
idiv [b_src] ;[17] ;{al= Quot (ax/[b_src]), ah=Rem (ax/[b_src])} – знако-
;вое деление: "16:8=8"
cbw ;alax (со знаком). В данном случае ax0
mul [w_src] ;[19 ] ;dx:axax[w_src]- беззнаковое умножение: "16*16=32"
idiv [w_src] ;[20 ] ;{axQuot (dx.ax/w_src), dxRem (dx.ax/w_src)} –
;знаковое деление в формате: "32:16=16". Так как операнды положительные, то такой же
;результат можно было бы получить и с помощью команды div
Exit: mov ax,4C00h ;Функция DOS -выход из программы.
int 21h ;Вызов DOS. Останов.
END Start ;Конец программы/точка входа.
%TITLE "Логические команды и команды сдвига. Файл logical.asm"
IDEAL
MODEL small
STACK 256
DATASEG
source DW 0ABh
w_mask DW 0F0h
oper DB 0AAh ;176
CODESEG
Start: mov ax,@data ;Установка в ds адреса сегмента
mov ds,ax ;данных.
mov ax,[source] ;Занести в ax,bx,cx, [source]=0ABh
mov bx,ax
mov cx,ax
;Стандартное применение логических команд
and ax,[w_mask] ;[6] ;Стирание соответствующих битов
or bx,[w_mask] ;[7] ;Установка соответствующих битов в "1"
xor cx,[w_mask] ;Инвертирование соответствующих битов
xor bx,bx ;bx=0. Гашение регистра
;Циклические сдвиги.
rol [oper],1 ;[10] ;[oper]=55, cf=1.
ror [oper],1 ;[oper]=AA, cf=1.
rcl [oper],1 ;[12] ;[oper]=55, cf=1.
rcr [oper],1 ;[oper]=AA, cf=1.
;Нестандартное применение – быстрое деление положительного числа сдвигами вправо.
mov al,0Eh ;al=0Eh=14
sar al,1 ;[15] ;al=07 ,cf=0,
sar al,1 ;al=03 ,cf=1,
sar al,1 ;al=01 ,cf=1,
sar al,1 ;al=00 ,cf=1.
;Быстрое умножение сдвигами влево положительного числа: A=10*x=(4+1)*2*x; x=al.
mov al,2 ;al=2
mov bl,al
sal al,1 ;[21] ;*2,
shl al,1 ;*4,
add al,bl ;*(4+1),
shl al,1 ;*10, al=10*x=20=14h.
Exit: mov ax,4C00h ;Функция DOS -выход из программы.
int 21h ;Вызов DOS. Останов.
END Start ;Конец программы/точка входа.
%TITLE "Цикл с подпрограммой. Файл LoopCall.asm"
;В программе демонстрируется организация цикла на основе команды Loop в процессе деле-
;ния каждого элемента массива Array на постоянное число с использованием соответствую-
;щей процедуры Divide
IDEAL
MODEL small
STACK 256
DATASEG
Array DB 20,25,30,35,40
LengArray = $-Array ;длина строки
CODESEG
Start: mov ax,@data ;Установка в ds адреса сегмента
mov ds,ax ;данных.
mov si,offset Array
mov cx,LengArray
L1: mov al,[si] ;alтекущий элемент строки.
call Divide ;[6] ;Выполнение процедуры деления на 5.
mov [si],al
inc si
loop L1 ;[9] ;Повторить сх раз
Exit: mov ax,4C00h ;Функция DOS -выход из программы.
int 21h ;Вызов DOS. Останов.
;Подпрограмма деления Divide на 5. Вход: al-значение, предназначенное для деления.
;Выход: al-результат деления.
PROC Divide near ;Оператор near можно не указывать, т.к. модель
;памяти Small предполагает все переходы близкими
push bx
xor ah,ah ;Подготовка ah:al как 16-битовое
mov bl,5 ;делимое, а bl- 8-битовый делитель.
div bl ;al<quot(ax/bl), ah<-rem(ax/bl)
pop bx
ret ;[18] ;Возврат из процедуры
ENDP Divide
END Start ;Конец программы/точка входа.