64-х разрадное программирование на асме

Тема в разделе "WASM.X64", создана пользователем _ir4_Y_, 19 мар 2007.

  1. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    64-х разрадное программирование на асме это как ?
    Все время я писал 32х разрядные программки, а как писать 64х разрядные проги?
    Чем програмирование под 64х разрядные процы отличается от кодинга под 32х разрядные ?
    Раскажите плз )
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Вместо ml.exe юзай ml64.exe, вот и все 64-разрядное программирование :)

    http://msdn.microsoft.com/msdnmag/issues/06/05/x64/default.aspx
     
  3. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    пасиба...
    а как эта работает ))
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Gentle Introduction to x86-64 Assembly
    Кроме масма х64 поддерживают ещё фасм и гас.

    PS. Крис Касперски выкладывал статью по теме - там более развёрнуто описаны изменения в адресации.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да почти ничем. расширенные регистры rax, rbx, rcx, rdx, и прочие. В винде формат вызова апи сменился на fastcall.
    (То есть раньше писали push 0 / call ExitProcess а теперь xor rax,rax / call ExitProcess. Порядок регистров я не помню :) )
    Новые команды входа в системные сервисы - SYSCALL / SYSRET
    Вот собственно кажется и все..
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Ну вообще то отличается.
    Кроме расширения 8 основных регистров, есть еще 8 дополнительных R8-R15 , которые тоже 64х разрядные.
    Так же добавилось еще 8 XMM регистров и того их 16.
    RIP - 64х разрядный. И к нему можно обращаться.
    Но кроме этих плюсов есть и минусы - нельзя напрямую занести в стек 64х битное число. Нельзя напрямую сделать jmp на 64х битный адрес (imm). Не работают инструкции PUSHA(D)\POPA(D).
    Порядок регистров при вызове - rcx (Хренова - счетчики обламываются),rdx,r8-r16 вроде так.
    Есть еще нюансы - все сразу не вспомнишь . Смотрите мануалы.
     
  7. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    2Quantum а линк на статью касперского можна? ))
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
  9. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Пасиба действительно хорошая статья !!!
     
  10. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Кстати как переписать обработчик прерывания в асме ?-)
     
  11. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    в х64 команда push gs ложит 32 или 64 бита.
    просто у intel написано по умолчанию 32 битный операнд
     
  12. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    с позволения прокоментирую
    каждый по-своему...
    в Win64 fastcall выглядит так: первые четыре параметра передаются соответственно через rcx, rdx, r8, r9 остальные через стек. Также резервируются места в стеке под первые 4 параметра, чтобы потом можно было переместить значения из регистров в стек и юзать их "по старинке" (аля [ebp+хх]).
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    http://msdn.microsoft.com/en-us/library/ms794520(printer).aspx
    http://msdn.microsoft.com/en-us/library/ms794596(printer).aspx
     
  14. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    прошу прощения, что вмешиваюсь в тонкие материи, но разве 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.

    Т.е. в микрософтовском компилере часть аргументов передается в одних регистрах, а, например, в ГЦЦ часть аргументов передается совсем в других регистрах и т.д.
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    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 :)
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    P.S.
    Кстати, fastcall, cdecl, pascal, stdcall вообще больше нет. Соглашение ВООБЩЕ одно, ибо эта неразбериха всех достала.
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Хм. Если мои сведения верны, то убрали прямую адрессацию. Это правда? а зачем они это сделали ))
     
  18. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    Код (Text):
    1. в Win64 fastcall выглядит так: первые четыре параметра передаются соответственно через rcx, rdx, r8, r9 остальные через стек
    Прямо Линукс,причем может я и ошибаюсь, но попахивает Итаниумом (когда про стек прочитал), была там какаято абстракция для передачи параметров не только через регистры но и через нечто построеное на стеке,не помню как наз
     
  19. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    SPA
    Не совсем убрали. Если приёмник – RAX, то можно использовать прямую. А вообще – посмотри какие толстые инструкции получаются с прямой адресацией:
    Код (Text):
    1. 00:   48 A1 00 00 00 00 00 00 00 00         mov rax, [qword 0]    ; прямая
    2. 0A:   48 8B 05 EF FF FF FF                  mov rax, [0]          ; rip-relative (бонус: базонезависимый код)
    3. 11:
     
  20. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Sol_Ksacap
    Спасибо. Ну толстые то толстые. А как же глобальные переменые.