Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Архитектура x64 — это расширение с обратной совместимостью x86, которое предоставляет новый 64-разрядный режим и устаревший 32-разрядный режим, идентичный x86. Эта архитектура расширяет восемь регистров общего назначения x86 до 64-разрядных, добавляет восемь новых регистров и предоставляет расширенные соглашения о вызовах и режимы адресации для современного 64-разрядного программирования.
Термин x64 включает как AMD64, так и Intel 64. Наборы инструкций почти идентичны.
РегистрЫ
x64 расширяет восемь регистров общего назначения x86 для 64-разрядных и добавляет восемь новых 64-разрядных регистров. 64-разрядные регистры имеют имена, начинающиеся с "r". Например, 64-разрядное расширение eax называется rax. Новые регистры называются r8 – r15.
Нижние 32 бита, 16 битов и 8 бит каждого регистра напрямую доступны для адресации в операндах. Эта прямая адресность включает регистры, такие как esi, чьи более низкие 8 битов не были адресируемыми ранее. В следующей таблице указаны имена языка сборки для нижних частей 64-разрядных регистров.
| 64-разрядная регистрация | Более низкие 32 бита | Более низкий 16 бит | Младшие 8 бит исправление |
|---|---|---|---|
rax |
eax |
ax |
al |
rbx |
ebx |
bx |
bl |
rcx |
ecx |
cx |
cl |
rdx |
edx |
dx |
dl |
rsi |
esi |
si |
sil |
rdi |
edi |
di |
dil |
rbp |
ebp |
bp |
bpl |
rsp |
esp |
sp |
spl |
r8 |
r8d |
r8w |
r8b |
r9 |
r9d |
r9w |
r9b |
r10 |
r10d |
r10w |
r10b |
r11 |
r11d |
r11w |
r11b |
r12 |
r12d |
r12w |
r12b |
r13 |
r13d |
r13w |
r13b |
r14 |
r14d |
r14w |
r14b |
r15 |
r15d |
r15w |
r15b |
Операции, которые выводят в 32-разрядный подрегистр, автоматически расширяются с обнулением на весь 64-разрядный регистр. Операции, выходные в 8-разрядные или 16-разрядные подрегистры, не расширяются (это поведение совместимо с x86).
Высокие 8 битов ax, bx, cx и dx по-прежнему адресуются как ah, bh, ch и dh, но не могут использоваться со всеми типами операндов.
Указатель команд eip и регистр флагов flags расширяются до 64 бит (rip и rflags соответственно).
Процессор x64 также предоставляет несколько наборов регистров с плавающей запятой:
Восемь 80-разрядных регистров x87.
Восемь 64-разрядных регистров MMX. (Эти регистры перекрываются с регистрами x87.)
Исходный набор из восьми 128-разрядных регистров SSE увеличивается до 16.
Соглашения о вызовах
В отличие от архитектуры x86 компилятор C/C++ поддерживает только одно соглашение о вызовах в x64. Это соглашение о вызовах использует большее количество регистров, доступных в x64:
Первые четыре целочисленных или указателя параметров передаются в регистрах rcx, rdx, r8 и r9 .
Первые четыре параметров с плавающей запятой передаются в первых четырех регистрах SSE xmm0-xmm3.
Вызывающая функция резервирует пространство в стеке для аргументов, переданных в регистрах. Вызываемая функция может использовать это пространство для разлива содержимого регистров в стек.
Вы передаете любые другие аргументы на стек.
Целое или возвращаемое значение указателя возвращается в регистре rax , а возвращаемое значение с плавающей запятой возвращается в xmm0.
rax, rcx, rdx, r8-r11 являются переменными.
rbx, rbp, rdi, rsi, r12-r15 являются нелатилными.
Соглашение о вызове для C++ аналогично. Этот указатель передается как неявный первый параметр. Следующие три параметра передаются в оставшихся регистрах, а остальные передаются на стек.
Режимы адресации
Режимы адресации в 64-разрядном режиме похожи, но не идентичны x86.
Инструкции, ссылающиеся на 64-разрядные регистры, автоматически выполняются с 64-разрядной точностью. Например, mov rax, [rbx] перемещает 8 байтов, начиная с rbx в rax.
Специальная форма инструкции mov существует для 64-разрядных непосредственных констант или постоянных адресов. Для всех других инструкций немедленные константы или постоянные адреса по-прежнему 32-битные.
x64 предоставляет новый режим адресации относительно регистра rip. Инструкции, ссылающиеся на один адрес константы, кодируются как смещения от rip. Например, инструкция mov rax , [addr] перемещает 8 байтов, начиная с addr + rip в rax.
Инструкции, такие как jmp, call, push и pop, которые неявно ссылаются на указатель инструкции и указатель стека, обрабатывают их как 64-разрядные регистры в x64.