![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 | ||
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
В этой теме я буду выкладывать примеры программ на языке ассемблера Intel® 64 и IA-32. Для демонстрации работы с WinAPI и языком ассемблера.
Перед тем как выкладывать демо-программы, опишу работу с инструментарием: сборщик - MASM отладчик- Ollydbg оболочка - FAR Пока ограничусь MASM (далее возможны другие сборщики) и IA-32. Скачиваем инструментарий: MASM32 - http://wasm.ru/toollist.php Ollydbg - ссылка для скачивания и работа с Ollydbg описана здесь: http://wasm.ru/article.php?article=ollydbg01 FAR - http://www.farmanager.com/download.php?l=ru А я по-моему взял FAR здесь: http://www.piter.com/book.phtml?978594723757 (файлы к книге) Как я уже писал - работа с Ollydbg описана здесь: http://wasm.ru/article.php?article=ollydbg01 Поэтому опишу только, как удобнее запускать эту программу. Запуск Ollydbg. Первый вариант запуска Ollydbg. Создаём папку с батниками для этого: - запускаем FAR - разворачиваем FAR на весь экран, для этого нажимаем Alt+F9 - выбираем диск, для этого нажимаем Alt+F1 или Alt+F2 - выбираем директорию для создания папки с батниками - создаём папку с батниками, а для этого нажимаем F7 и пишем имя папки, например: bats - переходим в созданную папку - создаём файл .bat, для этого нажимаем Shift+F4 и пишем название, например: odbg.bat - в файле пишем путь к exe-файлу, у меня так: start "" "C:\Program Files\Ollydbg\OLLYDBG.EXE" Примечание. Если в открытом файле нажать Ctrl+F, то напечатается путь к текущему файлу. - сохраняем, для этого нажимаем F2 - закрываем файл, нажимаем F10 - прописываем путь к папке bats, для этого: (для Windows 7) Пуск --> Панель управления --> Система --> Дополнительные параметры системы --> Переменные среды --> выбираем "Path" --> Изменить --> в поле "Значение переменной" дописываем путь к папке "bats", у меня так: F:\bats Примечание. Пробелов после "точки с запятой" не должно быть! - перезапускаем FAR Теперь мы можем запустить Ollydbg, набрав в командной строке: odbg (в нижней части оболочки Far) Результат запуска можно увидеть, нажав: Ctrl+O (вернуться обратно так же: Ctrl+O). В запущенной Ollydbg выбираем в меню: File --> Open --> выбираем нужный exe-файл Второй вариант запуска Ollydbg. - для Windows 7: Пуск --> Панель управления --> Система --> Дополнительные параметры системы --> Переменные среды --> выбираем "Path" --> Изменить --> в поле "Значение переменной" дописываем путь к папке "Ollydbg", у меня так: C:\Program Files\OllyDbg Примечание: пробелов перед "точкой с запятой" и после неё не должно быть! - перезапускаем FAR После выполнения настройки для второго варианта запуска мы можем запустить Ollydbg, находясь в директории с тем exe-файлом, который нужно отладить, набрав в командной строке оболочки FAR строку: ollydbg filename Нужно настроить оба способа запуска. Сборка проекта с помощью программы ассемблера MASM32: Создаём папку с батниками для этого (если папка уже есть, то пропускаем этапы создания папки, добавление Path и перезапуск FAR): - запускаем FAR - нажимаем Alt+F9, чтобы развернуть на весь экран - нажимаем Alt+F1 или Alt+F2, чтобы выбрать диск - выбираем директорию для создания папки с батниками - создаём папку с батниками, а для этого нажимаем F7 и пишем имя папки, например: bats - переходим в созданную папку - нажимаем Shift+F4, чтобы создать файл и пишем название, например: amake.bat - в файл копируем слудующее: Цитата:
- нажимаем F10, чтобы выйти - для Windows 7: Пуск --> Панель управления --> Система --> Дополнительные параметры системы --> Переменные среды --> выбираем "Path" --> Изменить --> в поле "Значение переменной" дописываем путь к папке "bats", у меня так: F:\bats Примечание: пробелов перед "точкой с запятой" и после неё не должно быть! - перезапускаем FAR Теперь мы можем создать exe-файл, имея написанную программу в файле "filename.asm". Набираем в командной строке оболочки FAR следующее: Цитата:
Теперь настало время рассмотреть первую демонстрационную программу. Последний раз редактировалось 8Observer8; 14.09.2012 в 14:41. |
||
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
Краткое описание:
Программа сохраняет адрес начала командной строки. commline.asm Код:
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]() |
![]() |
![]() |
![]() |
#4 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
я , скорее всего, догадываюсь, что данная тема несет некоторое знание и свет в массы.. но все-таки, не понимаю зачем создавать командную строку, или окно на асме, когда все это, на мой взгляд, гораздо приятнее сделать на c/c++, или другом языке высокого уровня. объясните, плиз, зачем это? в чем преиумущество?
я бы еще понял пограммирование на асме возведения в степень, к примеру, которое на пол-такта быстрее чем стандартная реализация, или чего-нибудь модное с использованием SSE или AVX. но "простая командная строка"? - не понимаю. |
![]() |
![]() |
![]() |
#5 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
пример 0:
функция поиска подстроки в строке (строки тут предполагаются C-style) Код:
объявлена функция следующим образом: Код:
Последний раз редактировалось f.hump; 20.09.2012 в 16:46. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,328
|
![]()
f.hump, спасибо за код! Я чуть позже продолжу здесь. Сейчас нужно закончить тему: http://www.programmersforum.ru/showp...7&postcount=40
|
![]() |
![]() |
![]() |
#7 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
пример 1: функция копирования блока памяти.
Код:
Код:
|
![]() |
![]() |
![]() |
#8 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
небольшой комментарий про Windows x64.
принимая во внимание, что в 64-х битном режиме есть 16 64-х битных регистров общего назначения, то в этом режиме используется только __fastcall. Это значит, что первые четыре аргумента функции передаются через регистры (rcx, rdx, r8, r9), а остальные по стеку. Если среди первых четырех аргументов есть синглы и даблы, то они передаются через xmm0, xmm1, xmm2, xmm3. например, если есть функция func(single, my_struct &, int, double), то будут задействованны регистры xmm0, rdx, r8 и xmm3. __fastcall также вносит следующее ограничение, если один из первых четырех аргументов функции не вмещается в 8 байт он должен передаваться ссылкой или указателем. в принципе, если функция использует rbx, rbp, rdi, rsi, rsp, r12-r15, xmm6-xmm15, то она должна их сохранять/восстанавливать. я пока, по старинке, делаю это только для rbx, rbp, rdi, rsi, rsp, до первого бага, что называется. Последний раз редактировалось f.hump; 24.09.2012 в 14:55. |
![]() |
![]() |
![]() |
#9 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
про использование VS C++ 2010 Express вместе с Windows SDK для х64 асма.
Как многие наверняка знают, компиляторы Майкрософта не поддерживают inline assemby для 64-х битного кода. Почему так, я понятия не имею, но думаю, что так компиляторы им писать проще. Так вот, если у кого возникает потребность разнообразить свой C/C++ код ассеблером, для удовлетворения некоторых садо-мазо желаний, либо по непонятным причинам, с использованием VS C++ 2010 Express, то поступить нужно следующим образом: 1. В солюшн иксплорере кликнуть правой кнопкой мыши на проекте, который хочется улучшить, и выбрать Build Customizations.. В появившемся окне поставить галочку напротив masm. Данная операция упростит конфигурацию .asm файлов, в том плане, что студия будет их когфигурировать автоматически. 2. В солюшн иксплорере кликнуть правой кнопкой мыши на проекте, который хочется улучшить, и выбрать Свойства. В появившемся окне, Configuration Properties->General->Platform Toolset, выбрать Windows X.X SDK. Связанно это с тем, что VS C++ Express идет без компиляторов для x64. 3. В солюшн иксплорере кликнуть правой кнопкой мыши на проекте, который хочется улучшить, и выбрать Add->New Item... Выбрать Code и вписать имя файла вместе с расширением (.asm). Все готово для улучшения проекта. Вот пример пустого сорс файла: Код:
Последний раз редактировалось f.hump; 25.09.2012 в 15:42. Причина: [B]Properties[/B] |
![]() |
![]() |
![]() |
#10 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
еще пару слов про Windows x64.
Как уже было отмечено аргументы функции передаются через регистры и стек. Первые 4 через регистры слева направо, остальные через стек справа налево. Тот кто вызывает функцию резервирует стек под параметры и тут нужно помнить про то, что называется shadow space или home space. В х64 действеут соглашение согласно которому любой функции гарантируется 32 байта стека для того, чтобы дампить параметры переданные через регистры (или других целей). (Как я понимаю, сделано это для поддержки vararg.) Это означает, что тот кто вызывает функцию отвечает за выделение и освобождение этих 32-х байт, потому что вызываемой функции разрешено считать, что у нее есть эти 32 байта без каких-либо проверок. Код:
Последний раз редактировалось f.hump; 26.09.2012 в 00:02. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Составить на языке ассемблера IBM PC подпрорамму вычисления | Airat1790 | Помощь студентам | 0 | 18.04.2012 13:39 |
Нужны шаблоны(примеры программ) по Паскалю | Сержuk | Помощь студентам | 1 | 10.03.2011 14:48 |
На языке ассемблера IBM PC создать подпрограммы: | Gertryda | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 09.01.2011 23:13 |