MASM32 плюс ФБ
Участников: 3
FreeBasic :: Программирование :: Общее
Страница 1 из 1
MASM32 плюс ФБ
В общем, решил попробовать прикрутить ФБ к МАСМ32. По ходу выяснился еще один вариант навязывания программе своей точки входа (а не стандартной, как это в ФБ сделано, помнится подымали эту тему на форуме). В общем идея такая: пишется на ФБ программа (в нашем случае неважно, сложная или нет: мы же пробуем), потом вызываем компилятор так:
fbc file.bas -r -lib
В итоге имеем чистый ассемблерный файл безо всяких вмешательств со стороны компилятора: практически такой, какой пишем в МАСМе. Далее делаем из него объектный файл:
as file.asm -o file.o
Теперь самое главное - линкуем с МАСМовским линкером и его же библиотеками:
link file.o опции
Теперь вот пример:
BAS-file (тупее всех тупых, но показывающий процесс):
Получившийся ассемблерный файл:
Ну, и наконец, батник для компиляции (пути надо выставить свои!):
В общем, проба пройдена и размер экзешника в 2,5 кб тоже есть хорошо .
Собственно все это затевалось ради одного: хочу писать драйвер на ФБ! И все тут. Видимо, выйдет... Буду пробовать!
Хотя опять же: такие извращения надо делать лишь в исключительных случаях. Но приятно...
fbc file.bas -r -lib
В итоге имеем чистый ассемблерный файл безо всяких вмешательств со стороны компилятора: практически такой, какой пишем в МАСМе. Далее делаем из него объектный файл:
as file.asm -o file.o
Теперь самое главное - линкуем с МАСМовским линкером и его же библиотеками:
link file.o опции
Теперь вот пример:
BAS-file (тупее всех тупых, но показывающий процесс):
- Код:
#Include Once "windows.bi"
Sub main Cdecl Alias "main"()
MessageBox(0UL,"Привет, мир!","Мудрая программа",MB_ICONEXCLAMATION)
ExitProcess(0)
End Sub
Получившийся ассемблерный файл:
- Код:
.intel_syntax noprefix
#ww.bas' compilation started at 14:41:27 (FreeBASIC 0.21.1)
.section .text
.balign 16
.globl _main
_main: #Вот она, точка входа!
.Lt_0037:
push 48
push offset _Lt_003A
push offset _Lt_0039
push 0
call _MessageBoxA@16
push 0
call _ExitProcess@4
.Lt_0038:
ret
#ww.bas' compilation took 0.2128365476618033 secs
.section .data
.balign 4
_Lt_0039: .ascii "\317\360\350\342\345\362, \354\350\360!\0"
.balign 4
_Lt_003A: .ascii "\314\363\344\360\340\377 \357\360\356\343\360\340\354\354\340\0"
Ну, и наконец, батник для компиляции (пути надо выставить свои!):
- Код:
@echo off
echo FreeBASIC translate...
\MAIN\FreeBASIC\fbc.exe ww.bas -r -lib
echo Asembling...
\MAIN\FreeBASIC\bin\win32\as.exe ww.asm -o ww.o
echo Linking...
\MAIN\masm32\bin\link.exe ww.o /nologo /subsystem:windows /machine:IX86 /entry:main /out:ww.exe \MAIN\masm32\lib\kernel32.lib \MAIN\masm32\lib\user32.lib
if exist ww.o del ww.o
if exist ww.asm del ww.asm
pause
В общем, проба пройдена и размер экзешника в 2,5 кб тоже есть хорошо .
Собственно все это затевалось ради одного: хочу писать драйвер на ФБ! И все тут. Видимо, выйдет... Буду пробовать!
Хотя опять же: такие извращения надо делать лишь в исключительных случаях. Но приятно...
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: MASM32 плюс ФБ
2.5 кб это хорошо, такое впечатление как будто на чистом МАСМЕ написано. Надо будет другие исходники попробовать.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: MASM32 плюс ФБ
trew пишет:2.5 кб это хорошо, такое впечатление как будто на чистом МАСМЕ написано. Надо будет другие исходники попробовать.
Тут еще надо выловить либы от рантаймы ФБшной (или, в крайнем случае сделать свою реализацию используемых функций). Хотя если не использовать функции РТЛ, а пользоваться чистым АПИ, то все может пройти и безболезненно - совсем как на чистом АСМе...
Выходит, что пишешь на чистом ассемблере: ФБ/АС транслирует, а линкер-то МАСМовский. Отсюда много возможностей откроются: от программирования своего загрузчика (правда тут еще надо найти линкер, который делает чистые бинарники (хотя, может и ЛД стандартный сможет, не пробовал)) до программирования аппаратуры и драйверов... В общем, тема интересная...
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: MASM32 плюс ФБ
такая идея меня посещала давно, но вот я решил сделать транслятор из gnu assembler в flat assembler или masm.
это чтоб легче переносился код, особенно библиотеки dll и т.п.
все понятно, с переменными, секциями, метками. вот мучает вопрос, в какой кодировке FreeBasic, оддает ассемблеру русский текст.
например:
Привет, мир!
_Lt_0039: .ascii "\317\360\350\342\345\362, \354\350\360!\0"
конечно, можно записать все русские буквы, все распарсить, но все-же что за кодировка такая.
насколько мне извесно, ansi кодировка не может быть больше 255, а тут не юникод.
может попасться другой язык, отличающийся от английского. под все языки запаришься делать таблицы.
это чтоб легче переносился код, особенно библиотеки dll и т.п.
все понятно, с переменными, секциями, метками. вот мучает вопрос, в какой кодировке FreeBasic, оддает ассемблеру русский текст.
например:
Привет, мир!
_Lt_0039: .ascii "\317\360\350\342\345\362, \354\350\360!\0"
конечно, можно записать все русские буквы, все распарсить, но все-же что за кодировка такая.
насколько мне извесно, ansi кодировка не может быть больше 255, а тут не юникод.
может попасться другой язык, отличающийся от английского. под все языки запаришься делать таблицы.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: MASM32 плюс ФБ
electrik пишет:такая идея меня посещала давно, но вот я решил сделать транслятор из gnu assembler в flat assembler или masm.
это чтоб легче переносился код, особенно библиотеки dll и т.п.
все понятно, с переменными, секциями, метками. вот мучает вопрос, в какой кодировке FreeBasic, оддает ассемблеру русский текст.
например:
Привет, мир!
_Lt_0039: .ascii "\317\360\350\342\345\362, \354\350\360!\0"
конечно, можно записать все русские буквы, все распарсить, но все-же что за кодировка такая.
насколько мне извесно, ansi кодировка не может быть больше 255, а тут не юникод.
может попасться другой язык, отличающийся от английского. под все языки запаришься делать таблицы.
Че ты переживаешь из-за других языков? Анлийский и русский вполне достаточно. Вон операторы (Lcase и Ucase) не работает с русскими символами, но никто из разрабов по этому поводу не расстраивается.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: MASM32 плюс ФБ
Это аски-коды в 8-ричном виде. Посмотреть можно в калькуляторе (в инженерном виде).
В исходном виде в ассемблерном файле строка пишется так:
"\\317\\360\\350\\342\\345\\362, \\354\\350\\360!\\0\0"
отсюда и непонимание таких строк ассемблерами.
По нормальному она из-под FB должна выглядеть так:
"\&o317\&o360\&o350\&o342\&o345\&o362, \&o354\&o350\&o360!\0"
тогда в ассемблерном коде строка определится так:
_Lt_003C: .ascii "\317""\360""\350""\342""\345""\362"", \354""\350""\360""!\0""\0"
Хотя в моем примере (в описании темы, с линковкой МАСМ32) все нормально: выводится "Привет мир", а не набор кодов. В ассемблерном файле строка определяется тоже правильно ("\317\360\350\342\345\362, \354\350\360!\0", т. е. как это понимают Сяшные функции типа wsprintf). То есть надо не делать никаких вызовов типа оператора "!", а просто писать русский текст. Значит, можно не париться?
В исходном виде в ассемблерном файле строка пишется так:
"\\317\\360\\350\\342\\345\\362, \\354\\350\\360!\\0\0"
отсюда и непонимание таких строк ассемблерами.
По нормальному она из-под FB должна выглядеть так:
"\&o317\&o360\&o350\&o342\&o345\&o362, \&o354\&o350\&o360!\0"
тогда в ассемблерном коде строка определится так:
_Lt_003C: .ascii "\317""\360""\350""\342""\345""\362"", \354""\350""\360""!\0""\0"
Хотя в моем примере (в описании темы, с линковкой МАСМ32) все нормально: выводится "Привет мир", а не набор кодов. В ассемблерном файле строка определяется тоже правильно ("\317\360\350\342\345\362, \354\350\360!\0", т. е. как это понимают Сяшные функции типа wsprintf). То есть надо не делать никаких вызовов типа оператора "!", а просто писать русский текст. Значит, можно не париться?
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: MASM32 плюс ФБ
все правильно. при линковке все определяется нормально. но если простому масму подсунуть такой листинг, он определит такие значения неправильно.
значит, надо за место ascii, вбивать db и после каждой цифры, ставить o.
огромное спасибо, я бы не догадался что это восьмиричная система.
значит, проблема решена, и непридется писать парсер разбора цифр.
просто после каждой, бить o.
у меня есть программа, которая написана полностью на winapi, и при том методе который ты предложил, она работает не корректно. проблема совместимости и т.д.
вот и у меня появилась идея переделывания асмовского исходника.
незнаю что получится, пока радоваться рано.
значит, надо за место ascii, вбивать db и после каждой цифры, ставить o.
огромное спасибо, я бы не догадался что это восьмиричная система.
значит, проблема решена, и непридется писать парсер разбора цифр.
просто после каждой, бить o.
у меня есть программа, которая написана полностью на winapi, и при том методе который ты предложил, она работает не корректно. проблема совместимости и т.д.
вот и у меня появилась идея переделывания асмовского исходника.
незнаю что получится, пока радоваться рано.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: MASM32 плюс ФБ
Ну выставьте ее, эту программу, - попробуем вместе! тема же интересная...
хотя если написано на чистой АПИ, проблем быть не должно. тут исходник видеть надо...
хотя если написано на чистой АПИ, проблем быть не должно. тут исходник видеть надо...
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: MASM32 плюс ФБ
оказалось не так все просто.
прогу по переделывания асмовского исходника я почти написал, но есть траблы.
вопервых, встает проблема, masm, совсем тупой, и ему перед использованием структур, надо еще их объявлять.
тоесть по метке, он говорит мол нет такой структуры.
мож конечно где-то это включается. вообще по masm'у, есть много описаний, но все скудные.
вовторых, проблема с функциями- все они начинаются на символ"_", это все можно убрать, но тогда надо парсить все команды, имеющие отношения к этим функциям.
метки с начинающимся "_", это вообще мясо, так как тут еще глубже парсить надо.
короче, написать можно, но оно того не стоит.
надо разбираться с файликом i386pe.x, и убирать от туда ссылки на всякие левые .o файлы, и тогда, получится бинарник написанный на winapi, такой же как на masm
.
если не убрать ссылки, тогда при линковке, если эти .o не подключить, линкер будет ругаться.
/
прогу по переделывания асмовского исходника я почти написал, но есть траблы.
вопервых, встает проблема, masm, совсем тупой, и ему перед использованием структур, надо еще их объявлять.
тоесть по метке, он говорит мол нет такой структуры.
мож конечно где-то это включается. вообще по masm'у, есть много описаний, но все скудные.
вовторых, проблема с функциями- все они начинаются на символ"_", это все можно убрать, но тогда надо парсить все команды, имеющие отношения к этим функциям.
метки с начинающимся "_", это вообще мясо, так как тут еще глубже парсить надо.
короче, написать можно, но оно того не стоит.
надо разбираться с файликом i386pe.x, и убирать от туда ссылки на всякие левые .o файлы, и тогда, получится бинарник написанный на winapi, такой же как на masm
.
если не убрать ссылки, тогда при линковке, если эти .o не подключить, линкер будет ругаться.
/
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: MASM32 плюс ФБ
короче, поповоду i386pe.x, я был не прав. немного поковырявшись, я понял, на него вообще можно забить. размер бинарника можно уменьшить и без масма. вот что там я накалякал:
https://freebasic.forum2x2.ru/t404-topic#2923
https://freebasic.forum2x2.ru/t404-topic#2923
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: MASM32 плюс ФБ
Имена функций с символа подчеркивания - это стандарт stdcall и тут все линкеры их так и обрабатывают. Разве что не ТАСМовский/ALinkовский линкеры будут исключением. Но это полнейший геморой.
Можно не писать свою программу по переделыванию: то, что предложил я, можно использовать, но НЕ ПОЛЬЗОВАТЬСЯ рантаймовыми функциями. Хотя можно и поубирать стандартные декларации рантаймовых функций. Вот пример:
А так выглядит то, что транслятор генерит на ассемблере:
То есть, сделать можно все, и даже избавится от рантаймы. Тут усидчивость нужна. Выходит, что можно вместо стандартных функций продставить свои - и писать так, как привык, а все сделает препроцессор.
Забыл сказать: надо в батник добавить msvcrt.lib
Можно не писать свою программу по переделыванию: то, что предложил я, можно использовать, но НЕ ПОЛЬЗОВАТЬСЯ рантаймовыми функциями. Хотя можно и поубирать стандартные декларации рантаймовых функций. Вот пример:
- Код:
#Include Once "windows.bi"
#Ifdef Allocate
#Undef Allocate 'уничтожим стандартное объявление
#Define Allocate(cch) GlobalAlloc(GMEM_FIXED+GMEM_ZEROINIT,cch) 'и сделаем свое
#EndIf
#Ifdef DeAllocate
#Undef DeAllocate 'то же самое
#Define DeAllocate(pv) GlobalFree(pv)
#EndIf
Sub main Cdecl Alias "main"()
Dim As UByte Ptr b=Allocate(20) 'все вроде как привычно, а работает по-другому
wsprintf(b,@"%s",@"Hello world!")
MessageBox(0UL,b,@"Мудрая программа",MB_ICONEXCLAMATION)
DeAllocate(b)
ExitProcess(0)
End Sub
А так выглядит то, что транслятор генерит на ассемблере:
- Код:
.intel_syntax noprefix
#ww.bas' compilation started at 13:36:31 (FreeBASIC 0.21.1)
.section .text
.balign 16
.globl _main
_main:
push ebp
mov ebp, esp
sub esp, 4
.Lt_0037:
push 20
push 64
call _GlobalAlloc@8
mov dword ptr [ebp-4], eax
push offset _Lt_003A
push offset _Lt_0039
push dword ptr [ebp-4]
call _wsprintfA
add esp, 12
push 48
push offset _Lt_003B
push dword ptr [ebp-4]
push 0
call _MessageBoxA@16
push dword ptr [ebp-4]
call _GlobalFree@4
push 0
call _ExitProcess@4
.Lt_0038:
mov esp, ebp
pop ebp
ret
#ww.bas' compilation took 0.5062227182490879 secs
.section .data
.balign 4
_Lt_0039: .ascii "%s\0"
.balign 4
_Lt_003A: .ascii "Hello world!\0"
.balign 4
_Lt_003B: .ascii "\314\363\344\360\340\377 \357\360\356\343\360\340\354\354\340\0" 'Это "Мудрая программа"
То есть, сделать можно все, и даже избавится от рантаймы. Тут усидчивость нужна. Выходит, что можно вместо стандартных функций продставить свои - и писать так, как привык, а все сделает препроцессор.
Забыл сказать: надо в батник добавить msvcrt.lib
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|