Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО.doc
Скачиваний:
54
Добавлен:
12.03.2015
Размер:
605 Кб
Скачать
☆

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;