Как подключить библиотеку stdio в FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем Antolflash, 8 апр 2009.

Статус темы:
Закрыта.
  1. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Возник вопрос ввода-вывода вещественных чисел. Писать самостоятельно перевод символов в число - нет желания. Как подключить библиотеку stdio ? В папке fasm я не нашёл inc файла с описанием этой библиотеки.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    какую еще stdio?
     
  3. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Эта которая в сях #include <stdio.h> со scanf и printf
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    замени фасм на Си и просто напиши <stdio>
    а тебе зачем? что на фасме нет нормальных средств ввода/вывода
     
  5. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    А затем, что у меня есть задание по лабе по инфе, связанное с сопроцессором. Синтаксис сопроцессора под asm вставки в MVS я не нашёл, зато синтаксис FASM для сопроцессора я знаю.
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    хорошо. фасм может создавать объектные файлы. помещаете нужный код в объектный файл и линкуете его к проекту на Си
     
  7. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    А синтаксис сопроцессора для ассемблерной вставки в MVS подсказать нельзя?
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    можно, но Предложенный вариант мне больше по вкусу. не люблю си.
     
  9. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Хехе... Я на практике не умею линковать два объектных файла(
     
  10. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    И всё-таки. Как организовать ввод-вывод вещественных чисел в FASM?
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Импортировать msvcrt.dll, юзать MS COFF и внешний линкер или написать свой велосипед.
    Код (Text):
    1. ;Копипаста для первого:
    2.         library kernel32,'KERNEL32.DLL',\
    3.                 msvcrt32,'MSVCRT.DLL',\
    4.                 user32,'USER32.DLL'
    5.         include 'api/kernel32.inc'
    6.         import  msvcrt32,\              ;Warning! С library uses ccall (cdecl)!
    7.                 vsnprintf,'_vsnprintf'
    8.         include 'api/user32.inc'
    Код (Text):
    1. ;Второй вариант (линкер от MSVC6):
    2. ;fasm foo.asm foo.obj
    3. ;link foo.obj libc.lib
    4.  
    5.         format  ms coff
    6.  
    7. public main as '_main'
    8. extrn '_printf' as printf
    9. extrn '__fltused' as fltused ; Нужно, чтобы MSVC инициализировал работу с FP.
    10.  
    11. main:
    12.         push    dword[x+4]
    13.         push    dword[x+0]
    14.         push    fmt
    15.         call    printf
    16.         add     esp,4*3
    17.         retn
    18.  
    19.  
    20. x       dq      3.1415926536 ; double.
    21. fmt     db      '%8.3f',0
    Велосипед сам.
     
  12. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Код (Text):
    1. format pe console
    2. include 'C:\FASM_WINDOWS\include\win32a.inc'
    3. xor eax,eax
    4. xor ecx,ecx
    5. mov ch,0x61
    6. mov cl,0x1E
    7. mov ah, 0x05
    8. int 0x16
    9.  
    10. push 0
    11. call [ExitProcess]
    12. section 'import' import data readable
    13. library kernel32,'kernel32.dll'
    14. include 'C:\FASM_WINDOWS\include\api\kernel32.inc'
    Насколько я понимаю прерывания биоса с винды я запустиить не могу из-за защищённого режима?
     
  13. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Код (Text):
    1. format pe console
    2. include 'C:\FASM_WINDOWS\include\win32a.inc'
    3.  
    4.  
    5.  push    dword[x+4]
    6.         push    dword[x+0]
    7.         push    fmt
    8.         call    printf
    9.         add     esp,4*3
    10.         retn
    11.  
    12.  
    13. x       dq      3.1415926536 ; double.
    14. fmt     db      '%8.3f',0
    15.  
    16.  
    17. push 0
    18. call [ExitProcess]
    19.  
    20.  
    21.  
    22. section 'import' import data readable
    23. library kernel32,'KERNEL32.DLL',\
    24. msvcrt32,'MSVCRT.DLL',\
    25. user32,'USER32.DLL'
    26. include 'C:\FASM_WINDOWS\INCLUDE\api\kernel32.inc'
    27. import  msvcrt32,\              ;Warning! Ñ library uses ccall (cdecl)!
    28. vsnprintf,'_vsnprintf'
    29. include 'C:\FASM_WINDOWS\INCLUDE\api\user32.inc'
    Пишет что не знает он printf
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    нет из-за винды. а вообще правильно советуют. попробуй использовать mscvrt.
    push s0
    call [LoadLibraryA]
    push s1
    push eax
    call [GetProcAddress]
    push dword[x+4]
    push dword[x+0]
    push fmt
    call eax
    add esp, 12
    ret
    s0 db 'msc<какая-то гадость, не помню какая>XX.dll',0;Вместо XX - номер версии 60/70 или другая
    s1 db '<какие-то закорючки, которые я не могу посмотреть т.к. они в каждой библиотеке разные>printf<какие-то закорючки, которые я не могу посмотреть т.к. они в каждой библиотеке разные>', 0
    x dq 3.3
    fmt db '%f', 0
    вот примерно так
    ADD: сорри. забыл
     
  15. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Что значит [h] и fmt???
    Откуда они беруться??? Я убил весь день, и ничего нового не понял. Можно где-либо найти работающий кусок FASM когда по вводу-выводу вещественных чисел в консоли?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. NTSTATUS
    2. Ke386CallBios (
    3.     IN ULONG BiosCommand,
    4.     IN OUT PCONTEXT BiosArguments
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function invokes specified ROM BIOS code by executing
    12.     "INT BiosCommand."  Before executing the BIOS code, this function
    13.     will setup VDM context, change stack pointer ...etc.  If for some reason
    14.     the operation fails, a status code will be returned.  Otherwise, this
    15.     function always returns success regardless of the result of the BIOS
    16.     call.
    17.  
    18.     N.B. This implementation relies on the fact that the direct
    19.          I/O access operations between apps are serialized by win user.
    20.  
    21. Arguments:
    22.  
    23.     BiosCommand - Supplies which ROM BIOS function to invoke.
    24.  
    25.     BiosArguments - Supplies a pointer to the context which will be used
    26.                     to invoke ROM BIOS.
    27.  
    28. Return Value:
    29.  
    30.     NTSTATUS code to specify the failure.
    31.  
    32. --*/
     
  17. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Clerk Я прочёл (благо английский знаю) ваше сообщение, но ничего конкретно не понял. Разве сложно знающему человеку привести работающий кусок компилящегося FASM кода, который просто организует ввод-вывод действительных чисел с плавающей точкой. Это всё, что требуется. Да, и ещё возник вопрос, как храняться вещественные числа в памяти?
     
  18. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Блин. Я привёл работающий кусок. Насчёт варианта с импортом, я же сказал, что копипаста, естественно, нужно было printf вместо vsnprintf прописать. Сложно догадаться?
    Код (Text):
    1.         format  pe console
    2.         entry   start
    3.         include 'win32a.inc'
    4.  
    5. start:
    6.         finit
    7.         fldpi
    8.         fstp    qword[x]
    9.         push    dword[x+4]
    10.         push    dword[x+0]
    11.         push    fmt
    12.         call    [printf]
    13.         add     esp,4*3
    14.         retn
    15.  
    16. fmt     db      '%12.9f',0x0d,0x0a,0
    17. x       dq      ?
    18.  
    19.         data    import
    20.         library msvcrt,'msvcrt.dll'
    21.         import  msvcrt,\
    22.                 printf,'printf'
    23.         end     data
    Формат хранения чисел гуглится.
    fmt db 'что-то там',0 – форматная строка, первый аргумент для printf.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Antolflash
    Ты спросил как заюзать прерывание биоса, я тебе дал прототип функции, посредством которой ты заюзаешь свои прерывания(неважно наверно что VDM).
    Остальное лень печатать.
     
  20. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Огромное спасибо за работающий код. Догадаться можно, имея работающий пример. Я в ассемблере прогал только вставками, и никак более, что вы ожидаете?
     
Статус темы:
Закрыта.