Книга «Программирование на ассемблере на платформе x86-64. (+ 1 CD)» Аблязов Р З
-
Книги
- Художественная литература
- Нехудожественная литература
- Детская литература
- Литература на иностранных языках
- Путешествия. Хобби. Досуг
- Книги по искусству
-
Биографии.

Мемуары. Публицистика - Комиксы. Манга. Графические романы
- Журналы
- Печать по требованию
- Книги с автографом
- Книги в подарок
- «Москва» рекомендует
-
Авторы • Серии • Издательства • Жанр
-
Электронные книги
- Русская классика
- Детективы
- Экономика
- Журналы
- Пособия
- История
- Политика
- Биографии и мемуары
- Публицистика
-
Aудиокниги
- Электронные аудиокниги
- CD – диски
-
Коллекционные издания
- Зарубежная проза и поэзия
- Русская проза и поэзия
- Детская литература
- История
- Искусство
- Энциклопедии
-
Кулинария.
Виноделие
- Религия, теология
- Все тематики
-
Антикварные книги
- Детская литература
- Собрания сочинений
- Искусство
- История России до 1917 года
-
Художественная литература.
Зарубежная
- Художественная литература. Русская
- Все тематики
- Предварительный заказ
- Прием книг на комиссию
-
Подарки
- Книги в подарок
- Авторские работы
- Бизнес-подарки
- Литературные подарки
- Миниатюрные издания
- Подарки детям
- Подарочные ручки
- Открытки
- Календари
- Все тематики подарков
- Подарочные сертификаты
- Подарочные наборы
- Идеи подарков
-
Канцтовары
- Аксессуары делового человека
- Необычная канцелярия
- Бумажно-беловые принадлежности
- Письменные принадлежности
- Мелкоофисный товар
- Для художников
-
Услуги
- Бонусная программа
- Подарочные сертификаты
- Доставка по всему миру
- Корпоративное обслуживание
- Vip-обслуживание
- Услуги антикварно-букинистического отдела
- Подбор и оформление подарков
- Изготовление эксклюзивных изданий
- Формирование семейной библиотеки
Расширенный поиск
Аблязов Р.
З.
- Издательство:
- ДМК Пресс
- Год издания:
- 2011
- Место издания:
- Москва
- Язык текста:
- русский
- Тип обложки:
- Мягкая обложка
- Формат:
- 70х100 1/16
- Размеры в мм (ДхШхВ):
- 240×170
- Вес:
-
310 гр.
- Страниц:
- 304
- Тираж:
- 1000 экз.
- Код товара:
- 557932
- Артикул:
- 61820
- ISBN:
- 978-5-94074-676-8
- В продаже с:
-
08.
04.2011
Дополнительная информация
Аннотация к книге «Программирование на ассемблере на платформе x86-64. (+ 1 CD)» Аблязов Р. З.:
В данной книге речь идет о работе процессора в двух его основных режимах: защищенном режиме и 64-битном, который также называют long mode («длинный режим»). Также помимо изложения принципов и механизмов работы процессора в защищенном и 64-битном режимах, речь пойдет о программировании на ассемблере в операционных системах семейства Windows, как в 32-битных, так и 64-битных версиях. Рассматривается не только разработка обычных приложений для операционных систем Windows, но и разработка драйверов на ассемблере. При написании книги уделялось большое внимание именно практической составляющей, т.
е. изложение материала идет только по делу и только то, что необходимо знать любому системному и низко-уровневому программисту. Последний раздел книги посвящен принципам работы многопроцессорных систем, а также работе с расширенным программируемым контроллером прерываний (APIC).
На диске, прилагаемом к книге, находятся полные исходные коды примеров к книге, а также дополнительные программы и материалы.
Издание предназначено для системных и низкоуровневых программистов, а также для студентов и преподавателей технических специальностей высших и средне-специальных учебных заведений.
Читать дальше…
Программирование на ассемблере
Поделиться
Аблязов Руслан Зуфярович «Программирование на ассемблере на платформе x86-64» ДМК Пресс, 2011 год, ( PDF)
В книге «Программирование на ассемблере…» рассказывается о работе процессора в двух его основных режимах: защищенном режиме и 64-битном, который также называют long mode («длинный режим»).
Изложены, как принципы и механизмы работы процессора в защищенном и 64-битном режимах, так и основы программирования на ассемблере в операционных системах семейства Windows, как в 32-битных, так и 64-битных версиях. Изучается не только создание обычных приложений для операционных систем Windows, но и процесс разработки драйверов на ассемблере.
Автор акцентировал основное внимание на самых основных практических вопросах разработки, что необходимо знать каждому системному администратору и программисту низко-уровневых программ. Заключительный раздел книги расскажет о принципах работы многопроцессорных систем, а также работе с расширенным программируемым контроллером прерываний (APIC). Издание предназначено для системных и низкоуровневых программистов, рекомендовано студентам и преподавателям технических специальностей высших и средне-специальных учебных заведений. Исходники присутствуют.
Оглавление книги***Link
PDF (RU) pdf (ru)
key Vi49nY44pdNk7Snq453-FRM8AYYAN1jd7uHgtDyZt5Y
Содержание
Используемый компилятор 9
Глава 1.
Основы 11
1.1. Основные понятия 11
1.1.1. Что такое процессор 11
1.1.2. Небольшая предыстория 14
1.1.3. Процессоры х86-64 16
1.1.4. Регистры процессоров х86-64 18
1.1.5. Память 19
1.1.6. Работа с внешними устройствами 21
1.1.7. Резюме 21
1.2. Основы ассемблера 22
1.2.1. Немного о языке ассемблера 22
1.2.2. Регистр флагов 23
1.2.3. Команда MOV 24
1.2.4. Формат хранения данных в памяти 26
1.2.5. Команды SUB и ADD 27
1.2.6. Логические операции 27
1.2.7. Сдвиги 28
1.2.8. Работа с флагами процессора 30
1.2.9. Работа со стеком 30
1.2.10. Резюме 30
1.3. Метки, данные, переходы 31
1.3.1. Данные 31
1.3.2. Метки 32
1.3.3. Переходы 35
1.3.4. Безымянные метки 38
1.3.5. Работа с битами 39
1.3.6. Резюме 39
1.4. Изучаем ассемблер подробнее 39
1.4.1. Работа с памятью и стеком 40
1.4.2. Работа с числами на ассемблере 41
1.4.3. Умножение и деление 44
1.4.4. Порты ввода-вывода 46
1.
4.5. Циклы 46
1.4.6. Обработка блоков данных 47
1.4.7. Макросы 50
1.4.8. Структуры 52
1.4.9. Работа с MSR-регистрами 53
1.4.10. Команда CPUID 54
1.4.11. Команда UD 2 55
1.4.12. Включение файлов 55
1.4.13. Резюме 55
Глава 2 . Защищённый режим 56
2.1. Введение в защищённый режим 56
2.1.1. Уровни привилегий 56
2.1.2. Сегменты в защищённом режиме 58
2.1.3. Глобальная дескрипторная таблица 61
2.1.4. Практика 63
2.1.5. Резюме 70
2.2. Прерывания в защищённом режиме 71
2.2.2. Дескрипторы шлюзов 72
2.2.3. Исключения 74
2.2.4. Коды ошибок 76
2.2.5. Программные прерывания 77
2.2.6. Аппаратные прерывания 77
2.2.7. Обработчик прерывания 79
2.2.8. Практика 80
2.2.9. Резюме 85
2.3. Механизм трансляции адресов 85
2.3.1. Что это такое 85
2.3.2. Обычный режим трансляции адресов 87
2.3.3. Режим расширенной физической трансляции адресов 91
2.3.4. Обработчик страничного нарушения 94
2.
3.5. Флаг WP в регистре CR0 95
2.3.6. Практика 96
2.3.7. Резюме 102
2.4. Многозадачность 102
2.4.1. Общие сведения 102
2.4.2. Сегмент задачи (TSS 103
2.4.3. Дескриптор TSS 105
2.4.4. Локальная дескрипторная таблица 105
2.4.5. Регистр задачи (TR 106
2.4.6. Управление задачами 106
2.4.7. Шлюз задачи 109
2.4.8. Уровень привилегий ввода-вывода 109
2.4.9. Карта разрешения ввода-вывода 110
2.4.10. Включение многозадачности 110
2.4.11. Практическая реализация 111
2.4.12. Резюме 118
2.5. Механизмы защиты 119
2.5.1. Поля и флаги, используемые для защиты на уровне сегментов и страниц 119
2.5.2. Проверка лимитов сегментов 120
2.5.3. Проверки типов 120
2.5.4. Уровни привилегий 122
2.5.5. Проверка уровня привилегий при доступе к сегментам данных 123
2.5.6. Проверка уровней привилегий при межсегментной передаче управления 124
2.5.7. Шлюзы вызова 125
2.5.8. Переключение стека 128
2.5.9. Использование инструкций SYSENTER и SYSEXIT 129
2.
5.10. Практика 130
2.5.11. Резюме 133
Глава 3 . ПРОГРАММИРОВАНИЕ В WIN 32 134
3.1. Введение в Win32 134
3.1.1. Основные сведения 135
3.1.2. Память в Win32 135
3.1.3. Исполняемые компоненты Windows 136
3.1.4. Системные библиотеки и подсистемы 137
3.1.5. Модель вызова функций в Win32 138
3.1.6. Выполнение программ в Win32: общая картина 138
3.1.7. Практика 139
3.1.8. Резюме 147
3.2. Программирование в третьем кольце 148
3.2.1. Общий обзор 148
3.2.2. Работа с объектами 149
3.2.3. Работа с файлами 149
3.2.4. Обработка ошибок API-функций 152
3.2.5. Консольные программы 152
3.2.6. GUI-программы 153
3.2.7. Динамически подключаемые библиотеки 156
3.2.8. Обработка исключений в программе 159
3.2.9. Практика 162
3.2.10. Резюме 171
3.3. Программирование в нулевом кольце 171
3.3.1. Службы 172
3.3.2. Общий обзор 173
3.3.3. Driver Development Kit (DDK 174
3.3.4. Контекст потока и уровни запросов прерываний 175
3.
3.5. Пример простого драйвера 176
3.3.6. Строки в ядре Windows 179
3.3.7. Подсистема ввода-вывода 180
3.3.8. Практика 186
3.3.9. Резюме 201
Глава 4. LONG MODE 202
4.1. Введение в long mode 202
4.1.1. Общий обзор 202
4.1.2. Сегментация в long mode 204
4.1.3. Механизм трансляции страниц 205
4.1.4. Переход в long mode 205
4.1.5. Практика 206
4.1.6. Резюме 208
4.2. Работа с памятью в long m od e 208
4.2.1. Общий обзор 209
4.2.2. Страницы размером 4 Кб 209
4.2.3. Страницы размером 2 Мб 211
4.2.4. Страницы размером 1 Гб 212
4.2.5. Регистр CR3 213
4.2.6. Проверки защиты 214
4.2.7. Практика 214
4.2.8. Резюме 221
4.3. Прерывания в long m ode 221
4.3.1. Дескрипторы шлюзов 221
4.3.2. Таблица ЮТ 64-битный TSS и механизм 1ST 222
4.3.3. Вызов обработчика прерывания 223
4.3.4. Практика 224
4.3.5. Резюме 230
4.4. Защита и многозадачность 230
4.4.1. Сегменты 231
4.4.
2. Шлюзы вызова 231
4.4.3. Инструкции SYSCALL и SYS RET 232
4.4.4. Многозадачность 233
4.4.5. Практика 235
4.4.6. Резюме 238
Глава 5 . ПРОГРАММИРОВАНИЕ В WIN 64 239
5.1. Введение в Win64 239
5.1.1. Преимущества и недостатки 239
5.1.2. Память в Win64 240
5.1.3. Модель вызова 240
5.1.4. Режим совместимости 242
5.1.5. Win64 API и системные библиотеки 242
5.1.6. Практика 243
5.1.7. Резюме 244
5.2. Программирование в Win64 244
5.2.1. Изменения в типах данных 245
5.2.2. Выравнивание стека 245
5.2.3. GUI-приложения 246
5.2.4. Программирование драйверов 250
5.2.5. Отладка приложений в Win64 254
5.2.6. Резюме 254
Глава 6 . МНОГОПРОЦЕССОРНЫЕ СИСТЕМЫ 255
6.1. Работа с APIC 255
6.1.1. Общий обзор 255
6.1.2. Включение APIC 256
6.1.3. Local APIC ID 257
6.1.4. Локальная векторная таблица 257
6.1.5. Local APIC Timer 259
6.1.6. Обработка прерываний 261
6.
1.7. Работа с I/O APIC 263
6.1.8. Практика 266
6.1.9. Резюме 270
6.2. Межпроцессорное взаимодействие 270
6.2.1. Общий обзор 270
6.2.2. Межпроцессорные прерывания 271
6.2.3. Синхронизация доступа к данным 273
6.2.4. Инициализация многопроцессорной системы 275
6.2.5. Практика 276
6.2.6. Резюме 280
Приложение А. MSR-регистры 281
А. 1. Регистр IA32_EFER 281
А.2. Регистры, используемые командами SYSENTER/SYSEXIT 281
А.З. Регистры, используемые командами SYSCALL/SYSRET 282
А.4. Регистры APIC 282
А.5. Регистры для управления сегментами в long mode 283
А.6. Вспомогательные регистры 283
Приложение Б. Системные регистры 283
Б.1. Регистр CR0 283
Б.2. Регистры CR2 и CR3 285
Б.З. Регистр CR4 286
Б.4. Регистры GDTR и IDTR 287
Б.5. Регистры LDTR и TR 288
Б.6. Регистр флагов 288
Б.7. Регистр CR8 290
Приложение В. Системные команды 290
В.1. Работа с системными регистрами 290
В.
2. Системные команды 293
В.З. Работа с кэшем процессора 295
В.4. Дополнительные команды 295
Алфавитный указатель 297
Похожая литература
642
https://www.htbook.ru/kompjutery_i_seti/programmirovanie/programmirovanie_na_assemblereПрограммирование на ассемблереhttps://www.htbook.ru/wp-content/uploads/2015/06/assembler_platforma_x86-64.jpg
https://www.htbook.ru/wp-content/uploads/2015/06/assembler_platforma_x86-64.jpg
Программирование и БДассемблер,компьютерное железо,компьютеры,ПрограммированиеАссемблер для платформы x86-64.
Аблязов Руслан Зуфярович ‘Программирование на ассемблере на платформе x86-64’ ДМК Пресс, 2011 год, ( PDF)
В книге ‘Программирование на ассемблере.
..’ рассказывается о работе процессора в двух его основных режимах: защищенном режиме и 64-битном, который также называют long mode (‘длинный режим’). Изложены, как принципы и механизмы работы процессора…SomМихаил
Михайлов[email protected]Техническая литература
Поделиться
Assembler
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
справочник по языку ассемблера x86-64
Машинный код x86-64 является родным языком процессоров в большинстве настольных и портативные компьютеры. Язык ассемблера x86-64 представляет собой удобочитаемую версию этого Машинный код.
x86-64 имеет сотни инструкций и компилирует программы в наиболее эффективный машинный код требует хорошего понимания всех их — действительно, самый быстрый компилятор C для процессоров x86-64 разработан Интел! Однако мы сможем разработать вполне функциональный компилятор. используя только небольшое подмножество инструкций x86-64.
Это руководство по этому подмножеству x86-64 и библиотеке OCaml, которая у нас есть.
предназначен для создания инструкций x86-64.
язык ассемблера x86-64
Ассемблерные программы, созданные нашим компилятором, имеют следующий вид:
;; фронтматерия: глобальная и т.д.
вход:
;; инструкции
метка1:
;; больше инструкций
метка2:
;; больше инструкций
В начале файла находятся специальные директивы ассемблеру, говорящие ему
какие метки должны быть видны снаружи файла (пока только специальные запись метка). После этого каждая строка представляет собой либо метку , что указывает на
позиция в программе, на которую могут ссылаться другие строки, или инструкция ,
который на самом деле говорит процессору, что делать.
В этом классе ваш компилятор не будет напрямую генерировать ассемблерный код. Вместо этого вы будете
использовать библиотеку OCaml, разработанную сотрудниками курса. Эта библиотека обрабатывает некоторые
различия между операционными системами и особенности x86-64. Остальная часть
этот документ посвящен библиотеке.
Директивы
Основным интерфейсом нашей библиотеки OCaml является директива типа . Директива соответствует одной строке ассемблерного кода; мы создадим файл .s из
список этих директив. Директивы, таким образом, соответствуют непосредственно
передовые декларации, этикетки и инструкции.
Операнды
Многие директивы принимают один или несколько аргументов. Для большинства инструкций эти
аргументы являются экземплярами операнд тип. Операнд может быть любым из:
- Регистр A, записанный как
Reg <регистр>(например,Reg RaxилиReg Р8). - «Немедленное» числовое постоянное значение, записанное как
Imm. - Смещение в памяти, определяемое двумя дополнительными операндами. Например,
MemOffset(Reg Rsp, Reg Rax)относится к ячейке памяти по адресуrsp + rax.
Некоторые директивы — например, прыжки — получают 9 баллов.
0015 строка именующая метка вместо
операнд .
Ссылка на директиву
Эта таблица будет обновляться по мере продвижения урока и выполнения домашних заданий. дополнительные инструкции по сборке. Примечания к некоторым инструкциям приведены ниже, т.к. указано.
| Директива | Пример asm | Описание | Примечания |
|---|---|---|---|
Глобальная строка | Сообщает ассемблеру экспортировать метку | ||
глобальная запись | |||
Часть струны | раздел .текст | Записывает в сегмент сгенерированного двоичного файла | |
Этикетка строки | этикетка: | Маркирует место программы | |
DqLabel строки | Этикетка dq1 | Записывает адрес конкретной метки | DqLabel |
LeaLabel of (операнд * строка) | рак, [этикетка1] | Загружает адрес этикетки в регистр | LeaLabel |
Mov of (операнд * операнд) | мов ракс, [rsp + -8] | Перемещает данные между местоположениями | |
Сумма (операнд * операнд) | добавить р8, рсп | Добавляет свои аргументы, сохраняя результат в первом | |
Подмножество (операнд * операнд) | суппорт, 4 | Вычитает второй аргумент из первого, сохраняя результат в первом | |
Раздел операнда | Идив Р8 | Делит 128-битное целое число со знаком rdx:rax на его аргумент, сохраняя результат в rax | Дивизион и Мул |
Мул операнда | имул [rsp + -8] | Умножает rax на его аргумент, сохраняя результат в rdx:rax | Дивизион и Мул |
Cqo | кво | Знак расширяет rax в rdx | |
Шл из (операнд * операнд) | шл ракс,2 | Сдвигает первый аргумент влево на второй аргумент | |
Shr of (операнд * операнд) | ШР,3 | Сдвигает свой первый аргумент вправо на второй аргумент, дополняя нулями слева | |
Sar of (операнд * операнд) | сарракс,3 | Сдвигает первый аргумент вправо на второй аргумент, дополняя нулями или единицами для сохранения знака | Сар |
Cmp из (операнд * операнд) | смр р8, [рсп + -16] | Сравнивает два аргумента, устанавливая RFLAGS | |
И (операнд * операнд) | и ракс, р8 | Выполняет побитовое И своих аргументов, сохраняя результат в первом аргументе | |
Или (операнд * операнд) | или r8, 15 | Выполняет побитовое ИЛИ своих аргументов, сохраняя результат в своем первом аргументе | |
Setz операнда | набор | Устанавливает для своего однобайтового аргумента текущее значение ЗФ | Сетц и др.![]() |
Набор операндов | нач. | Устанавливает для своего однобайтового аргумента текущее значение (SF != OF) | Сетл |
Соединение строки | JMP этикетка1 | Переходит выполнение к заданной метке | |
Струна | этикетка1 | Переходит выполнение к данной метке, если ZF установлен | Прыжки |
Единица строки | jne label1 | Переходит выполнение к данной метке, если ZF не установлен | Прыжки |
Jl струны | этикетка1 | Переход к заданной метке, если SF != OF | Прыжки |
Jnl строки | JNL Этикетка1 | Переходит выполнение к данной метке, если SF == OF | Прыжки |
Джг веревки | JG этикетка1 | Переход к заданной метке, если SF == OF AND !ZF | Прыжки |
Цепь струны | JNG Этикетка1 | Переходит выполнение к данной метке, если SF != ИЛИ ZF | Прыжки |
ComputedJmp операнда | джмп ракс | Переход к месту в заданном операнде | |
Восстановленный | | Возвращает управление вызывающей функции | |
Комментарий строки | ;; полезный комментарий | Комментарий |
DqLabel
DqLabel "label1" записывает адрес данной метки в программу как данные ( dq — сокращение от «данные, четверное слово»).
Затем вы можете загрузить этот адрес
с инструкцией mov . Вы должны убедиться, что выполнение вашей программы
никогда не доходит до этой директивы — это просто данные, а не инструкция!
LeaLabel
LeaLabel (Reg Rax, "label1") загружает адрес данной метки в
регистр. Вы будете использовать это при выполнении вычисляемого прыжка или при попытке загрузить
данные с заданной метки (например, в сочетании с DqLabel ).
Разд. и Мл.
Div и Mul работают иначе, чем Add и Sub . Потому что умножение двух
64-битные числа часто переполняются, результат imul сохраняется в rdx:rax как 128-битный номер . Наш компилятор не обрабатывает переполнение, поэтому вам
не нужно беспокоиться об этом для умножения; однако idiv выполняет
обратная операция, деление rdx:rax своим аргументом. Если вы просто хотите
разделите rax , вам нужно знак-удлинить rax на rdx с помощью cqo инструкция.
Это устанавливает rdx на все 0, если rax положительное или нулевое и все 1 с
если rax отрицательно.
Наконец, ни Div , ни Mul не могут принимать непосредственное значение в качестве своего значения.
аргумент — это должен быть либо регистр, либо смещение памяти.
Сар
Sar выполняет арифметический сдвиг вправо, который сохраняет знак своего аргумента
при смещении вправо.
Сец
Setz(Reg Rax) устанавливает последний байт rax в 0b00000001 , если установлен ZF и
до 0b00000000 иначе. В сборке на самом деле выглядит как setz al , т.к. al — это имя последнего байта rax . Библиотека сборки OCaml занимает
заботиться об этом для вас.
Сетл
setl — сокращение от «установить, если меньше». Так же, как Setz устанавливает свой аргумент равным 1, если
последняя инструкция cmp сравнивает равные аргументы, setl устанавливает свой аргумент равным 1
если в последней инструкции cmp первый операнд был меньше
второй.
Так
смр р8, 40 установить аль
установит последний байт rax в 1, если r8 меньше 40 .
Это работает, потому что cmp arg1, arg2 устанавливает несколько флагов:
-
ZFеслиarg1 - arg2 = 0 -
SF, еслиarg1 - arg2 < 0 -
ИЗ, еслиarg1 - arg2переполняется
setl переходит, если SF != OF , что означает, что значение со знаком arg1 меньше
чем значение со знаком arg2 .
В большинстве случаев вам не нужно беспокоиться о конкретных флагах. Просто сделайте cmp и используйте инструкцию set (или j , см. ниже) с командой
правильная мнемоника.
Условные переходы
je и друзья переходят к указанной метке, если их условие истинно.
мнемоники работают, как описано выше.
Например:
смр р8, 40 jng лейбл1
перейдет к метке 1, если значение в r8 было не больше 40.
Справочник по языку ассемблера x86-64
Машинный код x86-64 является родным языком процессоров в большинстве настольных и портативные компьютеры. Язык ассемблера x86-64 представляет собой удобочитаемую версию этого Машинный код.
x86-64 имеет сотни инструкций и компилирует программы в наиболее эффективный машинный код требует хорошего понимания всех их — действительно, самый быстрый компилятор C для процессоров x86-64 разработан Интел! Однако мы сможем разработать вполне функциональный компилятор. используя только небольшое подмножество инструкций x86-64.
Это руководство по этому подмножеству x86-64 и библиотеке OCaml, которая у нас есть. предназначен для создания инструкций x86-64.
язык ассемблера x86-64
Ассемблерные программы, созданные нашим компилятором, имеют следующий вид:
;; фронтматерия: глобальная и т.д. вход: ;; инструкции метка1: ;; больше инструкций метка2: ;; больше инструкций
В начале файла находятся специальные директивы ассемблеру, говорящие ему
какие метки должны быть видны снаружи файла (пока только специальные запись метка). После этого каждая строка представляет собой либо метку , что указывает на
позицию в программе, на которую могут ссылаться другие строки, или инструкция ,
который на самом деле говорит процессору, что делать.
В этом классе ваш компилятор не будет напрямую генерировать ассемблерный код. Вместо этого вы будете использовать библиотеку OCaml, разработанную сотрудниками курса. Эта библиотека обрабатывает некоторые различия между операционными системами и особенности x86-64. Остальная часть этот документ посвящен библиотеке.
Директивы
Основным интерфейсом нашей библиотеки OCaml является директива типа . Директива соответствует одной строке ассемблерного кода; мы будем производить . файл из
список этих директив. Директивы, таким образом, соответствуют непосредственно
передовые декларации, этикетки и инструкции.
s
Операнды
Многие директивы принимают один или несколько аргументов. Для большинства инструкций эти
аргументы являются экземплярами операнда типа . Операнд может быть любым из:
- Регистр A, записанный как
Reg <регистр>(например,Reg RaxилиReg Р8). - «Немедленное» числовое постоянное значение, записанное
Имм <число>. - Смещение в памяти, определяемое двумя дополнительными операндами. Например,
MemOffset(Reg Rsp, Reg Rax)относится к ячейке памяти по адресуrsp + rax.
Некоторые директивы — например, переходы — принимают строку , именующую метку вместо
операнд .
Ссылка на директиву
Эта таблица будет обновляться по мере продвижения урока и выполнения домашних заданий.
дополнительные инструкции по сборке. Примечания к некоторым инструкциям приведены ниже, т.к.
указано.
| Директива | Пример asm | Описание | Примечания |
|---|---|---|---|
Глобальная строка | Сообщает ассемблеру экспортировать метку | ||
глобальная запись | |||
Часть струны | раздел .текст | Записывает в сегмент сгенерированного двоичного файла | |
Этикетка строки | этикетка: | Маркирует местоположение программы | |
DqLabel строки | Этикетка dq1 | Записывает адрес конкретной метки | DqLabel |
LeaLabel of (операнд * строка) | леа ракс, [этикетка1] | Загружает адрес этикетки в регистр | LeaLabel |
Mov of (операнд * операнд) | мов ракс, [rsp + -8] | Перемещает данные между местоположениями | |
Сумма (операнд * операнд) | добавить р8, рсп | Добавляет свои аргументы, сохраняя результат в первом | |
Подмножество (операнд * операнд) | суппорт, 4 | Вычитает второй аргумент из первого, сохраняя результат в первом | |
Раздел операнда | Идив Р8 | Делит 128-битное целое число со знаком rdx:rax на его аргумент, сохраняя результат в rax | Дивизион и Мул |
Мул операнда | имул [rsp + -8] | Умножает rax на его аргумент, сохраняя результат в rdx:rax | Дивизион и Мул |
Cqo | рядом с | Знак расширяет rax в rdx | |
Шл из (операнд * операнд) | шл ракс,2 | Сдвигает первый аргумент влево на второй аргумент | |
Shr of (операнд * операнд) | ШР,3 | Сдвигает свой первый аргумент вправо на второй аргумент, дополняя нулями слева | |
Sar of (операнд * операнд) | сарракс,3 | Сдвигает первый аргумент вправо на второй аргумент, дополняя нулями или единицами для сохранения знака | Сар |
Cmp из (операнд * операнд) | смр р8, [рсп + -16] | Сравнивает два аргумента, устанавливая RFLAGS | |
И (операнд * операнд) | и ракс, р8 | Выполняет побитовое И своих аргументов, сохраняя результат в первом аргументе | |
Или (операнд * операнд) | или r8, 15 | Выполняет побитовое ИЛИ своих аргументов, сохраняя результат в своем первом аргументе | |
Setz операнда | набор | Устанавливает для своего однобайтового аргумента текущее значение ZF | Сетц и др.![]() |
Набор операндов | нач. | Устанавливает для своего однобайтового аргумента текущее значение (SF != OF) | Сетл |
Соединение строки | jmp этикетка1 | Переходит выполнение к заданной метке | |
Струна | этикетка1 | Переходит выполнение к данной метке, если ZF установлен | Прыжки |
Единица строки | jne label1 | Переходит выполнение к данной метке, если ZF не установлен | Прыжки |
Дж строки | этикетка1 | Переход к заданной метке, если SF != OF | Прыжки |
Jnl строки | JNL Этикетка1 | Переходит выполнение к данной метке, если SF == OF | Прыжки |
Джг веревки | JG этикетка1 | Переход к заданной метке, если SF == OF AND !ZF | Прыжки |
Цепь струны | JNG Этикетка1 | Переход к заданной метке, если SF != OF OR ZF | Прыжки |
ComputedJmp операнда | джмп ракс | Переход к месту в заданном операнде | |
Восстановленный | | Возвращает управление вызывающей функции | |
Комментарий строки | ;; полезный комментарий | Комментарий |
DqLabel
DqLabel "label1" записывает адрес данной метки в программу как данные ( dq — сокращение от «данные, четверное слово»).
Затем вы можете загрузить этот адрес
с инструкцией mov . Вы должны убедиться, что выполнение вашей программы
никогда не доходит до этой директивы — это просто данные, а не инструкция!
LeaLabel
LeaLabel (Reg Rax, "label1") загружает адрес данной метки в
регистр. Вы будете использовать это при выполнении вычисляемого прыжка или при попытке загрузить
данные с заданной метки (например, в сочетании с DqLabel ).
Разд. и Мл.
Div и Mul работают иначе, чем Add и Sub . Потому что умножение двух
64-битные числа будут часто переполняться, результат imul хранится в rdx:rax как 128-битный номер . Наш компилятор не обрабатывает переполнение, поэтому вам
не нужно беспокоиться об этом для умножения; однако idiv выполняет
обратная операция, деление rdx:rax на его аргумент. Если вы просто хотите
разделите rax , вам нужно знак-удлинить rax на rdx с помощью cqo инструкция.
Это устанавливает rdx на все 0, если rax положительное или нулевое и все 1 с
если rax отрицательный.
Наконец, ни Div , ни Mul не могут принимать непосредственное значение в качестве своего значения.
аргумент — это должен быть либо регистр, либо смещение памяти.
Сар
Sar выполняет арифметический сдвиг вправо, который сохраняет знак своего аргумента
при смещении вправо.
Сец
Setz(Reg Rax) устанавливает последний байт rax в 0b00000001 , если ZF установлен и
до 0b00000000 иначе. В сборке на самом деле выглядит как setz al , т.к. al — это имя последнего байта rax . Библиотека сборки OCaml занимает
заботиться об этом для вас.
Сетл
setl — сокращение от «установить, если меньше». Так же, как Setz устанавливает свой аргумент равным 1, если
последняя инструкция cmp сравнивает равные аргументы, setl устанавливает свой аргумент равным 1
если за последние cmp инструкция, первый операнд меньше
второй.
Так
смр р8, 40 установить аль
установит последний байт rax в 1, если r8 меньше 40 .
Это работает, потому что cmp arg1, arg2 устанавливает несколько флагов:
-
ZFеслиarg1 - arg2 = 0 -
SF, еслиarg1 - arg2 < 0 -
ИЗ, еслиarg1 - arg2переполняется
setl переходит, если SF != OF , что означает, что значение со знаком arg1 меньше
чем значение со знаком arg2 .
В большинстве случаев вам не нужно беспокоиться о конкретных флагах. Просто сделайте cmp и используйте инструкцию set (или j , см. ниже) с командой
правильная мнемоника.
Условные переходы
je и друзья переходят к указанной метке, если их условие истинно.
мнемоники работают, как описано выше.
Например:
смр р8, 40 jng лейбл1
перейдет к метке 1, если значение в r8 было не больше 40.
Справочник по языку ассемблера x86-64
Машинный код x86-64 является родным языком процессоров в большинстве настольных и портативные компьютеры. Язык ассемблера x86-64 представляет собой удобочитаемую версию этого Машинный код.
x86-64 имеет сотни инструкций и компилирует программы в наиболее эффективный машинный код требует хорошего понимания всех их — действительно, самый быстрый компилятор C для процессоров x86-64 разработан Интел! Однако мы сможем разработать вполне функциональный компилятор. используя только небольшое подмножество инструкций x86-64.
Это руководство по этому подмножеству x86-64 и библиотеке OCaml, которая у нас есть. предназначен для создания инструкций x86-64.
язык ассемблера x86-64
Ассемблерные программы, созданные нашим компилятором, имеют следующий вид:
;; фронтматерия: глобальная и т.д. вход: ;; инструкции метка1: ;; больше инструкций метка2: ;; больше инструкций
В начале файла находятся специальные директивы ассемблеру, говорящие ему
какие метки должны быть видны снаружи файла (пока только специальные запись метка). После этого каждая строка представляет собой либо метку , что указывает на
позиция в программе, на которую могут ссылаться другие строки, или инструкция ,
который на самом деле говорит процессору, что делать.
В этом классе ваш компилятор не будет напрямую генерировать ассемблерный код. Вместо этого вы будете использовать библиотеку OCaml, разработанную сотрудниками курса. Эта библиотека обрабатывает некоторые различия между операционными системами и особенности x86-64. Остальная часть этот документ посвящен библиотеке.
Директивы
Основным интерфейсом нашей библиотеки OCaml является директива типа . Директива соответствует одной строке ассемблерного кода; мы создадим файл . из
список этих директив. Директивы, таким образом, соответствуют непосредственно
передовые декларации, этикетки и инструкции.
s
Операнды
Многие директивы принимают один или несколько аргументов. Для большинства инструкций эти
аргументы являются экземплярами операнд тип. Операнд может быть любым из:
- Регистр A, записанный как
Reg <регистр>(например,Reg RaxилиReg Р8). - «Немедленное» числовое постоянное значение, записанное как
Imm. - Смещение в памяти, определяемое двумя дополнительными операндами. Например,
MemOffset(Reg Rsp, Reg Rax)относится к ячейке памяти по адресуrsp + rax.
Некоторые директивы — например, прыжки — получают 9 баллов.0015 строка именующая метка вместо
операнд .
Ссылка на директиву
Эта таблица будет обновляться по мере продвижения урока и выполнения домашних заданий.
дополнительные инструкции по сборке. Примечания к некоторым инструкциям приведены ниже, т.к.
указано.
| Директива | Пример asm | Описание | Примечания |
|---|---|---|---|
Глобальная строка | Сообщает ассемблеру экспортировать метку | ||
глобальная запись | |||
Часть струны | раздел .текст | Записывает в сегмент сгенерированного двоичного файла | |
Этикетка строки | этикетка: | Маркирует место программы | |
DqLabel строки | Этикетка dq1 | Записывает адрес конкретной метки | DqLabel |
LeaLabel of (операнд * строка) | рак, [этикетка1] | Загружает адрес этикетки в регистр | LeaLabel |
Mov of (операнд * операнд) | мов ракс, [rsp + -8] | Перемещает данные между местоположениями | |
Сумма (операнд * операнд) | добавить р8, рсп | Добавляет свои аргументы, сохраняя результат в первом | |
Подмножество (операнд * операнд) | суппорт, 4 | Вычитает второй аргумент из первого, сохраняя результат в первом | |
Раздел операнда | Идив Р8 | Делит 128-битное целое число со знаком rdx:rax на его аргумент, сохраняя результат в rax | Дивизион и Мул |
Мул операнда | имул [rsp + -8] | Умножает rax на его аргумент, сохраняя результат в rdx:rax | Дивизион и Мул |
Cqo | кво | Знак расширяет rax в rdx | |
Шл из (операнд * операнд) | шл ракс,2 | Сдвигает первый аргумент влево на второй аргумент | |
Shr of (операнд * операнд) | ШР,3 | Сдвигает свой первый аргумент вправо на второй аргумент, дополняя нулями слева | |
Sar of (операнд * операнд) | сарракс,3 | Сдвигает первый аргумент вправо на второй аргумент, дополняя нулями или единицами для сохранения знака | Сар |
Cmp из (операнд * операнд) | смр р8, [рсп + -16] | Сравнивает два аргумента, устанавливая RFLAGS | |
И (операнд * операнд) | и ракс, р8 | Выполняет побитовое И своих аргументов, сохраняя результат в первом аргументе | |
Или (операнд * операнд) | или r8, 15 | Выполняет побитовое ИЛИ своих аргументов, сохраняя результат в своем первом аргументе | |
Setz операнда | набор | Устанавливает для своего однобайтового аргумента текущее значение ЗФ | Сетц и др.![]() |
Набор операндов | нач. | Устанавливает для своего однобайтового аргумента текущее значение (SF != OF) | Сетл |
Соединение строки | JMP этикетка1 | Переходит выполнение к заданной метке | |
Струна | этикетка1 | Переходит выполнение к данной метке, если ZF установлен | Прыжки |
Единица строки | jne label1 | Переходит выполнение к данной метке, если ZF не установлен | Прыжки |
Jl струны | этикетка1 | Переход к заданной метке, если SF != OF | Прыжки |
Jnl строки | JNL Этикетка1 | Переходит выполнение к данной метке, если SF == OF | Прыжки |
Джг веревки | JG этикетка1 | Переход к заданной метке, если SF == OF AND !ZF | Прыжки |
Цепь струны | JNG Этикетка1 | Переходит выполнение к данной метке, если SF != ИЛИ ZF | Прыжки |
ComputedJmp операнда | джмп ракс | Переход к месту в заданном операнде | |
Восстановленный | | Возвращает управление вызывающей функции | |
Комментарий строки | ;; полезный комментарий | Комментарий |
DqLabel
DqLabel "label1" записывает адрес данной метки в программу как данные ( dq — сокращение от «данные, четверное слово»).
Затем вы можете загрузить этот адрес
с инструкцией mov . Вы должны убедиться, что выполнение вашей программы
никогда не доходит до этой директивы — это просто данные, а не инструкция!
LeaLabel
LeaLabel (Reg Rax, "label1") загружает адрес данной метки в
регистр. Вы будете использовать это при выполнении вычисляемого прыжка или при попытке загрузить
данные с заданной метки (например, в сочетании с DqLabel ).
Разд. и Мл.
Div и Mul работают иначе, чем Add и Sub . Потому что умножение двух
64-битные числа часто переполняются, результат imul сохраняется в rdx:rax как 128-битный номер . Наш компилятор не обрабатывает переполнение, поэтому вам
не нужно беспокоиться об этом для умножения; однако idiv выполняет
обратная операция, деление rdx:rax своим аргументом. Если вы просто хотите
разделите rax , вам нужно знак-удлинить rax на rdx с помощью cqo инструкция.
Это устанавливает rdx на все 0, если rax положительное или нулевое и все 1 с
если rax отрицательно.
Наконец, ни Div , ни Mul не могут принимать непосредственное значение в качестве своего значения.
аргумент — это должен быть либо регистр, либо смещение памяти.
Сар
Sar выполняет арифметический сдвиг вправо, который сохраняет знак своего аргумента
при смещении вправо.
Сец
Setz(Reg Rax) устанавливает последний байт rax в 0b00000001 , если установлен ZF и
до 0b00000000 иначе. В сборке на самом деле выглядит как setz al , т.к. al — это имя последнего байта rax . Библиотека сборки OCaml занимает
заботиться об этом для вас.
Сетл
setl — сокращение от «установить, если меньше». Так же, как Setz устанавливает свой аргумент равным 1, если
последняя инструкция cmp сравнивает равные аргументы, setl устанавливает свой аргумент равным 1
если в последней инструкции cmp первый операнд был меньше
второй.

Виноделие
Зарубежная
04.2011
Изложение сопровождается большим количеством подробно откомментированных примеров, что способствует наилучшему пониманию и усвоению материала. Доходчиво объясняются все основные вопросы программирования на этом языке. Вы узнаете, как писать ассемблерные программы под разные операционные системы (Windows, DOS, Linux), как создавать резидентные программы, как писать ассемблерные вставки в программы на языках высокого уровня и многое другое. Попутно вам будут разъяснены основные моменты работы процессора, операционных систем, управления памятью и взаимодействия программ с аппаратными устройствами ПК — то есть все то, без знания чего нельзя обойтись при программировании на языке низкого уровня, которым и является ассемблер. Книга написана доступным языком. Лучший выбор для начинающих.
Ю.
Г.
0, Microsoft Visual Studio.NET 2002/2003). Для разработчиков разнообразного программного обеспечения, желающих повысить качество, надежность и эффективность своих программ, преподавателей и студентов, профессионально изучающих программирование, а также для всех желающих познакомиться с нижним уровнем программирования процессоров Intel x86.
00 МБ
Описаны особенности архитектуры микроконтроллеров семейства i8051. Приведены сведения о технологии разработки программ, системе и форматах команд. Книга содержит информацию о программировании некоторых типов задач, в том числе задач цифровой фильтрации сигналов, а также несколько рекомендаций о стиле программирования для начинающих программистов.
00 МБ
Для системных программистов и специалистов в области компьютерной безопасности.
В 4-м издании материал существенно переработан в соответствии с новыми возможностями ОС. Значительно шире рассмотрены вопросы управления файлами и API-программирования в Windows. Добавлен материал по программированию в ОС семейства Windows NT: Windows 2000/XP/Server 2003/Vista. На компакт-диске приведены многочисленные примеры, сопровождающие текст и проверенные на работоспособность в операционной системе Windows Vista.
Н.
92 МБ
08 МБ
40 МБ
Приведенные сведения иллюстрируются примером достаточно сложной программы — шестнадцатеричного редактора, который позволяет редактировать как содержимое оперативной памяти, так и файлы на диске. Теоретический материал в совокупности с предлагаемыми индивидуальными заданиями оформлен в виде лабораторных работ, что значительно облегчает индивидуальное восприятие Предмета читателем и повышает ценность книги при использовании в учебном процессе. Для студентов технических вузов, будет полезна для широкого круга специалистов, желающих систематизировать свои познания в области программирования и устройства микропроцессорных систем.»
А.
Также помимо изложения принципов и механизмов работы процессора в защищенном и 64-битном режимах, речь пойдет о программировании на ассемблере в операционных системах семейства Windows, как в 32-битных, так и 64-битных версиях. Рассматривается не только разработка обычных приложений для операционных систем Windows, но и разработка драйверов на ассемблере. При написании книги уделялось большое внимание именно практической составляющей, т.е. изложение материала идет только по делу и только то, что необходимо знать любому системному и низкоуровневому программисту. Последний раздел книги посвящен принципам работы многопроцессорных систем, а также работе с расширенным программируемым контроллером прерываний (APIC). На диске, прилагаемом к книге, находятся полные исходные коды примеров к книге, а также дополнительные программы и материалы. Издание предназначено для системных и низкоуровневых программистов, а также для студентов и преподавателей технических специальностей высших и средне-специальных учебных заведений.
»
Описаны особенности архитектуры микропроцессоров Intel и всего компьютера в целом, правила составления программ, основные конструкции языка и приемы программирования, принципы программирования подключаемой к компьютеру аппаратуры. Рассмотрены возможности использования в 16-разрядных приложениях реального режима средств современных 32-разрядных процессоров. Дано сжатое описание принципов защищенного режима с примером программирования. В приложении дан перечень команд процессора Pentium с примерами и пояснениями. Для студентов и преподавателей средних и высших учебных заведений, а также для всех желающих познакомиться с основами современных микропроцессоров и их программированием.
В.
Все базовые понятия вводятся с нуля, поэтому предварительного знакомства с другими языками программирования не требуется. Книга ориентирована как на профессионалов, так и на начинающих без опыта программирования.
Подробно рассмотрена архитектура процессоров Intel вплоть до Pentium II. Все главы иллюстрированы подробными примерами работоспособных программ. Книга ориентирована как на профессионалов, так и на начинающих без опыта программирования.
Также помимо изложения принципов и механизмов работы процессора в защищенном и 64-битном режимах, речь пойдёт о программировании на ассемблере в операционных системах семейства Windows, как в 32-битных, так и 64-битных версиях. Рассматривается не только разработка обычных приложений для операционных систем Windows, но и разработка драйверов на ассемблере. При написании книги уделялось большое внимание именно практической составляющей, т.е. изложение материала идёт только по делу и только то, что необходимо знать любому системному и низкоуровневому программисту. Последний раздел книги посвящен принципам работы многопроцессорных систем, а также работе с расширенным программируемым контроллером прерываний (APIC). На диске, прилагаемом к книге, находятся полные исходные коды примеров к книге, а также дополнительные программы и материалы. Издание предназначено для системных и низкоуровневых программистов, а также для студентов и преподавателей технических специальностей высших и средне-специальных учебных заведений.

д.
вход:
;; инструкции
метка1:
;; больше инструкций
метка2:
;; больше инструкций

д.
вход:
;; инструкции
метка1:
;; больше инструкций
метка2:
;; больше инструкций
