Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


ВСТРОЕННЫЙ В TURBO PASCAL ASSEMBLER



 

7.1. Общие положения

 

Язык Ассемблера предназначен для проектирования системных программ и в настоящее время используется для проектирования части программы или подпрограмм для придания им следующих свойств:

минимизация исполнительного кода

убыстрения процесса выполнения

осуществление связи с периферийными устройствами в режиме реального времени

неявные преобразования между данными

 

При проектировании программы с использованием Ассемблера следует помнить об ограничениях:

Язык Ассемблера поддерживает тот или иной центральный процессор (встроенный в Turbo Pascal Ассемблер поддерживает только команды процессора 80286).

В отличии от языков высокого уровня, не существует поддержки преобразования данных.

Не существует поддержки отмены содержимого регистров центрального процессора (в основном, регистров флагов).

Отдельные компиляторы Ассемблера, начиная с начала 90-х годов, не развиваются, и поэтому максимальный тип процессора, на котором может работать программа, откомпилированная в Borland, ограничен процессором 486.

В зависимости от объема исполняемой программы, подпрограммы могут быть короткие (объем меньше одной страницы) и длинные, а также в зависимости от языка высокого уровня, в котором они применяются, подпрограммы могут иметь атрибут Pascal и все другие (такие подпрограммы называются подпрограммами для языка С).

Код Ассемблера в программе на ТР начинается с утверждения asm и заканчивается end ;Такой код доступен только в ТР 6 и выше.

Каждая команда в Ассемблере записывается в отдельную строку, а после нее через пробел идут операнды, участвующие в команде. Если таких операндов несколько, то они отделяются друг от друга запятой.

В качестве операнда может участвовать регистр центрального процессора, переменная ТР, константа или выражение. При этом правила применения зависят непосредственно от команды.

 

Режимы адресации в Ассемблере

 

В Ассемблере существует три вида адресации:

непосредственная адресация

косвенная адресация

индексно-косвенная

 

Непосредственная адресация аналогична оператору присваивания; косвенная – работе с указателем; индексно-косвенная – работе с указателем и некоторым смещением в оперативной памяти.

mov ax , bx Непосредственная адресация. Пересылает содержимое регистра bx в ах. В Ассемблере, как правило, первый операнд участвует в операции и в нее записывается результат.

mov ax ,[ bx ] Косвенная адресация. Пересылает в регистр ах содержимое ячейки по адресу bx.

mov ax ,[ es : bx +12] Индексно-косвенная адресация. Пересылает в регистр ах содержимое ячейки по адресу: сегмент адреса находится в es, смещение – в bx и прибавление относительно смещения 12.

Когда между операндами в адресации ставится двоеточие, то адрес воспринимается в пределах всей оперативной памяти. Когда между операндами стоит знак “+”, то значение второго операнда должно находится в пределах от –127 до 128.

 

7.3. Соответствие ординарных типов данных между языками программирования

 

Тuгbо Раscal Тuгbо Аssembler С++
Bуtе Byte unsigned сhаг
Сhаг Byte Char
Shortint Byte unsigned сhаг
bоо1еаn Byte Bool
Integer Word Int
Word Word unsigned int
set of Word Enum
Нет Word unsigned сhort
Нет Word Short
Longint Dword Long
Нет Dword unsigned long
Pointer Word Пеаг*
Pointer Dword fаг*
Single Dword Float
Real Fword Нет
Double Qword Нет
Extended tbyte long double
String, file [of] Нет Нет
Pchar нет сhаг*

Выражения для управления памятью

 

Пусть переменная big хранит шестнадцатеричное значение 12345678 и имеет длину 4 байта.

Команда Ассемблера                              Результат операции

mov ax,word[big]                                       В регистре ax – содержимое 5678

mov al,byte[big]                                            В аl – значение 78

mov ax,word[big+2]                                   В ax – 1234

mov al,byte[big+3]                                     В al – 12

 

Выражения в Ассемблере

 

Префикс (операция) Описание
: Вычисление адреса, первое подвыпажение – сегмент адреса, второе – смещение адреса
[…] Косвенная адресация, указание на адрес. Выражение в скобках определяет адрес
+ - * / Арифметические операции, причем умножение и деление здесь нацело
& Обозначает переменную ТР. Например, если в выражении &CH, то будет использоваться не регистр СН, а переменная ТР с этим именем
word Возврат результата выражения, укороченного словом
byte Возврат результата выражения, укороченного байтом
offset Смещение адреса(возврат)
seg Возврат сегмента адреса
PTR Адрес ячейки памяти, аналогично […]
mod Остаток от деления
shl,shr Сдвиг влево, вправо
not Побитовое отрицание
and Логическое умножение
or Логическое сложение
xor Исключающее “или”
high Возвращает старшие 8 бит выражения в слово, следующее за операндом
type Возвращает размер в байтах получающегося выражения. Если вместо выражения используется константа, то возврат равен нулю
low Возвращает младшие 8 бит выражения в слово, следующее за операндом

 

Пример команды, двигающей циклический регистр АХ вправо на три разряда и записывающей результат в BX:

mov bx,ax shr 3

 

Допускается любое количество скобок (())()((())) в выражении.

Скобки определяют порядок вычисления выражения. По умолчанию операции идут в следующем порядке:

byte, word, low, high

*, /

+, -, логические операции, сдвиг, offset, seg, PTR

type

 

Команды Ассемблера

 

Команды общего назначения

MOV – переслать операнд2 в операнд1. После выполнения – содержимое флагов не меняется и перед выполнением – не анализируется.

 

MOVS – переслать операнд2 в операнд1, но теперь первый и второй операнды должны являться ячейками памяти. Т.е. должна использоваться косвенная адресация.

 

Пример, movs [es:di],[es:bx]

Такая команда используется в пересылке строк. Под строкой в Ассемблере понимают любой массив, при этом величина одного элемента массива может быть длиной до 12 байт.

PUSH – имеет один операнд. Записывает операнд в стек.

При этом значение регистра SP увеличивается на 1. Операнд записывается по адресу SS : SP

POP – восстановить операнд из стека. Обратная команда PUSH. Значение SP уменьшается на 1. Операнд берется по адресу SS : SP.

PUSHA – операндов не имеет. Записывает регистры в стек. Запись идет в следующих регистрах: AX, BX, CX, DX, SP, BP, SI, DI. Значения регистра SP повышается на 8. Данная команда автоматически добавляется в качестве 1-ой к коду, написанного на языке встроенного ассемблера.

PUSHAD – запись в стек 32-х разрядных регистров. Во встроенном ассемблере нет. Значение регистра SP увеличивается на 32.

POPA – восстановить содержимое регистров из стека. Обратная команде PUSHA. 32-х разрядная команда – POPAD.

XCHG – имеет два операнда. Осуществляет взаимный обмен информацией двух операндов.

 

7.6.2. Команды преобразования форматов.

 

Единственная группа команд ассемблера допускающая использование операндов разной длины . Подробное описание можно найти в /2,3/.

 

Команды ввода вывода

 

Используются для синхронного обмена информации из портов. Рекомендую в программах употреблять предопределенные массивы.

 

Адресные команды

 

LEA – имеет два операнда. Вычисляет адрес шестнадцатиразрядного второго операнда и заносит его в первый операнд. Адрес вычисляется как относительный внутри модуля.

LDS – имеет два операнда. Вычисляет абсолютный адрес операнда 2. При этом сегмент адреса после выполнения команды находится в регистре DS, а смещение адреса – в операнде 1. В командах вычисления адреса употребляется не абсолютные переменные, а их адреса. Если мы пишем подпрограмму на языке встроенного ассемблера и вычисляем адрес передаваемого параметра, то в этом случае префиксы вычисления адреса употреблять не следует.

Procedure M1 (var M:String); assembler ;

…..

ASM

….

LDS BX, M

…..

END;

LES – аналогична команде LDS, но сегмент адреса загружается в регистр ES.

LFS – аналогично предыдущим двум. Сегмент адреса загружается в регистр FS.

LGS – сегмент адреса загружается в регистр GS.

LSS – сегмент адреса загружается в регистр SS.

Пример.

Напишем процедуру установки пиксела, аналогичную примеру 2 пункта 5.5. Используем встроенный ассемблер и непосредственное обращение к видеопамяти. Пиксел устанавливаем для видеорежима 320х200 точек на 256 цветов.

Procedure my_pixel(x,y : word; Color : byte);

Begin

ASM

PUSH ES

MOV AX,0A000h

MOV ES,AX

MOV AL,Color

MOV [ES:Y*320+X],AL

POP ES

END;

END;

 

 

7.6.5. Команды работы с регистром флагов.

 

LAHF – команда без операндов. Загружается в регистр AH.

SAHF – команда обратная предыдущей. Из регистра AH загружаются соответствующие биты в регистр флагов.

PUSHF – сохраняет флаг регистр в стек. Регистр SP повышается на 1.

PUSHFD – сохранение 32-бит. Флагового регистра. SP увеличивается на 2.

POPF – восстановление флагового регистра из стека.

POPFD – 32-разрядный.

Другие команды смотрите по литературе/2,3/.

 

       7.6.6. Арифметические команды

 

Длина операндов должна быть одинаковой. После выполнения команд могут быть установлены флаги: F, S, OF, SF, ZF, AF, PF, SF.

ADD – имеет два операнда. Прибавляет операнд 2 к операнду 1 и результат записывает в 1.

 Пример: ADD BL, AL

INC – имеет один операнд. Увеличивает значение операнда на 1.

DEC – уменьшить на 1.

SUB - Вычитает операнд 2 из операнда 1 и результат записывает в 1.

CMP – сравнить два операнда. Аналогично команде SUB , но результат не записывается в первый операнд.

Другие команды данного раздела на самостоятельное изучение.

 

Строковые команды

 

Под строкой в ассемблере понимается массив. При этом длина символа может быть равна длине ординарного типа (см. таблицу преобразований типов для ассемблера). Изучаем самомстоятельно.

 

7.6.8. Логические команды.

 

Логические команды в Ассемблере выполняются побитово над байтом, словом или двойным словом. При этом длина операндов должна обязательно быть одинаковой.

Логическое умножение.

AND  Имеет 2 операнда. После выполнения команды изменяется содержимое флагов FS, FZ, FP.

Отрицание.

NOT Имеет 1 операнд. Необходимо помнить, что отрицание не эквивалентно смене знака.

Логическое сложение.

OR После выполнения команды изменяются флаги аналогично команде AND.

Исключающее «или»

XOR Аналогично предыдущим командам меняются флаги.

Логические команды работают быстрее пересылки, поэтому XOR AL, AL быстрее, чем MOV AL,0.

Произвести сравнение двух чисел


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 237; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.052 с.)
Главная | Случайная страница | Обратная связь