Компилятор ассемблера в win32-exe на Delphi.

Тема в разделе "WASM.PROJECTS", создана пользователем tmtlib, 5 янв 2010.

  1. tmtlib

    tmtlib New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    5
    Ассемблер версия 0.1: http://www.igrodel.ru/pe-asm0.1.zip (210kb)

    Поддерживатся импорт функций. Размер секции кода и данных ограничены.
    Инструкций пока немного:

    push [byte]
    push [dword]
    push eax (пока держит только регистр eax)
    call [адрес dword]
    call [имя функции]

    Пример компилирующейся программы:
    Код (Text):
    1. import Kernel32.dll WriteFile
    2. import Kernel32.dll GetStdHandle
    3. import Kernel32.dll ExitProcess
    4. import User32.dll MessageBoxA
    5.  
    6. .text
    7. = Test1
    8. = Test2
    9. = Hello_World!
    10.  
    11. .code
    12.  
    13. push 0xf5
    14. call getstdhandle
    15.  
    16. push 0x00
    17. push 0x00403050
    18. push 0x0C
    19. push 0x0040300C
    20. push eax
    21. call writefile
    22.  
    23. push 0x00
    24. push 0x00403000
    25. push 0x00403006
    26. push 0x00
    27. call messageboxA
    28.  
    29. push 0x00
    30. call ExitProcess
    Пример и идея компилятора основывается на статье про машинный код (http://www.citforum.ru/programming/windows/machine_code/). test.asm компилируется запуском COMPILE.BAT.

    В будущем хочется сделать маленький ассемблер, возможно к нему интерпретатор pascal-еподобного языка и редактор формочек.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    tmtlib
    ну как проект, это воспринимать серьезно нельзя. А для развития нормально, тут (на васме) есть статьи про машинные коды, можно их почитать. Мне конечно делфи не нравиться, но каждому свое, не будем холиварить.

    :derisive:
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    tmtlib
    еще не плохо для таких вещей сорцы выкладывать ,а то что мы сейчас будем обсуждать =) как рабочий проэкт, это могут использовать только извращенцы, да и то не все.
     
  4. tmtlib

    tmtlib New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    5
    Согласен! Сорцы готовятся к выпуску. Больше команд, константы и примерчиков =)
     
  5. tmtlib

    tmtlib New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    5
    Новая версия с исходниками:
    http://www.igrodel.ru/tdg3d/pe-asm0.2.zip (20кб)

    Изменения:
    - вместо трёх секций сделал одну общую, exe-шник уменьшился до 1кб
    - добавил возможность задания переменных и констант
    - добавлена инструкция jmp и метки (с некоторыми ограничениями)

    Вопросы по ходу разработки:
    - какие ставить параметры стека в pe заголовок?
    - почему upx ругается на exe-шники "Illegal exe header"?

    Компилирующиеся примеры:

    HELLO.ASM
    Код (Text):
    1. .import
    2. import Kernel32.dll WriteFile
    3. import Kernel32.dll GetStdHandle
    4. import Kernel32.dll ExitProcess
    5. import User32.dll MessageBoxA
    6.  
    7. .var
    8. string s1 "This is a HELLO.ASM test message:"
    9. string s2 "Congratulations! Hidden message!"
    10. string message "Hello world! Comment out JMP 0x17 in HELLO.ASM to see hidden message"
    11. byte STD_INPUT_HANDLE 0xf5
    12. dword count 0x00000000
    13. dword MB_ICONASTERISK 0x00000040
    14.  
    15. .code
    16.  
    17.  
    18. push =STD_INPUT_HANDLE
    19. call getstdhandle
    20.  
    21. push 0x00        // lpOverlapped
    22. push @count      // lpNumberOfBytesWritten
    23. push =length(s1) // nNumberOfBytesToWrite
    24. push @s1         // lpBuffer
    25. push eax         // hFile
    26. call writefile
    27.  
    28. // comment out this jmp instruction to see hidden message:
    29. jmp 0x00000017
    30.  
    31. push =MB_ICONASTERISK // uType
    32. push @s1              // lpCaption
    33. push @s2              // lpText
    34. push 0x00             // hWnd
    35. call messageboxA
    36.  
    37. push =MB_ICONASTERISK // uType
    38. push @s1              // lpCaption
    39. push @message         // lpText
    40. push 0x00             // hWnd
    41. call messageboxA
    42.      
    43.  
    44. push 0x00
    45. call ExitProcess
    LOOP.ASM
    Код (Text):
    1. .import
    2. import Kernel32.dll WriteFile
    3. import Kernel32.dll GetStdHandle
    4.  
    5. .var
    6. string s1 "This is a loop!"
    7. byte STD_INPUT_HANDLE 0xf5
    8. dword count 0x00000000
    9.  
    10. .code
    11.  
    12. :label1
    13. push =STD_INPUT_HANDLE
    14. call getstdhandle
    15.  
    16. push 0x00        // lpOverlapped
    17. push @count      // lpNumberOfBytesWritten
    18. push =length(s1) // nNumberOfBytesToWrite
    19. push @s1         // lpBuffer
    20. push eax         // hFile
    21. call writefile
    22. jmp label1
    В архиве краткий хелп в readme.txt
     
  6. tmtlib

    tmtlib New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    5
    Добавлен тип record:
    Код (Text):
    1. record two_strings
    2.     string s1 "This string have three parts:"
    3.     string s2 "s1, s2"
    4.     string somename "and s3."
    5.     dword digits 0x12345678
    6. end
    можно обращаться как к @two_strings, так и ^two_strings.digits и т.п.

    Примеры и исходники: http://www.igrodel.ru/tdg3d/peasm-0.3beta.zip (30кб)
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    tmtlib
    молодец, глядишь на нем можно будет даже что-нибудь написать.
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    можу подарить. с легкочитаемыми и документироваными исходниками. на одном из нескольких языков (вроде и дельфа есть). или на всех сразу. можете как препроцессор заюзать
     
  9. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    qqwe
    мне кажется проект для саморазвития. Или я не прав?
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    spa
    не понял?
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    qqwe
    ну в смысле ТС пишет не рази результата, а ради процесса и главная навыка который он получит. Те юзать готовое не катит.
     
  12. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    spa
    с трудом узнаю человека, который клеймил меня велосипедами и призывал к максимальной высокоуровневости. впрочем, я и не призываю юзать готовое. там больше шаблон. полнофункциональный, но шаблон. учебный. для саморазвития изучающего. но можно и так юзать. калькуляторы там, хеловорды. встроить там, скриптодвижок/препроцессор..
    кроме того, если ТС совсем не интересуется результатом, то в топку такое дело. оно не принесет толку никому. в том числе и самому ТС

    но дело ваше, конечно. юзая ту технику можно и асм за пару дней накатать. и лучше, и читабельнее, и изменябельнее.
    но дело хозяйское. главное, что пишет, а не пальцы гнет и критикует всех подряд за то что сделали, а у него не спросили.. ээ, извините, увлекся.

    от меня проекту - ку.
    а вот поддерживаемости - кю. еще один благой порыв со временем пойдет в стол, тк поддержать и продолжить его никто не сможет

    ЗЫ както много негатива. не воспринимайте буквально, немного побелите, побрызгайте духами "сирень". ну, или выкиньте. чето не соображу как лучше. и ку есть. и кю есть. ось
     
  13. tmtlib

    tmtlib New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    5
    Друзья! Не ссорьтесь. qqwe, ваш учебный шаблон меня заинтриговал. Насколько он отличается от freepascal? К примеру, возможно ли реализовать аналогичный Delphi синтаксис?
    Сейчас у меня специфика проекта такова, чтобы увязать вместе код, типы, переменные параллельно задумываясь об их размещении в EXE и в памяти.

    p.s. В недавней версии постарался всё-таки сделать понагляднее добавление опкодов:
    Код (Text):
    1. smartparser('push ^',             'text|push~ val|1');        // PUSH ^var
    2. smartparser('push @',             'text|push~0x ptr|1');      // PUSH @var
    3. smartparser('push 0x??',          'text|6A raw|1');           // PUSH Imm8 "6A 00"
    4. smartparser('push 0x????????',    'text|68 raw|1');           // PUSH IMM32 "68 00 00 00 00"
    5. smartparser('push ???',           'text|50 +reg|1');          // push r32 "50+reg"
    6. smartparser('call 0x????????',    'text|FF15 raw|1');         // CALL r/m32 "ff 15 00 00 00 00"
    7. smartparser('call ?',             'text|FF15 dll|1');         // CALL r/m32 "ff 15 00 00 00 00"
    8. smartparser('jmp 0x????????',     'text|E9 raw|1');               // JMP
    9. smartparser('jmp ?',              'text|E9 label|1');             // JMP
    10. smartparser('mov ^ eax',          'text|mov~0: ptr|1 text|~eax'); // MOV ^var,eax
    11. smartparser('mov 0:???????? eax', 'text|A3 raw|1');               // MOV ptr,eax
    12. smartparser('mov eax ^',          'text|mov~eax~0: ptr|2');       // MOV eax, ^var
    13. smartparser('mov eax 0:????????', 'text|A1 raw|2');               // MOV eax, ptr
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    tmtlib
    там синтаксис оберон-0.
    там используется парсеро-генератор на ебнф. те, если вам это надо и вы не прочь немного поработать и немного подучиться, то вполне.
    это не делается параллельно.
    обычно, сперва парсится исходник, проверяются типы и прочая муть. и все это закидывается в дерево. после этого о сорцах забываем. дерево можно прооптимизировать опять же в дерево. а после уже снова дерево переводим маш или п код. или сперва в п-код, а потом п-код в маш код.
    а завертывание в ехе - это вообще 10тая операция. пусть ваш код сперва из памяти начнет нормально запускаться в 100 из 100
    я вам просто советую разобраться с парсер генераторами. лучше будет, модификабельнее и красивее.

    те это может быть яцц/бизон (есть пас с оптимизатором, пкод генератором, пкод интерпретером, пкод -> х86 (и маш код и асм гас синтаксиса). нет пе форматера), но мне яцц и вообще бнф не нравится,
    но лучше, имхо, сосо. начать можно тут http://wasm.ru/forum/viewtopic.php?id=33293
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Было бы прикольно иметь модуль, а то даже и компонент, хе-хе-хе, бросаешь его на форму, засовываешь ему в stringlist цодез на ассемблере, а он это дело компилит прямо в память и возвращает указатель на точку входа - мол, вызови меня. А то просто ассемблеров много, а такого ещё не было.
     
  16. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    CyberManiac
    в смысле не было? тини-с умеет компилить и запускать из памяти. там есть встроенный асм.
    я в свое время перетачивал фасм под встраиваемые нужды (компиленье + запуск из памяти) и выкладывал все это.

    в принципе, можно и еще вспомнить. можно и переточить какой нибудь опенсорсный. думаю, вы просто плохо искали
     
  17. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    qqwe
    [Расплываясь в улыбке] Так ведь чтобы на Delphi...
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    CyberManiac
    сосо под дельфу есть.
    тини-с представляет собой 2 части - фротенд и библиотеку кодогенератора. кодогенератор можно использовать отдельно

    впрочем в дельфе я слаб. слишком сложна она для меня. потому я не очень бровзю в ее библиотеках. так что, если все строго и уперто, то я тут пас.

    а парсеры на сосо переносимы между лангами (не считая обработчиков, ессно).