tify"> Використання 64-х розрядних регістрів дозволяє на одиницю часу передавати набагато більше інформації. Якщо, у разі 32-х розрядної архітектури, ми можемо передати 32 біта інформації за раз (максимальне число 4294967296), то у випадку 64-х розрядної архітектури ми можемо передати максимальне значення, рівне 18446744073709551616.
Лістинг 1. Передача даних у 64-х розрядної системі.
//Передача в регістр одного числа% rbx,% rax
Лістинг 2. Передача даних в 32-х розрядної системі.
//Передача в регістр одного числа% ebx,% eax
Якщо число такого обсягу передавати не потрібно, то ми можемо в одному регістрі передати кілька менших чисел. Такий хід можна зробити на обох архітектурах, але у випадку 64-х розрядної архітектури, обсяг даних, переданих за один такт, буде все одно більше, ніж на 32-х розрядної архітектури.
Лістинг 3. Передача кількох даних в одному регістрі (64-х розрядна система).
//Передача в регістр трьох чисел
movl% ecx,% eax
shlq $ 32,% rax% dx% ax $ 16,% eax% bx,% ax
Лістинг 4. Передача кількох даних в одному регістрі (32-х розрядна система).
//Передача в регістр трьох чисел% cx,% ax
5shll $ 16,% eax% dl,% al $ 8,% ax
movb% bl,% al
Можна помітити, що, незважаючи на те, що в обох прикладах було передано три числа в одному регістрі, у разі використання 64-х розрядної архітектури дані числа мають велику розрядність, ніж при використанні 32-х розрядної архітектури.
Принцип передачі параметрів у функції
З введенням 64-х розрядної архітектури був змінений спосіб передачі параметрів у функції. Якщо, у разі 32-х розрядної архітектури, параметри можна було передавати або через стек, або через регістри, то при використанні 64-х розрядної архітектури перші чотири параметра (параметри повинні бути цілочисельними, покажчик на клас (об'єктно-орієнтоване програмування) вважається цілим числом і завжди міститься в регістр RCX) передаються через регістри RCX, RDX, R8, R9, а решта через стек.
Лістинг 5. Передача параметрів у функцію в 64-х розрядної системі.
//Виклик функції з п'ятьма аргументамі5, dword ptr [% rsp + 0x20]//Передаємо п'ятий аргумент через стек4,% r9//Передаємо четвертий аргумент3,% r8//Передаємо третій аргумент2% rdx// Передаємо другий аргумент1,% rax//Передаємо перший аргументfunc//Викликаємо функцію:
//...
//Код функції ...
//...
addq 0x20,% rsp//Очищаємо стек
ret//Повертаємо управління
Лістинг 6. Передача параметрів у функцію в 32-х розрядної системі.
//Виклик функції з п'ятьма аргументамі5
pushl 4321func
func:
//...
//Код функції ...
Ret
Робота зі стеком
У 64-розрядної архітектури один елемент стека є 64-розрядним і менше значення туди покласти не можна. Стек вирівнюється по межі в 16 Б, а не 8 Б у разі 32-розрядної архітектури. Всі інші параметри роботи зі стеком залишаються колишніми, крім того, що в 64-х розрядної архітектури найчастіше застосовується парадигма «резервування простору і повторне використання його», і саме через це викликається функція не займається чищенням стека. Цим повинен займатися викликає. При виклику функції обов'язково повинні зберігатися всі регістри, крім RAX, RCX, RDX, R8, R9, R10 і R11.
Адресація
програмування процесор архітектура адресація
Зміна архітектури ніяк не вплинула на зміну способу адресації всередині програми. Адресація в 64-х розрядної системі будується за тим же принципом, як і в 32-х розрядної, і команда звернення до адресою займає однакову кількість байт і тактів.
Лістинг 7. Адресація в 64-х розрядної системі.
//Завантаження опкода наступній машинної команди [% rip],% al
//Абсолютна адресація
xorq% r9,% r9
decb byte ptr (% r9 + $ 777h)
Лістинг 8. Адресація в 32-х розрядної системі.
//Завантаження опкода наступній машинної команди $ + 5
popl% ebx $ 6,% ebx (% ebx),% al
nop