- •Ижевский государственный технический университет
- •6. Оверлей 32
- •8.10. Стандартные библиотеки 52
- •Экзаменационные вопросы 52
- •1. Назначение системного программного обеспечения (спо)
- •Ос и языки программирования
- •2. Обслуживание ввода-вывода
- •2.1. Организация ввода-вывода
- •2.2 Способы управления пу Понятие драйвера пу
- •2.2.1. Синхронный ввод-вывод
- •2.2.2. Асинхронный ввод-вывод
- •2.2.3. Буферный ввод-вывод
- •3. Буферный обмен информацией в языках программирования.
- •4. Управление и доступ к оперативной памяти.
- •4.3. Управление реальной памятью
- •Разделы фиксированной длины
- •Использование разделов переменного размера
- •Использование перемещаемых разделов
- •Защита памяти
- •5. Библиотека dos
- •12. Прерывание 17h – работа с принтером
- •Функция 00h – прочитать время
- •6. Оверлей
- •6.1 Структура программного комплекса
- •6.2. Распределение памяти в оверлейной структуре
- •7. Встроенный в turbo pascal assembler
- •7.2. Режимы адресации в Ассемблере
- •7.4. Выражения для управления памятью
- •7.5.Выражения в Ассемблере
- •7.6. Команды Ассемблера
- •7.6.3. Команды ввода вывода
- •7.6.4. Адресные команды
- •7.6.7. Строковые команды
- •Test Аналогична команде and, но результат операции не записывается в 1 операнд.
- •Установить операнд:
- •8. Язык программирования с.
- •8.10. Стандартные библиотеки
- •Литература
- •Экзаменационные вопросы
- •На тему: название темы
- •Примечание: если курсовая работа выполняется двумя и более студентами, обязательно разбивка задач для каждого студента конкретно.
- •Состав пояснительной записки:
Test Аналогична команде and, но результат операции не записывается в 1 операнд.
Остальные команды данного раздела на самостоятельное изучение.
7.6.9. Битовые команды.
Возможны начиная с процессора 80386 (В PASCAL невозможны).
7.6.10. Команды условного перехода и действия.
Команды зависят от значения флагов. В зависимости от мнемоники команды осуществляют проверку того или иного флага.
Установить операнд:
SET[Cond]
Имеет 1 операнд, который представляет из себя целое байтное число. Если данное условие выполняется, то операнд устанавливается в 1, если не выполняется, то значение операнда равно нулю.
Команды условного перехода:
Аббревиатура команд SET[Cond] и J[Cond] аналогичная
J[Cond]
Имеет 1 операнд, который является меткой. Метка во встроенном Ассемблере начинается с @. Далее идет любая литерная информация, состоящая из букв латинского алфавита, цифр и знака подчеркивания. Запрещено использовать следующие метки: @DATA, @CODE, @RESULT. Метка @DATA хранит во встроенном Ассемблере адрес сегмента данных, @CODE – сегмента кода и @RESULT – адрес смещения результата функции.
JE, JZ
Переход на метку по равенству двух операндов. Переход осуществляется, если по результатам предыдущей команды был установлен флаг ZF.
Пример:
CМP AX, BX
JZ @M1
Проверяем значения AX и BX путем вычитания из AX BX без сохранения результата. Если операнды совпадали, то осуществляем переход на метку М1.
JNE, JNZ
Переход по неравенству, если флаг ZF не равен нулю.
JC, JB, JNAE
Переход , если флаг CF = 1
JAE, JNC, JNE
Переход, если CF=0
JS
Переход, если старший разряд установлен в единицу (число отрицательное)
JNS
Переход, если флаг SF = 0 (положительное число).
Другие команды данного раздела изучаем самостоятельно.
7.6.11. Команды безусловного перехода.
CALL – вызвать программу. Один параметр – имя подпрограммы. При вызове подпрограммы она может быть вызвана как по длинному адресу, так и по короткому. Вызов определяется объявлением подпрограммы. При ближнем вызове содержимое регистра SP уменьшается на содержимое регистра IP. Регистр IP запоминается в стеке. В регистр IP загружается адрес подпрограммы. При дальнем вызове в сегмент также запоминается регистр SP и в регистры SP и IP вносится новый адрес программы.
RET – возврат из подпрограммы. Параметров нет. Осуществляет действие, обратные команде CALL.
JMP – безусловный переход на метку. Один параметр – метка. Метка в программе записывается специальным образом: <имя метки>. При этом метка может быть как 1 в строке, так и перед командой ASM. Для успешной трансляции Assembler кода рекомендуется не ставить метку в пустой строке, в крайнем случае, писать команду NOP.
7.6.12. Команды циклов.
LOOP – Организовать цикл. Имеет один параметр – метка, на которую передается управление начала цикла (аналогично REPEAT – UNTIL с фиксированным количеством повторений), перед началом цикла в регистр CX должна быть занесена информация о количестве повторений. При каждом обращении к команде LOOP регистр CX уменьшается на один. Выход из цикла – когда CX =0.
Пример. Перенесем 10 байтный массив в 5 байтный массив из слов.
type
tm=array[1..10] of byte;
ts=array[1..5] of word;
var
m:tm;
s:ts;
pm,ps:pointer;
i:integer;
begin
for i:=1 to 10 do m[i]:=100-10*(i-1);
for i:=1 to 5 do s[i]:=0;
writeln;
for i:=1 to 5 do write(s[i]:6);
writeln;
pm:=@m;
ps:=@s;
ASM
PUSH ES
PUSH DS
LES DI, PM
LDS SI, PS
MOV CX,5
@CIK:
MOV AL,[ES:DI]
INC DI
MOV AH,[ES:DI]
MOV [DS:SI],AX
ADD SI,2
LOOP @CIK
POP DS
POP ES
END;
for i:=1 to 5 do write(s[i]:6);
writeln;
READLN;
END.
Другие команды данного раздела изучаем самостоятельно.
7.6.13. Команды обработки прерываний.
INT – вызвать прерывание. Один параметр - номер прерывания в виде константы. В процессе выполнения прерывания в стек заполняются регистры: ВS, IP, FLAGS. Перед выполнением прерывания анализируется флаг прерывания. Он должен быть равен 1. После выполнения команды флаг прерываний имеет значение 0, т.е. другие прерывания в данный момент запрещены. Флаг TF также имеет значение 0, т.е. запрещен пошаговый отладочный режим.
INTO – выполнить 4-ое прерывание (прерывания переполнения).
IRET, IRETD – возвратиться из прерывания. Употребляется только в программе обработчика прерывания – команда, обратная INT. Возвращает управление на команду, следующую за командой INT или INTO.
CLI – сбросить флаг прерывания. Параметров нет. Как правило, употребляется в программе-обработчике прерываний и запрещает обработку прерываний, кроме общих системных.
STI – разрешить обработку всех отложенных прерываний. Установить флаг прерывания в 1. Как правило, программа-обработчик прерывания начинается командой CLI, а заканчивается STI и IRET.
Пример.
Напишем процедуру установки пиксела, аналогичную примеру 2 пункта 5.5. Используем встроенный ассемблер и прерывание 10h. Пиксел устанавливаем для видеорежима 320х200 точек на 256 цветов.
Procedure my_pixel(x,y : word; Color : byte);
Begin
ASM
MOV AH,0Ch
MOV CX,X
MOV DX,Y
MOV AL,Color
INT 10h
END;
END;
7.6.14. Команды поддержки языков высокого уровня
Предназначены для защищённого режима и привилегий (не входят в встроенный ассемблер).
7.6.15. Разные команды.
NOP – нет операции. Команда позволяет выровнять программу на границу слова. Если длинна вашей программы на языке ASM не кратна слову, то в процессе выполнения программы могут происходить сбои. Операндов нет.
WAIT – ждать окончания работы мат. сопроцессора.
ESC – выполнить команду (передать данные мат. сопроцессору). Имеет 2 операнда:
1-ый – 6-битовая константа, определяющая команду мат. сопроцессора, 2-ой – данные, передаваемые мат. сопроцессору.
LOCK – запретить работу мат. сопроцессора. Операндов не имеет. Прерывает работу сопроцессора и передает управление следующей за ней команде.
BSWAP – переставить байты в обратном порядке. Имеет один операнд – dword.
7.7. Дополнительные атрибуты у подпрограмм на Turbo Pascal.
Описание пpоцедуpы или функции полностью состоящей из утверждений ассемблера должно содержать объявление "assembler". Компилятор не использует переменную результата функции, и ссылка на символ @Result является ошибкой для всех типов данных, кроме стpок. Компилятор автоматически генеpиpует коды входа и выхода из ассемблерных пpоцедуp. Функции, использующие директиву «assembler», должны возвращать результат в следующем виде: 8-битные данные - в pегистpе AL, 16-битные - в pегистpе АХ; 32-битные целые и указатели - в pегистpах DX и AX; 6-байтное действительное число - в pегистpах DX,BX и АХ; другие вещественные и целые числа в pегистpе стека ST(0) сопpоцессоpа 8087 /4/.
Реализуем пример программы из пункта 7.6.12 в виде процедуры реализованной на языке встроенного ассемблера.
type
tm=array[1..10] of byte;
ts=array[1..5] of word;
procedure conv(var s:ts; m:tm);assembler;
ASM
PUSH ES
PUSH DS
LES DI,[M]
LDS SI,[S]
MOV CX,5
@CIK:
MOV AL,[ES:DI]
INC DI
MOV AH,[ES:DI]
MOV [DS:SI],AX
ADD SI,2
LOOP @CIK
POP DS
POP ES
END;
var
m:tm;
s:ts;
i:integer;
begin
for i:=1 to 10 do m[i]:=100-10*(i-1);
for i:=1 to 5 do s[i]:=0;
writeln;
for i:=1 to 5 do write(s[i]:6);
writeln;
conv(s,m);
for i:=1 to 5 do write(s[i]:6);
writeln;
READLN;
END.
В TURBO PASCAL возможно использование подпрограмм, написанных на других языках программирования или хранящих внутри себя файловые ресурсы. Существует единственное ограничение – длина 1 подпрограммы, хранящей ресурс или написанной на другом языке программирования, не должна превышать 1 стр. Существует 2 атрибута, определяющих тип подпрограммы. Это атрибут подпрограмма или ресурс, оттранслированные в другом языке программирования, и атрибут Assembler – подпрограмма, написанная на встроенном языке ASM’а. В программу на ТР можно вставить подпрограмму, написанную на языка С++ или Turbo Assembler. В этом случае подпрограмма в данном языке должна иметь атрибут Pascal . Программа должна быть оттранслирована в объектный код, т.е. до трансляции на языке Pascal в текущие директории должны храниться с расширением * OBJ.
Пример: включения функции MYFUN, возвращающей целое значение, по написанной на C++ или на Assembler.
FUNCTION MY FUN: Integer; External;
{$L My Fun. OBJ}
В первом объектном модуле могут храниться несколько подпрограмм. Для того чтобы включить в текст программы ресурс, используется утилита BINOBJ, которая имеет следующие параметры: BINOBJ<имя файла><имя объектного файла><имя процедуры>
Пример: BINOBJ MYDAT DAT MYDAT Proc Dat.
В результате выполнения этой утилиты текущей директории будет создан файл MYDAT.OBJ
Правила определения аналогичны предыдущему варианту. Обращение к первому байту области данных осуществляется через указатель и передвижение по области данных осуществляется с использованием указателей.
Пример: P.dat: =@Proc Dat;
