Структура программы на ассемблере
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы. Предложения ассемблера бывают четырех типов: · команды или инструкции, представляющие собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора; · макрокоманды — оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями; · директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении; · строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Синтаксис ассемблера Предложения, составляющие программу, могут представлять собой синтаксическую конструкцию, соответствующую команде, макрокоманде, директиве или комментарию. Для того чтобы транслятор ассемблера мог распознать их, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание синтаксиса языка наподобие правил грамматики. Наиболее распространенные способы подобного описания языка программирования — синтаксические диаграммы и расширенные формы Бэкуса—Наура. Для практического использования более удобны синтаксические диаграммы. К примеру, синтаксис предложений ассемблера можно описать с помощью синтаксических диаграмм, показанных на следующих рисунках. Рис. 5. Формат предложения ассемблера Рис. 6. Формат директив Рис. 7. Формат команд и макрокоманд На этих рисунках: · имя метки — идентификатор, значением которого является адрес первого байта того предложения исходного текста программы, которое он обозначает; · имя — идентификатор, отличающий данную директиву от других одноименных директив. В результате обработки ассемблером определенной директивы этому имени могут быть присвоены определенные характеристики; · код операции (КОП) и директива — это мнемонические обозначения соответствующей машинной команды, макрокоманды или директивы транслятора; · операнды — части команды, макрокоманды или директивы ассемблера, обозначающие объекты, над которыми производятся действия. Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов. Как использовать синтаксические диаграммы? Очень просто: для этого нужно всего лишь найти и затем пройти путь от входа диаграммы (слева) к ее выходу (направо). Если такой путь существует, то предложение или конструкция синтаксически правильны. Если такого пути нет, значит эту конструкцию компилятор не примет. При работе с синтаксическими диаграммами обратим внимание на направление обхода, указываемое стрелками, так как среди путей могут быть и такие, по которым можно идти справа налево. По сути, синтаксические диаграммы отражают логику работы транслятора при разборе входных предложений программы. Допустимыми символами при написании текста программ являются: 1. все латинские буквы: A—Z, a—z. При этом заглавные и строчные буквы считаются эквивалентными; 2. цифры от 0 до 9; 3. знаки ?, @, $, _, &; 4. разделители , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^. Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора. Лексемами являются: · идентификаторы — последовательности допустимых символов, использующиеся для обозначения таких объектов программы, как коды операций, имена переменных и названия меток. Правило записи идентификаторов заключается в следующем: идентификатор может состоять из одного или нескольких символов. В качестве символов можно использовать буквы латинского алфавита, цифры и некоторые специальные знаки — _, ?, $, @. Идентификатор не может начинаться символом цифры. Длина идентификатора может быть до 255 символов, хотя транслятор воспринимает лишь первые 32, а остальные игнорирует. Регулировать длину возможных идентификаторов можно с использованием опции командной строки mv. Кроме этого существует возможность указать транслятору на то, чтобы он различал прописные и строчные буквы либо игнорировал их различие (что и делается по умолчанию).
Команды ассемблера. Команды ассемблера раскрывают возможность передавать компьютеру свои требования, механизм передачи управления в программе (циклы и переходы) для логических сравнений и программной организации. Однако, программируемые задачи редко бывают так просты. Большинство программ содержат ряд циклов, в которых несколько команд повторяются до достижения определенного требования, и различные проверки, определяющие, какие из нескольких действий следует выполнять. Некоторые команды могут передавать управление, изменяя нормальную последовательность шагов непосредственной модификацией значения смещения в командном указателе. Как говорилось ранее, существуют различные команды для различных процессоров, мы же будем рассматривать ряд некоторых команд для процессоров 80186, 80286 и 80386. 1. Для описания состояния флагов после выполнения некоторой команды будем использовать выборку из таблицы, отражающей структуру регистра флагов eflags:
2. В нижней строке этой таблицы приводятся значения флагов после выполнения команды. При этом используются следующие обозначения: o 1 — после выполнения команды флаг устанавливается (равен 1); o 0 — после выполнения команды флаг сбрасывается (равен 0); o r — значение флага зависит от результата работы команды; o ? — после выполнения команды флаг не определен; o пробел — после выполнения команды флаг не изменяется; 3. Для представления операндов в синтаксических диаграммах используются следующие обозначения: o r8, r16, r32 — операнд в одном из регистров размером байт, слово или двойное слово; o m8, m16, m32, m48 — операнд в памяти размером байт, слово, двойное слово или 48 бит; o i8, i16, i32 — непосредственный операнд размером байт, слово или двойное слово; o a8, a16, a32 — относительный адрес (смещение) в сегменте кода. Команды (в алфавитном порядке): *Данные команды описаны подробно. ADD (ADDition) Сложение
Назначение: сложение двух операндов источник и приемник размерностью байт, слово или двойное слово. Алгоритм работы: · сложить операнды источник и приемник; · записать результат сложения в приемник; · установить флаги. Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д (три формата): Регистр плюс регистр или память: |000000dw|modregr/rm| Регистр AX (AL) плюс непосредственное значение: |0000010w|--data--|data, если w=1| Регистр или память плюс непосредственное значение: |100000sw|mod000r/m|--data--|data, если BW=01| CALL (CALL) Вызов процедуры или задачи
Назначение: · передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата; · переключение задач. Алгоритм работы: · метка ближняя — в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке; · метка дальняя — в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке; · r16, 32 или m16, 32 — определяют регистр или ячейку памяти, содержащие смещения в текущем сегменте команд, куда передается управление. При передаче управления в стек заносится содержимое указателя команд eip/ip; · указатель на память — определяет ячейку памяти, содержащую 4 или 6-байтный указатель на вызываемую процедуру. Структура такого указателя 2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима работы микропроцессора: Состояние флагов после выполнения команды (кроме переключения задачи):
При переключении задачи значения флажков изменяются в соответствии с информацией о регистре eflags в сегменте состояния TSS задачи, на которую производится переключение. О б ъ е к т н ы й к о д (четыре формата): Прямая адресация в сегменте: |11101000|disp-low|diep-high| Косвенная адресация в сегменте: |11111111|mod010r/m| Косвенная адресация между сегментами: |11111111|mod011r/m| Прямая адресация между сегментами: |10011010|offset-low|offset-high|seg-low|seg-high| CMP (CoMPare operands) Сравнение операндов
Назначение: сравнение двух операндов. Алгоритм работы: · выполнить вычитание (операнд1-операнд2); · в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать). Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д (три формата): Регистр или память с регистром: |001110dw|modregr/m| Непосредственное значение с регистром AX (AL): |0011110w|--data--|data, если w=1| Непосредственное значение с регистром или памятью: |100000sw|mod111r/m|--data--|data, если sw=0| DEC (DECrement operand by 1) Уменьшение операнда на единицу
Назначение: уменьшение значения операнда в памяти или регистре на 1. Алгоритм работы:
Применение: О б ъ е к т н ы й к о д (два формата): Регистр: |01001reg| Регистр или память: |1111111w|mod001r/m|
DIV (DIVide unsigned) Деление беззнаковое
Назначение: выполнение операции деления двух двоичных беззнаковых значений. Алгоритм работы: · если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah; · если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx; · если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx. Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д: |1111011w|mod110r/m| INT (INTerrupt) Вызов подпрограммы обслуживания прерывания
Назначение: вызов подпрограммы обслуживания прерывания с номером прерывания, заданным операндом команды. Алгоритм работы: · записать в стек регистр флагов eflags/flags и адрес возврата. При записи адреса возврата вначале записывается содержимое сегментного регистра cs, затем содержимое указателя команд eip/ip; · сбросить в ноль флаги if и tf; · передать управление на программу обработки прерывания с указанным номером. Механизм передачи управления зависит от режима работы микропроцессора. Состояние флагов после выполнения команды:
Применение: · int 3 — имеет свой индивидуальный код операции 0cch и занимает один байт. Это обстоятельство делает ее очень удобной для использования в различных программных отладчиках для установки точек прерывания путем подмены первого байта любой команды. Микропроцессор, встречая в последовательности команд команду с кодом операции 0cch, вызывает программу обработки прерывания с номером вектора 3, которая служит для связи с программным отладчиком. · Вторая форма команды занимает два байта, имеет код операции 0cdh и позволяет инициировать вызов подпрограммы обработки прерывания с номером вектора в диапазоне 0–255. Особенности передачи управления, как было отмечено, зависят от режима работы микропроцессора. О б ъ е к т н ы й к о д (два формата): Регистр: |01000reg| Регистр или память: |1111111w|mod000r/m| JCC (Jump if condition) (Jump if CX=Zero/ Jump if ECX=Zero) Переход, если выполнено условие Переход, если CX/ECX равен нулю
Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.
· если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом; · если проверяемое условие ложно, то передать управление следующей команде. Алгоритм работы команды jcxz/jecxz: · если проверяемое условие истинно, то есть содержимое ecx/cx равно 0, то перейти к ячейке, обозначенной операндом метка; · если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0, то передать управление следующей за jcxz/jecxz команде программы. Состояние флагов после выполнения команды:
Применение (кроме jcxz/jecxz):
Логические условия "больше" и "меньше" относятся к сравнениям целочисленных значений со знаком, а "выше и "ниже" — к сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у многих команд можно заметить одинаковые значения флагов для перехода. Это объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое состояние флагов. В этом случае с целью удобства ассемблер допускает несколько различных мнемонических обозначений одной и той же машинной команды условного перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это одна и та же машинная команда. Изначально в микропроцессоре i8086 команды условного перехода могли осуществлять только короткие переходы в пределах -128...+127 байт, считая от следующей команды. Начиная с микропроцессора i386, эти команды уже могли выполнять любые переходы в пределах текущего сегмента команд. Это стало возможным за счет введения в систему команд микропроцессора дополнительных машинных команд. Для реализации межсегментных переходов необходимо комбинировать команды условного перехода и команду безусловного перехода jmp. При этом можно воспользоваться тем, что практически все команды условного перехода парные, то есть имеют команды, проверяющие обратные условия.
Команду jcxz/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128...+127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой. JMP (JuMP) Переход безусловный
Назначение: используется в программе для организации безусловного перехода как внутри текущего сегмента команд, так и за его пределы. При определенных условиях в защищенном режиме работы команда jmp может использоваться для переключения задач. Алгоритм работы: · если операнд в команде jmp — метка в текущем сегменте команд (a8, 16, 32), то ассемблер формирует машинную команду, операнд которой является значением со знаком, являющимся смещением перехода относительно следующей за jmp команды. При этом виде перехода изменяется только регистр eip/ip; · если операнд в команде jmp — символический идентификатор ячейки памяти (m16, 32, 48), то ассемблер предполагает, что в ней находится адрес, по которому необходимо передать управление. Этот адрес может быть трех видов: o значением абсолютного смещения метки перехода относительно начала сегмента кода. Размер этого смещения может быть 16 или 32 бит в зависимости от режима адресации; o дальним указателем на метку перехода в реальном и защищенном режимах, содержащим два компонента адреса — сегментный и смещение. Размеры этих компонентов также зависят от установленного режима адресации (use16 или use32). Если текущим режимом является use16, то адрес сегмента и смещение занимают по 16 бит, причем смещение располагается в младшем слове двойного слова, отводимого под этот полный адрес метки перехода. Если текущим режимом является use32, то адрес сегмента и смещение занимают, соответственно, 16 и 32 бит, — в младшем двойном слове находится смещение, в старшем — адрес сегмента; o адресом в одном из 16 или 32-разрядных регистров — этот адрес представляет собой абсолютное смещение метки, на которую необходимо передать управление, относительно начала сегмента команд. Состояние флагов после выполнения команды (за исключением случая переключения задач):
Применение: О б ъ е к т н ы й к о д (пять форматов): Прямой переход внутри сегмента: |11101001|disp-low|disp-high| Прямой переход внутри сегмента (короткий): |11101011|--disp--| Косвенный переход внутри сегмента: |11111111|mod100r/m| Косвенный межсегментный переход: |11111111|mod101r/m| Прямой межсегментный переход: |11101010|offset-low|offset-high|seg-low|seg-high| LOOP (LOOP control by register cx) Управление циклом по cx
Назначение: организация цикла со счетчиком в регистре cx. Алгоритм работы: · выполнить декремент содержимого регистра ecx/cx; · анализ регистра ecx/cx: o если ecx/cx=0, передать управление следующей за loop команде; o если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loop. Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д: у11100010у--disp—у MOV (MOVe operand) Пересылка операнда(1- применение)
Назначение: пересылка данных между регистрами или регистрами и памятью.
Применение: · направление пересылки в команде mov всегда справа налево, то есть из второго операнда в первый; · значение второго операнда не изменяется; · оба операнда не могут быть из памяти (при необходимости можно использовать цепочечную команду movs); · лишь один из операндов может быть сегментным регистром; · желательно использовать в качестве одного из операндов регистр al/ax/eax, так как в этом случае TASM генерирует более быструю форму команды mov. О б ъ е к т н ы й к о д (семь форматов): Регистр/память в/из регистр: |100010dw|modregr/m| Непосредственное значение в регистр/память: |1100011w|mod000r/m|--data--|data если w=1| Непосредственное значение в регистр: |1011wreg|--data--|data если w=1| Память в регистр AX (AL): |1010000w|addr-low|addr-high| Регистр AX (AL) в память: |1010001w|addr-low|addr-high| Регистр/память в сегментный регистр: |10001110|mod0sgr/m| (sg - сегментный регистр) Сегментный регистр в регистр/память: |10001100|mod0sgr/m| (sg - сегментный регистр) MOV (MOVe operand to/from system registers) Пересылка операнда в (или из них) системные регистры (2-применение)
Назначение: пересылка данных между регистрами или регистрами и памятью. Алгоритм работы:
Применение:
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (532)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |