FASM закрытие-открытие файла

Тема в разделе "WASM.ASSEMBLER", создана пользователем newb, 9 июн 2008.

  1. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Не могу написать, киньте исходник. Спасибо.
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Что именно?
    CreateFile/ReadFile/WriteFile/CloseHandle?
     
  3. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Ну для примера:
    1) скажем есть уже файл f1.txt, в нём записаны буквы "аабб"
    2) открываем файл f1 и читаем из него символы
    3) к аски коду каждого символа прибавляем 1h (буква меняется на следующую в алфавите) (E0+1h = б, E1+1h = в...)
    4)создаём новый файл f2.txt
    5)пишем туда результат (если вначале было "аабб", то сейчас "ббвв")

    програ позарез сегодня нужна, кто сделает, тому большой респект. Спасибо
    П.С. если это возможно, то не моглибы (use 64) но впринципе и на 32 тоже подойдёт.
     
  4. shurik

    shurik Александр

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    52
    Адрес:
    Украина
    newb
    Не могу написать или не хочу подумать и разобраться? :)
    Вот что у меня получилось. Тут в общем-то одни API вызовы и все. Ничего сложного.

    Код (Text):
    1. format PE GUI 4.0
    2. entry WINMAIN
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.   fin           db 'f1.txt',0
    8.   fout          db 'f2.txt',0
    9.  
    10.   hFile         dd      ?
    11.   lFile         dd      ?
    12.  
    13.   inbuf         dd      ?
    14.  
    15.   hFileO        dd      ?
    16.  
    17.   szFileWritten dd      ?
    18.   szReadByte    dd      ?
    19.  
    20. section '.code' code readable executable
    21.  
    22. proc WINMAIN  hInst, hprevinstance, lpcmdline, ncmdshow
    23.      invoke  CreateFile,\
    24.              fin,\
    25.              GENERIC_READ,\
    26.              0,\
    27.              NULL,\
    28.              OPEN_EXISTING,\
    29.              FILE_ATTRIBUTE_ARCHIVE,\
    30.              NULL
    31.      mov     [hFile],eax
    32.  
    33.      invoke  GetFileSize,[hFile],NULL
    34.      mov     [lFile],eax
    35.  
    36.      invoke  CreateFile,\
    37.              fout,\
    38.              GENERIC_READ or GENERIC_WRITE,\
    39.              FILE_SHARE_READ or FILE_SHARE_WRITE,\
    40.              NULL,\
    41.              CREATE_NEW,\
    42.              FILE_ATTRIBUTE_ARCHIVE,\
    43.              NULL
    44.      mov     [hFileO],eax
    45.  
    46.      xor     ecx,ecx
    47.      add     ecx,[lFile]
    48. @loop:
    49.      push    ecx
    50.  
    51.      invoke  ReadFile,[hFile],inbuf,1,szReadByte,NULL
    52.      add     [inbuf],1
    53.  
    54.      invoke  WriteFile,[hFileO],inbuf,1,szFileWritten,NULL
    55.  
    56.      pop     ecx
    57.      dec     ecx
    58.      jnz     @loop
    59.  
    60.      invoke  CloseHandle,[hFile]
    61.      invoke  CloseHandle,[hFileO]
    62.  
    63.      invoke  ExitProcess, 0
    64. endp
    65.  
    66. section '.idata' import data readable writeable
    67.  
    68.   library kernel32,'KERNEL32.DLL',\
    69.           user32,'USER32.DLL'
    70.  
    71.   include '%fasminc%/apia/kernel32.inc'
    72.   include '%fasminc%/apia/user32.inc'
     
  5. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Спасибо... Я вот как раз на рабочем примере разобраться хотел.
     
  6. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Код (Text):
    1. xor  ecx,ecx
    2. add ecx,[lFile] ; Вместо обоих инстр-ий - mov ecx,[hFile]
    3. ;---
    4. dec ecx
    5. jnz @loop ; Вместо обоих инстр-ий - loop @loop
     
  7. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Код (Text):
    1. xor  ecx,ecx
    2. add ecx,[lFile] ; Вместо обоих инстр-ий - mov ecx,[hFile]
    3. ;---
    4. dec ecx
    5. jnz @loop ; Вместо обоих инстр-ий - loop @loop
     
  8. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Код (Text):
    1. format PE GUI 4.0
    2. entry WINMAIN
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. null equ ebx
    7.  
    8. section '.data' data readable writeable
    9.   fin           db 'f1.txt',0
    10.   fout          db 'f2.txt',0
    11.  
    12.   hFile         dd      ?
    13.   lFile         dd      ?
    14.  
    15.   inbuf         dd      ?
    16.  
    17.   hFileO        dd      ?
    18.  
    19.   szFileWritten dd      ?
    20.   szReadByte    dd      ?
    21.  
    22. section '.code' code readable executable
    23.  
    24. proc WINMAIN uses ebx esi
    25.      
    26.      xor     ebx, ebx
    27.      
    28.      invoke  CreateFile,\
    29.              fin,\
    30.              GENERIC_READ,\
    31.              null,\
    32.              null,\
    33.              OPEN_EXISTING,\
    34.              FILE_ATTRIBUTE_ARCHIVE,\
    35.              null
    36.      mov     [hFile],eax
    37.  
    38.      invoke  GetFileSize,[hFile],null
    39.      mov     [lFile],eax
    40.  
    41.      invoke  CreateFile,\
    42.              fout,\
    43.              GENERIC_READ or GENERIC_WRITE,\
    44.              FILE_SHARE_READ or FILE_SHARE_WRITE,\
    45.              null,\
    46.              CREATE_NEW,\
    47.              FILE_ATTRIBUTE_ARCHIVE,\
    48.              null
    49.      mov     [hFileO],eax
    50.  
    51.      mov     esi,[lFile]
    52. @loop:
    53.  
    54.      invoke  ReadFile,[hFile],inbuf,1,szReadByte,null
    55.      inc     [inbuf]
    56.  
    57.      invoke  WriteFile,[hFileO],inbuf,1,szFileWritten,null
    58.  
    59.      dec     esi
    60.      jnz     @loop
    61.  
    62.      invoke  CloseHandle,[hFile]
    63.      invoke  CloseHandle,[hFileO]
    64.  
    65.      pop     esi
    66.      pop     ebx
    67.      invoke  ExitProcess, null
    68. endp
    69.  
    70. section '.idata' import data readable writeable
    71.  
    72.   library kernel32,'KERNEL32.DLL',\
    73.           user32,'USER32.DLL'
    74.  
    75.   include '%fasminc%/api/kernel32.inc'
    76.   include '%fasminc%/api/user32.inc'
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    zet а EBX тут причём?
    ADim loop очень тормознутая команда
     
  10. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    2FED
    loop может и тормознутная, да с чем сравнивать. В данном цикле вызываются ReadFile, WriteFile и сколько же сотых долей % времени будет тратить loop?
    А ebx тут делает короче инструкции push, в нем константа.
    ИМХО ebx не обязан сохраняться (http://www.wasm.ru/article.php?article=1005012), видимо надо использовать edi.
    И не надо под переменные в секции данных резервировать место, можно использовать стек через ebp (только не sub esp,xxx, а по получении очередного HANDLE - push eax), кроме того сохранение esi, ebx не требуется в начале, кому они будут нужны?
     
  11. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    ADim почему тогда записано push null а не push ebx?
    esi,edi и ebx надо сохранять, апи их вроде и не используют а вот у меня бывало так что программа падала изза того что не сохранил. и БСОДЫ бывали когда в драйверах не сохранях их значений. так что лучше перестраховатся;)
     
  12. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    2FED см. в исходном коде: null equ ebx
     
  13. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    ADim упс, не обратил внимания. но всёравно =)) почему не записать push ebx ? но уэто уже дело вкуса.
     
  14. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Надеюсь так всех устроит :)
    Код (Text):
    1. format PE GUI 4.0
    2. entry main
    3.  
    4. include '%fasminc%\win32ax.inc'
    5.  
    6. null equ ebx
    7.  
    8. section '.data' data readable
    9.   fin           db 'f1.txt',0
    10.   fout          db 'f2.txt',0
    11.  
    12. section '.code' code readable executable
    13.  
    14. proc main
    15. locals
    16.   hFile         dd ?
    17.   lFile         dd ?
    18.   inbuf         dd ?
    19.   hFileO        dd ?
    20.   szFileWritten dd ?
    21.   szReadByte    dd ?
    22. endl
    23.  
    24.      xor     ebx, ebx ; Init null
    25.      
    26.      invoke  CreateFile,\
    27.              fin,\
    28.              GENERIC_READ,\
    29.              null,\
    30.              null,\
    31.              OPEN_EXISTING,\
    32.              FILE_ATTRIBUTE_ARCHIVE,\
    33.              null
    34.      mov     [hFile],eax
    35.  
    36.      invoke  GetFileSize,[hFile],null
    37.      mov     [lFile],eax
    38.  
    39.      invoke  CreateFile,\
    40.              fout,\
    41.              GENERIC_READ or GENERIC_WRITE,\
    42.              FILE_SHARE_READ or FILE_SHARE_WRITE,\
    43.              null,\
    44.              CREATE_NEW,\
    45.              FILE_ATTRIBUTE_ARCHIVE,\
    46.              null
    47.      mov     [hFileO],eax
    48.  
    49.      mov     esi,[lFile]
    50. @loop:
    51.  
    52.      invoke  ReadFile,[hFile],addr inbuf,1,addr szReadByte,null
    53.      inc     [inbuf]
    54.  
    55.      invoke  WriteFile,[hFileO],addr inbuf,1,addr szFileWritten,null
    56.  
    57.      dec     esi
    58.      jnz     @loop
    59.  
    60.      invoke  CloseHandle,[hFile]
    61.      invoke  CloseHandle,[hFileO]
    62.  
    63.      invoke  ExitProcess, null
    64. endp
    65.  
    66. section '.idata' import data readable writeable
    67.  
    68.   library kernel32,'KERNEL32.DLL',\
    69.           user32,'USER32.DLL'
    70.  
    71.   include '%fasminc%/api/kernel32.inc'
    72.   include '%fasminc%/api/user32.inc'
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Если количество итераций в цикле не велико, то LOOP займёт меньше кода. Но если итераций много, то конечно DEC/JNZ быстрее. Как-то давно я переводил один парсер из С в ассемблер. Ну там, обычное дело - грузим файл целиком в память и побайтно вперёд! Замерил скорость - сишный вариант (в релизе) скорее на где-то 25% - что за дела?! Стал смотреть сишный код в дизассемблере - и естественно, вместо LOOP (который я поставил в ассемблере) компилятор VC++ поставил пару DEC/JNZ. Заменил, замерил снова - всё примерно сравнялось по времени.
     
  16. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    zet
    Человека, создавшего пост, должно устроить и так и сяк, ему же надо бы только ReadFile/WriteFile, видимо, что-то вроде лабораторной работы?
    А касательно LOCALS: повлечет за собой (считайте байты кода): push ebp, mov ebp,esp, sub esp,xxx и в эпологе что-то наподобие: mov esp,ebp, pop ebp. Это раз. Для каждой инициализации переменных: hFile, hFileO, lFile требуется mov [ebp-xxx],eax. Это два. Если же не использовать LOCALS, а по получении возвращаемых значений CreateFile, GetFileSize заталкивать в стек, тогда:
    1) пролог - push ebp mov ebp,esp без sub esp,xxx 2) эпилог - pop ebp без mov esp,ebp 3) инициализация переменных - push eax (1 байт) против 3-х mov [ebp-xxx],eax. Только для данного случая сохранять и восстанавливать ebp не нужно, процедура-то оканчивается ExitProcess.
    Доступ к таким переменным ничем не отличается от вашего подхода, только теперь придется считать отрицательное смещение, компилятор за Вас этого более делать не будет.
    Счетчик цикла можно в esi не заносить, т.к. либо он будет сидеть в кэше и тогда доступ будет осуществляться быстро, либо очень "медленно", но это означает, что др. процессы заняли столько времени, что им даже удалось очистить кэш.
    Ну, и 0-й размер файла тоже не проверяется.
    Для пролога fasm использует enter?
    Полный оффтоп...
     
  17. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Ой, забыл, забыл! Если последовательно заталкивать в стек HANDLE файлов после CreateFile, то и для CloseHandle не потребуется в стек помещать их снова, они уже там.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ADim AsmGuru62
    Как это тут можно вообще говорить о скорости, loop по сравнению с ReadFile капля в море :lol: D
     
  19. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Clerk
    Как можно говорить о понимании, если топик не читал? См. выше...
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ADim
    Да почитал, ничего не понял.
    Травка хороша да ?))