Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
ВСТРОЕННЫЙ В 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. Соответствие ординарных типов данных между языками программирования
Выражения для управления памятью
Пусть переменная 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
Выражения в Ассемблере
Пример команды, двигающей циклический регистр АХ вправо на три разряда и записывающей результат в 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; Нарушение авторского права страницы