64-х разрадное программирование на асме это как ? Все время я писал 32х разрядные программки, а как писать 64х разрядные проги? Чем програмирование под 64х разрядные процы отличается от кодинга под 32х разрядные ? Раскажите плз )
Вместо ml.exe юзай ml64.exe, вот и все 64-разрядное программирование http://msdn.microsoft.com/msdnmag/issues/06/05/x64/default.aspx
Gentle Introduction to x86-64 Assembly Кроме масма х64 поддерживают ещё фасм и гас. PS. Крис Касперски выкладывал статью по теме - там более развёрнуто описаны изменения в адресации.
да почти ничем. расширенные регистры rax, rbx, rcx, rdx, и прочие. В винде формат вызова апи сменился на fastcall. (То есть раньше писали push 0 / call ExitProcess а теперь xor rax,rax / call ExitProcess. Порядок регистров я не помню ) Новые команды входа в системные сервисы - SYSCALL / SYSRET Вот собственно кажется и все..
Ну вообще то отличается. Кроме расширения 8 основных регистров, есть еще 8 дополнительных R8-R15 , которые тоже 64х разрядные. Так же добавилось еще 8 XMM регистров и того их 16. RIP - 64х разрядный. И к нему можно обращаться. Но кроме этих плюсов есть и минусы - нельзя напрямую занести в стек 64х битное число. Нельзя напрямую сделать jmp на 64х битный адрес (imm). Не работают инструкции PUSHA(D)\POPA(D). Порядок регистров при вызове - rcx (Хренова - счетчики обламываются),rdx,r8-r16 вроде так. Есть еще нюансы - все сразу не вспомнишь . Смотрите мануалы.
с позволения прокоментирую каждый по-своему... в Win64 fastcall выглядит так: первые четыре параметра передаются соответственно через rcx, rdx, r8, r9 остальные через стек. Также резервируются места в стеке под первые 4 параметра, чтобы потом можно было переместить значения из регистров в стек и юзать их "по старинке" (аля [ebp+хх]).
http://msdn.microsoft.com/en-us/library/ms794520(printer).aspx http://msdn.microsoft.com/en-us/library/ms794596(printer).aspx
прошу прощения, что вмешиваюсь в тонкие материи, но разве fastcall не компилятор-зависима? т.е. почему утверждается, что fastcall это обязательно rcx, rdx, r8, r9? хttр://msdn.microsoft.com/en-us/library/6xa169sk(VS.71).aspx The __fastcall calling convention specifies that arguments to functions are to be passed in registers, when possible. Т.е. в микрософтовском компилере часть аргументов передается в одних регистрах, а, например, в ГЦЦ часть аргументов передается совсем в других регистрах и т.д.
NeuronViking В Win x64 задано стандартом (rcx, rdx, r8, r9, xmm0-xmm3, возвращаемое значение в rax или xmm0, должны сохраняться rsi, rdi, rbp, rbx, r12-r15, xmm6-xmm15 или что-то вроде этого). Для, скажем, Linux x64 соглашение другое, но тоже одно и стандартное (если не ошибаюсь - rdi, rsi, r8, r9, xmm0-xmm7, возвращаемое значение - rax, rdx, xmm0, xmm1, callee save - rbx, rbp, r12-r15) Еще у них немного разный подход к стеку вообще и его выравниванию в частности. В общем, нет больше fastcall как такового. Есть PE64 и ELF64
P.S. Кстати, fastcall, cdecl, pascal, stdcall вообще больше нет. Соглашение ВООБЩЕ одно, ибо эта неразбериха всех достала.
Код (Text): в Win64 fastcall выглядит так: первые четыре параметра передаются соответственно через rcx, rdx, r8, r9 остальные через стек Прямо Линукс,причем может я и ошибаюсь, но попахивает Итаниумом (когда про стек прочитал), была там какаято абстракция для передачи параметров не только через регистры но и через нечто построеное на стеке,не помню как наз
SPA Не совсем убрали. Если приёмник – RAX, то можно использовать прямую. А вообще – посмотри какие толстые инструкции получаются с прямой адресацией: Код (Text): 00: 48 A1 00 00 00 00 00 00 00 00 mov rax, [qword 0] ; прямая 0A: 48 8B 05 EF FF FF FF mov rax, [0] ; rip-relative (бонус: базонезависимый код) 11: