MASM32 плюс ФБ

Предыдущая тема Следующая тема Перейти вниз

MASM32 плюс ФБ

Сообщение  VerhoLom в Пт Май 13, 2011 2:51 pm

В общем, решил попробовать прикрутить ФБ к МАСМ32. По ходу выяснился еще один вариант навязывания программе своей точки входа (а не стандартной, как это в ФБ сделано, помнится подымали эту тему на форуме). В общем идея такая: пишется на ФБ программа (в нашем случае неважно, сложная или нет: мы же пробуем), потом вызываем компилятор так:

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 кб тоже есть хорошо Basketball .

Собственно все это затевалось ради одного: хочу писать драйвер на ФБ! И все тут. Видимо, выйдет... Буду пробовать! lol! study study study

Хотя опять же: такие извращения надо делать лишь в исключительных случаях. Но приятно... pig
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  trew в Пт Май 13, 2011 7:00 pm

2.5 кб это хорошо, такое впечатление как будто на чистом МАСМЕ написано. Надо будет другие исходники попробовать.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  VerhoLom в Пт Май 20, 2011 3:13 pm

trew пишет:2.5 кб это хорошо, такое впечатление как будто на чистом МАСМЕ написано. Надо будет другие исходники попробовать.

Тут еще надо выловить либы от рантаймы ФБшной (или, в крайнем случае сделать свою реализацию используемых функций). Хотя если не использовать функции РТЛ, а пользоваться чистым АПИ, то все может пройти и безболезненно - совсем как на чистом АСМе...

Выходит, что пишешь на чистом ассемблере: ФБ/АС транслирует, а линкер-то МАСМовский. Отсюда много возможностей откроются: от программирования своего загрузчика (правда тут еще надо найти линкер, который делает чистые бинарники (хотя, может и ЛД стандартный сможет, не пробовал)) до программирования аппаратуры и драйверов... В общем, тема интересная... afro
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  electrik в Вт Май 24, 2011 9:15 pm

такая идея меня посещала давно, но вот я решил сделать транслятор из gnu assembler в flat assembler или masm.
это чтоб легче переносился код, особенно библиотеки dll и т.п.
все понятно, с переменными, секциями, метками. вот мучает вопрос, в какой кодировке FreeBasic, оддает ассемблеру русский текст.
например:
Привет, мир!
_Lt_0039: .ascii "\317\360\350\342\345\362, \354\350\360!\0"
конечно, можно записать все русские буквы, все распарсить, но все-же что за кодировка такая.
насколько мне извесно, ansi кодировка не может быть больше 255, а тут не юникод.
может попасться другой язык, отличающийся от английского. под все языки запаришься делать таблицы.


electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  trew в Ср Май 25, 2011 6:01 am

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 плюс ФБ

Сообщение  VerhoLom в Чт Июн 02, 2011 9:12 am

Это аски-коды в 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). То есть надо не делать никаких вызовов типа оператора "!", а просто писать русский текст. Значит, можно не париться?
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  electrik в Чт Июн 02, 2011 12:56 pm

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  VerhoLom в Вт Июн 07, 2011 2:32 pm

Ну выставьте ее, эту программу, - попробуем вместе! тема же интересная... afro lol! Suspect

хотя если написано на чистой АПИ, проблем быть не должно. тут исходник видеть надо...
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  electrik в Чт Июн 09, 2011 3:14 pm

оказалось не так все просто.
прогу по переделывания асмовского исходника я почти написал, но есть траблы.
вопервых, встает проблема, masm, совсем тупой, и ему перед использованием структур, надо еще их объявлять.
тоесть по метке, он говорит мол нет такой структуры.
мож конечно где-то это включается. вообще по masm'у, есть много описаний, но все скудные.
вовторых, проблема с функциями- все они начинаются на символ"_", это все можно убрать, но тогда надо парсить все команды, имеющие отношения к этим функциям.
метки с начинающимся "_", это вообще мясо, так как тут еще глубже парсить надо.
короче, написать можно, но оно того не стоит.
надо разбираться с файликом i386pe.x, и убирать от туда ссылки на всякие левые .o файлы, и тогда, получится бинарник написанный на winapi, такой же как на masm
.
если не убрать ссылки, тогда при линковке, если эти .o не подключить, линкер будет ругаться.

/



electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  electrik в Пт Июн 10, 2011 9:40 pm

короче, поповоду i386pe.x, я был не прав. немного поковырявшись, я понял, на него вообще можно забить. размер бинарника можно уменьшить и без масма. вот что там я накалякал:
http://freebasic.justforum.net/t404-topic#2923

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  VerhoLom в Ср Июн 22, 2011 1:45 pm

Имена функций с символа подчеркивания - это стандарт stdcall и тут все линкеры их так и обрабатывают. Разве что не ТАСМовский/ALinkовский линкеры будут исключением. Но это полнейший геморой.

Можно не писать свою программу по переделыванию: то, что предложил я, можно использовать, но НЕ ПОЛЬЗОВАТЬСЯ рантаймовыми функциями. Хотя можно и поубирать стандартные декларации рантаймовых функций. Вот пример:

Код:
#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
lol!
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: MASM32 плюс ФБ

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения