Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Assembler this system does not support fullscreen mode http://www.cyberforum.ru/assembler/thread882161.html
this system does not support fullscreen mode В чем может быть ошибка?
Assembler Assembler для процессоров фирмы Intel
Уважаемые форумчане! Подскажите пожалуйста каково буде содержание регистра ECX в десятичном формате после выполнения следующей программы: MOV ECX,28 CLD MOV AL,100 LEA...
проверка оборудования Assembler
прошу помощи. напишите код с комментариями. заранее спасибо. для компьютера на своем рабочем столе определить: - тип компьютера; - версию MS-DOS; - число дисковых накопителей; - тип и число...
Assembler Ассемблер.повторное нажатие клавиши и использование таймера tasm Есть программа, в которой прорисовывается фигура и при нажатии любой клавиши должна начинаться смена цвета. Подскажите, пожалуйста, как сделать, чтобы при повторном нажатии той же клавиши или... http://www.cyberforum.ru/assembler/thread880292.html
Assembler Запрет на удаление файла http://www.cyberforum.ru/assembler/thread880013.html
Задача: Резидентная программа по горячей клавише выводит окно, в котором с помощью клавиш 'стрелка вверх' и 'стрелка вниз' выбирается режим работы с файлами, т.е. тип файлов, которые нельзя удалять....
Идентификация производителя монитора Assembler
Здравствуйте, не первый день пытаюсь найти способ узнать (идентифицировать) производителя монитора. Например (из аиды64): ID монитора SAM0691 Программу нужно написать на TASM, нашёл только...
Assembler Графика MASM
Помогите доделать! не могу понять почему движение фигуры происходит только наискось, а должна влево вправо вверх и вниз. вроде все правильно но не работает, помогите разобраться... data...
Assembler Часы вторым каналом таймера Надо запилить часы с помощью второго канала системного таймера, именно второго, не используя нулевой, с его перерыванием. Где то на просторах интернета, нарыл код, просто стартуем канал в режиме 3,... http://www.cyberforum.ru/assembler/thread877963.html
Assembler структуры->запись http://www.cyberforum.ru/assembler/thread877507.html
Реализуйте векторную алгебру в трехмерном пространстве (сложение, вычитание, скалярное и векторное произведение векторов). Вектор представляется как запись с полями, соответствующими координатам...
Assembler Связь ассемблера с Pascal Сформируйте массив, в котором соответствующий элемент является произведением элементов двух массивов. Помогитею. http://www.cyberforum.ru/assembler/thread877335.html
murderer
4611 / 1580 / 163
Регистрация: 06.10.2010
Сообщений: 3,498
22.09.2013, 09:08 0

FAQ для раздела Assembler, MASM, TASM

22.09.2013, 09:08. Просмотров 76124. Ответов 63
Метки (Все метки)

Ответ

Особенности кодинга под x64
Программирование под x64 не сильно отличается от уже привычного x86, но некоторые отличия всё-же имеются. Как всегда для того, чтобы узнать все эти мелочи приходится собирать инфу в нескольких источниках. Я попытаюсь собрать воедино эти мелочи из руководств Intel, MSDN и руководства FASM.
По части инструкций
Запилено:
  1. 8 xmm-регистров (xmm8-xmm15).
  2. 8 регистров общего назначения (r8-r15)
  3. Теперь для относительной адресации используется регистр rip.
  4. Теперь можно обращаться к младшим байтам индексных регистров (bpl, spl, dil, sil)

Выпилено:
  1. Инструкции для работы с двоично-десятичными числами (aaa, aad, aam, aas, daa и das)
  2. bound
  3. pusha/popa
  4. inc и dec с однобайтовой кодировкой

Ограничения:
  1. В архитектуре x86 присутствует ограничение на длину инструкции в 15 байт. Из этого вытекает невозможность записи инструкций вида
    Assembler
    1
    
    mov [mem64],imm64
    Так как это займёт больше 15 байт (8 байт адреса + 8 байт непосредственного операнда + опкод). Поэтому в x64 можно делать только так
    Assembler
    1
    
    mov [mem64],imm32
    При этом imm32 будет преобразован в qword с учётом знака (movsx).
  2. Инструкция не может ссылаться одновременно на ah,bh,dh,ch и младший байт новых регистров. То есть "mov ah,dl" - допустимо, а "mov ah,r8b" - не допустимо.
  3. Операции с 32 битными операндами обнуляют старшие 4 байта результата. То есть "add eax,ebx" обнулят старшую часть rax. К 8 и 16 битным операндам это не относится.

Соглашение fastcall x64
Передача параметров
Первые 4 параметра передаются через регистры rcx, rdx, r8, r9, остальные параметры передаются в обратном порядке через стек. При этом в стеке резервируется дополнительно 32 байта для первых 4 параметров даже если у функции вообще нет параметров. Параметры с плавающей точкой передаются через регистры xmm0, xmm1, xmm2, xmm3. Если параметр занимает больше 8 байт, он передаётся через указатель. Стек освобождается вызывающей стороной.

Выравнивание стека
Перед вызовом функции rsp должен быть кратен 16. Таким образом если ваша функция имеет чётное количество параметров и количество параметров больше 4, при передаче ей управления rsp будет кратен 8, иначе rsp кратен 16. В FASM макросы .code/.end автоматически добавляют "sub rsp,8" в точке входа для выравнивания стека.

Не изменяемые регистры
Функции не должны изменять содержимое регистров rsi, rdi, rbp, rbx, r12-r15, xmm6-xmm15.

Общие рекомендации
  1. Старайтесь обходиться 32-битными инструкциями, они занимают меньше места, чем 64-битные т.к. для кодирования 64-битных инструкций используется префикс REX. Не стоит забывать, что регистры rbl, spl, dil, sil также кодируются через префикс.
  2. В FASM существует макрос frame/endf, который позволяет выделять и освобождать место в стеке для вызова сразу нескольких API-функций.
    Рассмотрим такой ничего не значащий код
    Assembler
    1
    2
    
    invoke MessageBoxW,rcx,rdx,r8,r9
    invoke ExitProcess,rcx
    Он будет скомпилирован так
    Assembler
    1
    2
    3
    4
    5
    6
    
    sub  rsp,32
    call [MessageBoxW]
    add  rsp,32
    sub  rsp,32
    call [ExitProcess]
    add  rsp,32
    Теперь применим макрос
    Assembler
    1
    2
    3
    4
    
    frame
    invoke MessageBoxW,rcx,rdx,r8,r9
    invoke ExitProcess,rcx
    endf
    И всё заметно улучшится
    Assembler
    1
    2
    3
    4
    
    sub  rsp,32
    call [MessageBoxW]
    call [ExitProcess]
    add  rsp,32
    Кстати обратите внимание: умный макрос invoke не генерирует лишний код
    Assembler
    1
    2
    3
    4
    
    mov rcx,rcx
    mov rdx,rdx
    mov r8,r8
    mov r9,r9
    Можно учитывать это при написании программ.
  3. До появления ollydbg x64 можно использовать PEBrowseDbg64 - вполне годный отладчик. При запуске отладки происходит остановка в ntdll.dll, нажимаем F5 и попадаем на точку входа нашего PE. Присутствует небольшой баг: если начать отладку и просто закрыть отладчик, то он останется висеть в памяти. Для корректного выхода нужно нажать Shift+F5 (завершить отладку), а уже после этого закрывать отладчик.


Вернуться к обсуждению:
FAQ для раздела Assembler, MASM, TASM
9
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 09:08
Готовые ответы и решения:

Глоссарий для раздела Assembler, MASM, TASM
Thread, AFP, Charles Kludge, 6a6kin, Убежденный, Ethereal, выкладывайте свои глоссарии - разложу...

Организация тем в разделе Assembler, MASM, TASM
Всем привет! Друзья, возник вопрос: как лучше организовать темы в разделе Assembler, MASM, TASM?...

Полезные макросы для MASM и TASM
Не претендую на создание чего-то нового и гениального, но макросы довольно полезные. Часть из того,...

Видеоуроки по Ассемблеру MASM/TASM (для DOS) на русском языке
Всем доброго времени суток. Вобщем, ищу видеоуроки на русском языке по Ассемблеру. Нужно для...

MASM, TASM, FASM: что выбрать для программирования в ядре
Какой асемлер выбрать для проганья в едре? вынь

63
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru