Очень трудно составить CISC-команду из отдельных полей
•
Очень утомительно вычислять адреса операндов и переходов
•
o Особенно в ходе отладки и разработки, когда надо вносить изменения в программу и многократно пересчитывать адреса Нужно заранее знать, по какому адресу в памяти компьютера • будут размещены o сама программа o библиотеки подпрограмм и другие модули Ассемблер. Основная идея Писать программу на языке, удобном для понимания человеком 1.
Переводить ее на машинный язык специальной программой – 2.
АССЕМБЛЕРОМ
Программа на языке ассемблера Трансляция Перевод осуществляет
АССЕМБЛЕР
Машинный код Фазы подготовки программы к исполнению Трансляция Компоновка Загрузка Программа Различные Исполняемый переводится с объектные модуль языка модули и загружается в программиро- библиотеки память и вания и объединяются в управление создается исполняемый передается на объектный модуль точку входа в модуль программу Перекрестные ссылки и сегменты Реальное приложение состоит из многих частей (модулей), • которые независимо транслируются, а потом объединяются Обычно каждый модуль состоит из разных сегментов • Сегменты из разных модулей с одинаковыми именами o объединяются Компиляторы с языков высокого уровня сами разбивают o программу на сегменты и присваивают им некоторые имена Язык ассемблера позволяет разбивать программу на сегменты o явно и присваивать сегментам любые имена Модули содержат подпрограммы, которые вызываются из • других модулей и данные, к которым другие модули обращаются Адреса этих подпрограмм и данных должны быть «видны» из o других модулей и называются перекрестными ссылками Шаг 1. Трансляция Ассемблер преобразует исходный текст программы в • машинный код Ассемблер формирует таблицу перекресных сылок, в которой • помечает те места в коде, куда нужно будет записать адреса внешних ссылок, когда они станут известны. Там же публикуются адреса собственных глобальных функций и глобальных переменных В зависимости от конкретного языка программирования и режима ассемблер формирует таблицу сегментов, в которой помечает сегменты кода и сегменты данных Машинный код, таблица перекрестных ссылок и таблица сегментов образуют объектный модуль (расширение.obj) Компоновщик (linker) объединяет объектные модули и библиотеки в исполняемый модуль (расширение.exe) При этом одноименные сегменты объектных модулей объединяются в единое целое Используя информацию из таблиц перекрестных ссылок компоновщик вносит исправления в машинный код объектных файлов.
Компоновщик не знает, в какое место памяти будет загружена программа, поэтому составляет таблицу перемещений, в которой помечает те места машинного кода, к которым нужно будет прибавить адрес загрузки Загрузчик загружает в память исполняемый модуль и прибавляет адрес загрузки к местам машинного кода, помеченным в таблице перемещений После этого он передает управление на точку входа программы В современных системах процесс разработки и исполнения организован более сложно, но пролетарская суть его именно такова Интегрированная среда разработки Исходный текст программы Prog1.cpp Компилятор Компилятор Список исходных файлов проекта Подробное описание синтаксиса содержится в многочисленной литературе o В том числе и в методических указаниях к лабораторной работе №1 «Изучение базовой среды Intel ® 64 и средств автоматизации разработки»
В данной презентации дается только неформальный обзор некоторых элементов В дальнейшем мы будем пользоваться синтаксисом, принятым корпорациями Microsoft и Intel o Существует синтаксис, введенный корпорацией AT&T, который широко используется GNU-сообществом. С точки зрения нашего курса разницы нет [name] TYPE initializer [,initializer…] [name] – идентификатор. Последовательность букв и цифр, начинающаяся с буквы В качестве букв могут использоваться буквы латинского алфавита и TYPE – тип зарезервированной области памяти initializer – выражение, используемое для присвоения области памяти начального значения Состоят из необязательного знака, числа и Целочисленные выражения Состоят из констант и знаков операций Вещественные константы Записываются в десятичном виде. Состоят целой и дробной части, разделенных точкой. + или - Унарные плюс или минус Дополнительно могут указываться знак и Символьные константы символ, заключенный в одинарные или двойные кавычки. Ассемблер заменяет этот символ на число в соответствии с кодовой таблицей ASCII Аналогично символьным, но допускает указание нескольких символов, заключенных в кавычки [label:][prefix] operation [operand(s))] [; comment] Operation - каждой команде процессора и элементу базовой среды исполнения соответствует мнемоника Label - Метка по синтаксису и по значению эквивалентна идентификатору Operand(s) - Формат и количество операндов зависят от команды o Синтаксис операндов зависит от способа адресации Comment - Комментарии являются необязательными с синтаксической точки зрения, но обязательными с культурологической ; Некоторые уже известные команды (пример) mov rax, 7*8 ; Загрузить в регистр eax число 56 (38h) mov rbx, var1 ; Загрузить в регистр rbx учетверенное слово из ячейки с sub rax, rbx ; Вычесть из rax (38h) rbx (var1) add rdx, [rbp+rsi*4+8] ; Прибавить к rdx содержимое ячейки, адрес При вычислении адреса операнда можно использовать Displacement (смещение) – ;
8-, 16-, 32- или 64разрядная константа mov rax, Variable ; Displacement величина, находящаяся в mov rax, [esp+esi] ; Base + Index Index (индекс) – величина, ; Disp+Base+Index*Scale находящаяся в регистре общего назначения Scale Factor (масштаб) – которую умножается Директивы языка являются указаниями ассемблеру, влияющими на процесс компиляции Некоторые директивы (необходимые в дальнейшем) Директива Описание name PROC Помечает адрес процедуры для публикации в name ENDP Конец процедуры.MODEL FLAT Указывает компилятору на размещение всей программы в едином сегменте (для 32-разрядного.CODE Указывает на начало сегмента кода.DATA Указывает на начало сегмента данных END Указывает на конец текста программы Мир директив очень богат и описан в руководстве к соответствующему компилятору
Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.