Зміст
Введення
. Основні відмінності архітектур i686 та amd64
. Загальні принципи програмування мовою Assembler для платформ i686 і amd64
Регістри
Принцип передачі параметрів у функції
Робота зі стеком
Адресація
. Лістинг програми для порівняння архітектур i686 та amd64
. Приклад роботи програми
. Порівняння програм
Висновок
Список літератури
Введення
У наше життя вже давно увійшли процесори з 64-х розрядної архітектурою. Не дивлячись на те, що все ще активно використовуються 32-х розрядні процесори, і що програм для них у рази більше, нова архітектура набуває все більше прихильників. 64-х розрядні процесори дозволяють використовувати більше ресурсів, ніж 32-х розрядні, дозволяють оперувати з великою кількістю даних за одиницю часу, що в свою чергу підвищує швидкість і точність обчислень. У теж час використання 64-х розрядної архітектури тягне за собою підвищене споживання оперативної пам'яті і деякі проблеми з сумісністю програм, написаних, для 32-х розрядної архітектури.
Можна припустити, що нова архітектура буде вимагати інших способів програмування, і це виявиться правдою. Наприклад, були змінені регістри, стек, правила передачі аргументів у функції та інше.
У даній роботі буде наведено порівняння особливостей програмування для 32-х розрядних і 64-розрядних процесорів на мові асемблера. У якості ОС буде застосовуватися операційна система Ubuntu 12.10 LTS, компілятор gcc. Також ми будемо дотримуватися AT amp; T нотації мови програмування Assembler.
1. Основні відмінності архітектур i686 та amd64
Нововведення в архітектурі 64-х розрядних процесорів дозволили значно збільшити обсяг використовуваної пам'яті для одного ядра процесора.
Таблиця 1. Загальні обмеження на пам'ять
Характерістіка32-розрядні моделі64-х розрядні моделіВіртуальное адресний простір (один роцесс) 4 ГБ16 ТБВіртуальное адресний простір (32-х розрядний процес) 2 ГБ (3 ГБ, при запуску системи з ключем/3GB) 4 ГБВіртуальное адресний простір (64-х розрядний процес) - 8 ТБПул підкачувати пам'яті (режим ядра) 470 МБ128 ГБПул неподкачіваемой пам'яті (режим ядра) 156 МБ128 ГБЕлемент системної таблиці страніц660-900 МБ128 ГБ
Також використання 64-х розрядної архітектури дозволяє звертатися до більшої кількості регістрів більшого обсягу під час роботи програми. Якщо при використанні 32-х розрядного режиму ми могли звертатися до восьми 32-х розрядних регістрів загального призначення: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP, до восьми 64-х розрядних регістрів для роботи медіа даними і з числами з плаваючою точкою: MMX0/FPR0, MMX1/FPR1, MMX2/FPR2, MMX3/FPR3, MMX4/FPR4, MMX5/FPR5, MMX6/FPR6, MMX7/FPR7, до прапорцевого 32-х розрядних регістрів EFLAGS і до 32-х разрядному регістру-вказівником на наступну інструкцію EIP, то в 64-х розрядному режимі у нас набагато більше можливостей:
Регістри загального призначення були розширені до 64-х розрядів із збереженням старої структури і отримали назви RAX, RBX, RCX, 3RDX, RBP, RSI, RDI і RSP;
Були введені нові 64-х розрядні регістри в кількості восьми штук: R8, R9, R10, R11, R12, R13, R14, R15;
Прапоровий регістр і регістр-покажчик на наступну інструкцію процесора були розширені до 64-х розрядів і отримали назви RFLAGS і RIP відповідно;
Було додано 16128-розрядних медіа-регістрів під назвами XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15.
З вищесказаного можна зробити висновок про те, що використання 64-х розрядної архітектури дозволить більш швидко, якісно і зручно вирішувати поставлені як наукові, так і спільні завдання.
Варто зауважити, що результати тестування програм на різних платформах показують, що в більшості випадків використання 64-х розрядної архітектури дає приріст продуктивності, у порівнянні з 32-х розрядної архітектурою.
2. Загальні принципи програмування мовою Assembler для платформ i686 і amd64
У даному розділі ми розглянемо чотири основні питання, які повинні бути вирішені в першу чергу програмістом на мові Assembler при переході на нову апаратну платформу: регістри, стек, передача параметрів у функції і адресація.
Регістри