завершить процедуру с кодом 0

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

  1. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    привет всем. а как в fasm можно выйти из процедуры, возвратив 0? дело в том, что пытаюсь сделать callback функцию для работы с sqlite3. если пишу просто ret, то после sqlite3_exec возвращается код 4. почитал на сайте sqlite про это и там говорится, что если функция возвращает отличное от нуля значение, то sqlite3_exec завершается и возвращает 4.

    спасибо.
     
  2. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    xor eax, eax :) спасибо всем))
     
  3. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    =/ все равно почему-то падает... на 4 строке в eax почему-то оказывается текст из БД, который я выбираю и на этом функция падает =/

    вот код:

    Код (Text):
    1. section '.code' code readable executable
    2.   main:
    3.         invoke  sqlite3_open, dbName, hdb
    4.         invoke  sqlite3_exec, [hdb], sql, CallBack, 0, 0
    5.         invoke  sqlite3_close, [hdb]
    6.         invoke  ExitProcess, 0
    7.  
    8. proc CallBack notUsed, coln, rows, colnm
    9.         invoke  MessageBox,
    10.         sub     eax, eax
    11.         ret
    12. endp
     
  4. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    на недописанный MessageBox не обращаем внимания :)
     
  5. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    Под отладчиком проверь да и все!
     
  6. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    ну я с отладчиком пока на вы :) просто глянул в олли, что падает при помещении в буфер текста из БД. =/ глянул на форуме fasm'a - вроде делаю все тоже самое.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    e4key
    Что это такое ?
    Под этим именем может быть всё что угодно, я могу так загрузчик оси обозвать. Изучать правила форума, иначе топик следует закрыть.
     
  8. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    sqlite3 - субд) sqlite3_open - функция открытия бд.

    вот импорт:

    Код (Text):
    1. section '.idata' import data readable writeable
    2.   library kernel32, 'kernel32.dll',\
    3.           user32, 'user32.dll',\
    4.           sqlite3, 'sqlite3.dll'
    5.  
    6.   import sqlite3,\
    7.          sqlite3_open, 'sqlite3_open',\
    8.          sqlite3_exec, 'sqlite3_exec',\
    9.          sqlite3_close, 'sqlite3_close'
    10.  
    11.   include 'api\kernel32.inc'
    12.   include 'api\user32.inc'
    вот данные:
    Код (Text):
    1. hdb           dd ?
    2. dbName        db 'signons.sqlite', 0
    3. sql           db 'SELECT hello FROM hello_table', 0
     
  9. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Вынос мозга. Аккуратнее с моим накуренным мозгом =\
     
  10. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Всё бы хорошо, НО не понятно какой тип вызова CallBack. Если она stdcall то может стоит написать ret 10h? Зачем юзать масмовские макросы? Может в них и проблема?
     
  11. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    что именно имелось ввиду?
     
  12. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    почему то первые 3 строки читаются нормально, а на 4 приложение падает
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Ну у нормальных людей это простая СУБД на файлах такая, причем очень известная. И упоминание её названия вполне достаточно, чтобы дать понять, о чем идет речь. В любом случае, если ты встречаешь незнакомое название - just google it
     
  14. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Код (Text):
    1. proc CallBack c,notUsed, coln, rows, colnm ;c значит cdecl-конвенция вызова.
    2. ;ну и тут параметры в MessageBox наверное нужно?
    3. xor eax,eax
    4. ret
     
  15. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Мда, и endp, конечно же [верните редактирование]
     
  16. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    iZzz32, спасибо :)
     
  17. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Оффтопик, чтобы ещё кто не напоролся:
     
  18. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    iZzz32, да несколько неожиданно))

    а как вывести то, что получилось? ) пробую через wsprintf, результат - коразябры)
     
  19. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    получается нормально обработать только coln - число столбцов :) а текст не выходит =/
     
  20. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Код (Text):
    1. ;------------------------------------------------------------------------------;
    2. ; Compile with flat assembler v1.68+, <http://flatassembler.net/download.php>. ;
    3. ;------------------------------------------------------------------------------;
    4.         format  pe gui 4.1
    5.         entry   start
    6.         include 'win32a.inc'
    7.  
    8. start:
    9.         ccall   [sqlite3_open],dbName,hdb
    10.         test    eax,eax
    11.         jnz     .error
    12.  
    13.         ccall   [sqlite3_exec],[hdb],sql,CallBack,0,0
    14.         test    eax,eax
    15.         jnz     .error
    16.  
    17.         ccall   [sqlite3_close], [hdb]
    18.         xor     eax,eax
    19.         retn
    20.  
    21.     .error:
    22.         ccall   [sqlite3_errmsg],[hdb]
    23.         ccall   [wsprintf],errormsg,errorfmt,eax
    24.         stdcall [MessageBox],0,errormsg,title,MB_ICONERROR
    25.         ccall   [sqlite3_close],[hdb]
    26.         xor     eax,eax
    27.         inc     eax
    28.         retn
    29.  
    30. proc CallBack c,data,nCols,values,headers
    31.         push    ebx edi
    32.         xor     ebx,ebx
    33.         mov     edi,dumpbuff
    34.         mov     [edi],bl                ; Очищаем буфер.
    35.     .loop_dump:
    36.         mov     eax,[values]            ; Берём указатель на массив.
    37.         mov     eax,[eax+ebx*4]         ; Читаем элемент номер ebx (указатель уже на строку).
    38.         mov     edx,[headers]
    39.         mov     edx,[edx+ebx*4]
    40.         ccall   [wsprintf],edi,dumpfmt,edx,eax
    41.         add     edi,eax
    42.         inc     ebx
    43.         cmp     ebx,[nCols]
    44.         jb      .loop_dump
    45.  
    46.         stdcall [MessageBox],0,dumpbuff,title,MB_ICONINFORMATION
    47.         xor     eax,eax
    48.         pop     edi ebx
    49.         ret
    50. endp
    51.  
    52.  
    53.  
    54.  
    55.  
    56. title           db      'SQLite Demo',0
    57. errorfmt        db      'SQLite error: %s',0
    58. dumpfmt         db      '%s',0x09,'= %s',0x0d,0x0a,0
    59. dbName          db      'foo.sqlite',0
    60. sql             db      'SELECT date(''now''), sqlite_version(), COUNT(*) FROM sqlite_master',0
    61. hdb             dd      ?
    62. errormsg        rb      1024
    63. dumpbuff        rb      1024
    64.  
    65.  
    66.         data    import
    67.         library kernel32,'kernel32.dll',\
    68.                 user32,'user32.dll',\
    69.                 sqlite3,'sqlite3.dll'
    70.  
    71.         include 'api/kernel32.inc'
    72.         include 'api/user32.inc'
    73.         import  sqlite3,\
    74.                 sqlite3_open,'sqlite3_open',\
    75.                 sqlite3_exec,'sqlite3_exec',\
    76.                 sqlite3_errmsg,'sqlite3_errmsg',\
    77.                 sqlite3_close,'sqlite3_close'
    78.         end     data
    stdcall [foo],bar,baz == invoke foo,bar,baz
    ccall [foo],bar,baz == cinvoke foo,bar,baz
    В SQLite везде cdecl и, соответственно, ccall/cinvoke.

    А выводить – в values/headers тебе дают указатель на массив указателей на строки (адрес массива адресов строк :derisive:). Разбирайся.