Перевести FASM в PB

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Перевести FASM в PB

Сообщение jangle » 02.04.2012 (Пн) 11:54

Если кто-то знаком с FASM`ом, подскажите как перевести асм на PB.
В аттаче пример на ассемблере использования FASM.DLL для компиляции асма из своей программы.
Если запустить экзешник все становится понятно. Хотелось бы подключить FASM.DLL к PB

Код: Выделить всё
format PE GUI 4.0
entry start

include 'win32a.inc'
include 'fasm.ash'
include 'asmedit.ash'

section '.data' data readable writeable

_asmedit db 'ASMEDIT.DLL',0
_caption db 'flat assembler %d.%d',0
_error db 'ERROR',0

_source db 0Dh,0Ah
    db ' org 100h',0Dh,0Ah
    db 0Dh,0Ah
    db ' mov ah,09h ',' ; write',0Dh,0Ah
    db ' mov dx,text',0Dh,0Ah
    db ' int 21h',0Dh,0Ah
    db ' int 20h',0Dh,0Ah
    db 0Dh,0Ah
    db ' text db "Hello!",24h',0Dh,0Ah
    db 0

buffer rb 10000h

fasm_memory:
   fasm_state FASM_STATE
   rb 800000h-($-fasm_memory)      ; reserve total 8 MB for assembler

section '.code' code readable executable

  start:

   invoke   LoadLibrary,_asmedit
   or   eax,eax
   jz   exit
   invoke   GetModuleHandle,0
   invoke   DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0

  exit:
   invoke   ExitProcess,0

proc DialogProc hwnddlg,msg,wparam,lparam
   push   ebx esi edi
   cmp   [msg],WM_INITDIALOG
   je   wminitdialog
   cmp   [msg],WM_COMMAND
   je   wmcommand
   cmp   [msg],WM_CLOSE
   je   wmclose
   xor   eax,eax
   jmp   finish
  wminitdialog:
   invoke   fasm_GetVersion
   mov   edx,eax
   and   eax,0FFFFh
   shr   edx,16
   cinvoke wsprintf,buffer,_caption,eax,edx
   invoke   SendMessage,[hwnddlg],WM_SETTEXT,0,buffer
   invoke   SetDlgItemText,[hwnddlg],ID_SOURCE,_source
   jmp   processed
  wmcommand:
   cmp   [wparam],BN_CLICKED shl 16 + IDCANCEL
   je   wmclose
   cmp   [wparam],BN_CLICKED shl 16 + IDOK
   jne   processed

   invoke   GetDlgItemText,[hwnddlg],ID_SOURCE,buffer,10000h

   invoke   fasm_Assemble,buffer,fasm_memory,800000h,100,NULL
   cmp   eax,FASM_OK
   je   show_output

   invoke   SetDlgItemText,[hwnddlg],ID_OUTPUT,_error

   jmp   processed

    show_output:

   mov   esi,[fasm_state.output_data]
   mov   ecx,[fasm_state.output_length]
   mov   edi,buffer
   xor   edx,edx
   jecxz   output_ok
      output_to_hex:
   test   dl,7
   jz   @f
   mov   al,20h
   stosb
      @@:
   mov   al,[esi+edx]
   shr   al,4
   cmp   al,10
   sbb   al,69h
   das
   stosb
   mov   al,[esi+edx]
   and   al,0Fh
   cmp   al,10
   sbb   al,69h
   das
   stosb
   inc   edx
   test   dl,7
   jnz   @f
   mov   ax,0D0Ah
   stosw
      @@:
   loop   output_to_hex
      output_ok:
   xor   al,al
   stosb

   invoke   SetDlgItemText,[hwnddlg],ID_OUTPUT,buffer

   jmp   processed
  wmclose:
   invoke   EndDialog,[hwnddlg],0
  processed:
   mov   eax,1
  finish:
   pop   edi esi ebx
   ret
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
     user32,'USER32.DLL',\
     fasm,'FASM.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'

  import fasm,\
    fasm_GetVersion,'fasm_GetVersion',\
    fasm_Assemble,'fasm_Assemble',\
    fasm_AssembleFile,'fasm_AssembleFile'

section '.rsrc' resource data readable

  ID_SOURCE = 100
  ID_OUTPUT = 101

  directory RT_DIALOG,dialogs

  resource dialogs,\
      37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration

  dialog demonstration,'Memory-to-memory assembly',40,40,180,220,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'ASMEDIT','',ID_SOURCE,10,10,160,120,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'ASMEDIT','',ID_OUTPUT,10,150,160,60,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'BUTTON','Assemble',IDOK,10,132,160,15,WS_VISIBLE+WS_TABSTOP
  enddialog
Вложения
DEMO.zip
(69.26 Кб) Скачиваний: 238

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Перевести FASM в PB

Сообщение bon818 » 06.04.2012 (Пт) 2:30

FASM не знаю, но тоже интересно.
Где узнать по подробней об-этом?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 06.04.2012 (Пт) 9:30

bon818 писал(а):FASM не знаю, но тоже интересно.
Где узнать по подробней об-этом?


Наверное только на форуме FASM`а
В принципе, как я понимаю надо правильно задекларировать вызов функции.
Вот так, почему-то не работает

Код: Выделить всё
Declare Function fasm_AssembleFile Lib "fasm.dll" Alias "fasm_AssembleFile" ( ByVal lpSource As Dword , ByVal lpMemory As Dword, ByVal cbMemorySize As Dword, ByVal nPassesLimit As Dword, ByVal  hDisplayPipe As Dword) As Dword

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Перевести FASM в PB

Сообщение ger_kar » 06.04.2012 (Пт) 10:47

Если надо повторить приведенный в аттаче пример, только на PB, то вечером выложу, сейчас просто этим некогда заняться
Бороться и искать, найти и перепрятать

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 06.04.2012 (Пт) 12:52

Ну если осилишь, то выкладывай.

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Перевести FASM в PB

Сообщение DarkMachine » 06.04.2012 (Пт) 13:52

Код: Выделить всё
DECLARE FUNCTION fasm_Assemble  LIB "FASM.DLL" ALIAS "fasm_Assemble" _
                                                  (BYVAL pSource AS DWORD, _
                                                   BYVAL pFasmMemory AS DWORD, _
                                                   BYVAL cMemorySize AS DWORD, _
                                                   BYVAL passLImit AS DWORD, _
                                                   BYVAL hDispPipe AS LONG ) AS LONG 

...
UNION Ubuff
    out_Len AS DWORD
    errcode AS DWORD
END UNION
UNION Ufile
    out_data AS DWORD
    errline  AS DWORD
END UNION

TYPE TFASM_STATE
    cond AS DWORD
    buff AS UBuff
    file AS UFile
END TYPE 

....
    LOCAL a1 AS STRING * 10000, pa1 AS STRING PTR, b1 AS STRING * 10000,  pb1 AS BYTE PTR, rez AS LONG, BIN_OUT AS STRING
    LOCAL FASM_STATE AS TFASM_STATE

    a1 = "здесь исходник" & $NUL:   pa1 = VARPTR(a1)
    b1 = STRING$(10000, 0): pb1 = VARPTR(b1)

    CALL fasm_Assemble (pa1, pb1,10000,100,0) to Rez

    TYPE SET FASM_STATE = LEFT$(b1, SIZEOF(TFASM_STATE))
    IF Rez THEN
         ?"Ошибка при ассемблировании!", 0
        EXIT ...
    END IF

    BIN_OUT = PEEK$(FASM_STATE.file.out_data, FASM_STATE.buff.out_len)

    OPEN "out.bin" FOR BINARY AS 1
    PUT$ 1, BIN_OUT
    CLOSE 1


Думаю пояснять ничего ненужно :)

Сделаю лицо с выводом и выложу ...

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Перевести FASM в PB

Сообщение DarkMachine » 06.04.2012 (Пт) 14:21

Вообщем программа готова, можно юзать.
Если ассемблирование прошло успешно, то результат выводится в шеснт-ом формате ниже, а также записывается бинарный файл MyFile.bin.
Ошибки выводятся в виде кода и номера линии.
Вложения
PB-FASM.ZIP
Архив с исходником
(33.12 Кб) Скачиваний: 211
flat1.jpg
Нормальное ассемблирование
flat1.jpg (16.32 Кб) Просмотров: 6744
flat2.jpg
Сообщение об ошибке + расширенная информация
flat2.jpg (15.78 Кб) Просмотров: 6744

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 06.04.2012 (Пт) 15:00

DarkMachine - спасибо! :) По-моему эта библиотека очень крутая вещь. Можно даже прикрутить полноценный встроенный ассемблер к VB6.

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Перевести FASM в PB

Сообщение DarkMachine » 06.04.2012 (Пт) 15:03

Да, классная вещь, можно много чего замутить, например встроить библиотеку в программу и надстроить как надо - ну там свой макро язык, мат аппарат т.д.
В принципе ПуреВасик так и делает :mrgreen:

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 06.04.2012 (Пт) 15:06

Кстати а EXE файлы эта библа создает? У меня есть подозрение, что
Код: Выделить всё
fasm_AssembleFile
на выходе как раз выдает исполняемый файл из скомпилированного асма.

Upd.

Да создает, компилит EXE прямо в бинарник. Только надо размер буферов увеличить до 120000.
Пример из аттача скомпилился в экзешку 5 кбайт
Вложения
windemo.zip
(2 Кб) Скачиваний: 225
Последний раз редактировалось jangle 06.04.2012 (Пт) 16:14, всего редактировалось 1 раз.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 06.04.2012 (Пт) 15:15

К примеру можно сделать простейший компилятор Бейсика, берем исходники BASM (Basic to Asm translator) http://www.bcxgurus.com/basm286.zip переделываем его вывод под FASM и получаем новый бейсик :idea:

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Перевести FASM в PB

Сообщение ger_kar » 06.04.2012 (Пт) 18:56

Написал демку.
FasmDemo.rar
Демка на PB
(27.49 Кб) Скачиваний: 221

Но как оказалось, я уже значительно опоздал, но так как она написана, выложу, не пропадать же трудам ;) . Посмотрел вариант DarkMachine, он конечно получше будет. Я почему то про локализацию и конкретизацию ошибок даже не думал. Вообще я просто копировал имеющийся пример. Так что не взыщите :)
Бороться и искать, найти и перепрятать

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Перевести FASM в PB

Сообщение DarkMachine » 06.04.2012 (Пт) 20:32

Определение версии.
Код: Выделить всё
    fVer = fasm_GetVersion()
    sVersion = USING$("#_.#", LO(WORD, fVer), HI(WORD, fVer))

Повер и нравится мне тем, что можно добится цели разными методами (например, реализация библиотеки у ger_kar своя :) ) - главное, это широкий спектр синтаксиса и возможности языка.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Перевести FASM в PB

Сообщение bon818 » 07.04.2012 (Сб) 4:37

jangle писал(а):
bon818 писал(а):FASM не знаю, но тоже интересно.
Где узнать по подробней об-этом?


Наверное только на форуме FASM`а

Понятно.
Это родная библиотека FASM`а .

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Перевести FASM в PB

Сообщение jangle » 09.04.2012 (Пн) 9:38

DarkMachine писал(а):Вообщем программа готова, можно юзать.
Если ассемблирование прошло успешно, то результат выводится в шеснт-ом формате ниже, а также записывается бинарный файл MyFile.bin.
Ошибки выводятся в виде кода и номера линии.


Не хочешь свой пример на официальном форуме PB опубликовать? Думаю там народ заинтересуется

DarkMachine
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 51
Зарегистрирован: 24.02.2012 (Пт) 15:58

Re: Перевести FASM в PB

Сообщение DarkMachine » 05.05.2012 (Сб) 20:34

Добавил полноценный обработчик ошибок. Теперь можно посмотреть текст ошибки и то место где она возникла в исходнике

Для вывода ошибки модифицировать код, где обрабатывается ошибка

Код: Выделить всё
   
    IF r THEN
       TYPE SET LINE_HEADER = PEEK$( FASM_STATE.file.errline, SIZEOF(TLINE_HEADER) )
       FUNCTION = Get_Fasm_Error_Msg ( inSrc$, FASM_STATE, LINE_HEADER)
       EXIT FUNCTION
    END IF

функция обработки ошибки
Код: Выделить всё
FUNCTION GET_FASM_ERROR_MSG ( BYVAL srcCode AS STRING, BYVAL FS AS TFASM_STATE, BYVAL LH AS TLINE_HEADER ) AS STRING
    LOCAL err_msg, f_state_msg, f_code_msg AS STRING

    f_state_msg = SWITCH$(FS.cond = 0,"OK",_
                          FS.cond = 1,"WORKING",_
                          FS.cond = 2,"ERROR", _
                          FS.cond = -1,"INVALID PARAMETER",_
                          FS.cond = -2,"OUT OF MEMORY",_
                          FS.cond = -3,"ISTACK OVERFLOW",_
                          FS.cond = -4,"SOURCE NOT FOUND",_
                          FS.cond = -5,"UNEXPECTED END OF SOURCE",_
                          FS.cond = -6,"CANNOT GENERATE CODE",_
                          FS.cond = -7,"FORMAT LIMITATIONS EXCEDDED",_
                          FS.cond = -8,"WRITE FAILED")

    IF FS.cond = 2 THEN
       err_msg = "Error " & LTRIM$(STR$(FS.buff.errcode)) & ": " & READ$(ABS(FS.buff.errcode+100)) & $CRLF & _
                 " Line " & LTRIM$(STR$(LH.line_number)) & ": " & PARSE$(srcCode, $CRLF, LH.line_number)
    ELSEIF FS.cond = 0 THEN
       err_msg = "Compiled OK."
    ELSEIF FS.cond = 1 THEN
       err_msg = "Working ..."
    ELSE
       err_msg = "Compilation Aborted. " & f_state_msg
    END IF

    FUNCTION = err_msg
   
    DATA "FILE NOT FOUND","ERROR READING FILE", "INVALID FILE FORMAT", "INVALID MACRO ARGUMENTS", "INCOMPLETE MACRO"
    DATA "UNEXPECTED CHARACTERS", "INVALID ARGUMENT", "ILLEGAL INSTRUCTION", "INVALID OPERAND", "INVALID OPERAND SIZE"
    DATA "OPERAND SIZE NOT SPECIFIED", "OPERAND SIZES DO NOT MATCH", "INVALID ADDRESS SIZE", "ADDRESS SIZES DO NOT AGREE"
    DATA "PREFIX CONFLICT", "LONG IMMEDIATE NOT ENCODABLE", "RELATIVE JUMP OUT OF RANGE", "INVALID EXPRESSION"
    DATA "INVALID ADDRESS", "INVALID VALUE", "VALUE OUT OF RANGE", "UNDEFINED SYMBOL", "INVALID USE OF SYMBOL"
    DATA "NAME TOO LONG", "INVALID NAME", "RESERVED WORD USED AS SYMBOL",  "SYMBOL ALREADY DEFINED", "MISSING END QUOTE"
    DATA "MISSING END DIRECTIVE", "UNEXPECTED INSTRUCTION", "EXTRA CHARACTERS ON LINE", "SECTION NOT ALIGNED ENOUGH"
    DATA "SETTING ALREADY SPECIFIED", "DATA ALREADY DEFINED", "TOO MANY REPEATS", "SYMBOL OUT OF SCOPE", "USER ERROR", "ASSERTION FAILED"

END FUNCTION     


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList