fopen,fprintf и т.п?

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

  1. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Всем доброго времени суток. Думаю,что мне здесь помогут найти ответ на такой вот вопрос:можно ли в асме использовать эти функции;если да,то как это сделать(что подключить там). Работаю в RadAsm.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    подключить там логично, что libc, а использовать - как обычные cdecl функции внешние.
    Ну зашибись. А диалект языка может укажешь вместо IDE?)
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Например для fasm

    Код (Text):
    1.  push ebx
    2.  
    3.  cinvoke fopen, "text.txt", "a+"
    4.  mov ebx, eax  ; FILE*
    5.  ; add check for 0
    6.  cinvoke fprintf, ebx, "Hello, World!"
    7.  cinvoke fclose, ebx
    8.  
    9.  pop ebx
     
  4. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Согласен,забыл сказать упомянуть MASM)))
    Пожалуйста,можно немного поконкретней. Честно,не знаю какие libs для этой функции подключать.(Не с проста же задал вопрос для новичков))))))
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    CroCop
    libc.lib, лежит в каталоге lib, Visual Studio.
     
  6. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Спасибо.
    Сначала думал,что libc входит в пакет Masm)
     
  7. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Нашел я это libc.lib. Только вот также не хотят у меня работать эти функции(includelib сделал).
    ??
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Что значит не хотят?
     
  9. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    В общем вот что происходит.
    подключаю libc.lib
    Код (Text):
    1. includelib libc.lib;полный путь тоже пробовал
    Где-то в коде делаю,просто к примеру,следующее.
    Код (Text):
    1. ....
    2. push [hFile]
    3. call fprintf
    4. add esp,3*4
    5. ....
    На что мне RadAsm пишет что-то в таком типе:"Неверный символ fprintf"
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Символ(функцию) нужно объявить - EXTERN.
     
  11. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Booster
    Код (Text):
    1. extern fprintf:NEAR
    2. extern fflush:NEAR
    Взгляни,пожалуйста. Правильно ли я сделал?
    (и еще дайте ссыль на libc.lib,если не трундно)
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Забиваем на libc и юзаем msvcrt.

    Код (Text):
    1. .MODEL FLAT, STDCALL
    2.   EXTERN printf:NEAR
    3.  
    4.   INCLUDELIB d:\masm32\lib\user32.lib
    5.   INCLUDELIB d:\masm32\lib\kernel32.lib
    6.   INCLUDELIB d:\masm32\lib\shell32.lib
    7.   INCLUDELIB msvcrt.lib
    8. ;-----------------------------------------------
    9. _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
    10.     TEXT DB 'Hello %d', 0
    11. _DATA ENDS
    12. ;-----------------------------------------------
    13. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
    14. START:
    15.     PUSH 12345
    16.     PUSH OFFSET TEXT
    17.     CALL printf
    18.     ADD ESP, 8
    19.     PUSH 1
    20.     CALL ExitProcess@4
    21. _TEXT ENDS
    22. END START
    Линковать нужно с ключом /subsystem:console, иначе текста не будет видно.
    msvcrt на всякий случай - msvcrt.
     
  13. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Booster
    Прости за надоедливость,но не выходит никак.
    Сделал как ты советовал(создал новый проект,чтобы проверить)
    Код (Text):
    1. .386
    2. .MODEL Flat, STDCALL
    3. option casemap:none
    4. EXTERN fprintf:NEAR
    5. EXTERN fflush:NEAR
    6. EXTERN fopen:NEAR
    7.  
    8.  
    9.  
    10. include windows.inc
    11. include kernel32.inc
    12. include user32.inc
    13. include advapi32.inc
    14. include msvcrt.inc
    15.  
    16. includelib kernel32.lib
    17. includelib user32.lib
    18. includelib advapi32.lib
    19. includelib msvcrt.lib
    20.  
    21. .DATA
    22.   fileName db "1.txt",0
    23.   hFile    dd 0
    24. .DATA?
    25.  
    26. .CONST
    27.  
    28. .CODE
    29. start:
    30.     push offset fileName
    31.     call fopen
    32.     mov hFile,eax
    33.     .if hFile!=0
    34.         push offset fileName
    35.         push hFile
    36.         call fprintf
    37.     .endif
    38.     invoke ExitProcess,NULL
    39. end start
    Проект тоже прикрепил.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Что-то форум глючит не по-детски.

    Код (Text):
    1. .386
    2. .MODEL Flat, STDCALL
    3. option casemap:none
    4. EXTERN fprintf:NEAR
    5. EXTERN fflush:NEAR
    6. EXTERN fopen:NEAR
    7.  
    8.  
    9.  
    10. include windows.inc
    11. include kernel32.inc
    12. include user32.inc
    13. include advapi32.inc
    14. include msvcrt.inc
    15.  
    16. includelib kernel32.lib
    17. includelib user32.lib
    18. includelib advapi32.lib
    19. includelib msvcrt.lib
    20.  
    21. .DATA
    22.   fileaccess db "w", 0
    23.   fileName db "1.txt",0
    24.   hFile    dd 0
    25. .DATA?
    26.  
    27. .CONST
    28.  
    29. .CODE
    30. start:
    31.     push offset fileaccess
    32.     push offset fileName
    33.     call fopen
    34.     add esp, 8
    35.     mov hFile,eax
    36.     .if hFile!=0
    37.         push offset fileName
    38.         push hFile
    39.         call fprintf
    40.         add esp, 8
    41.     .endif
    42.     invoke ExitProcess,NULL
    43. end start
    После вызова нужно вручную выравнивать стек, так как cdecl. Ну и внимательно читаем документацию по параметрам функций.
     
  15. CroCop

    CroCop New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    23
    Огромное спасибо,Booster