Оптимизация патча

Тема в разделе "WASM.BEGINNERS", создана пользователем Sturgeon, 14 окт 2007.

  1. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Здравствуйте!
    Вот пытаюсь написать шаблон для патча. В принципе уже написал, проверил. Все работает. Но есть вопро по самому алгоритму патча.
    Я реализовал это таким образом:
    Код (Text):
    1. ; Задаем две строки. В первой адреса. Во втрой байты, которые по этим адресам должны быть записаны
    2. lFileOffset     dd 596F0h,596F1h,596F2h,596F3h,596F4h,0     ;смещения для патча
    3. BytesToWrite    db 8Bh,45h,0FCh,90,90         ;байты для патча
    4. ............................................................
    5. ; ставим указатель на заданное смещение
    6.  
    7.     mov esi,0                   ;в esi адрес смещения
    8.     mov edi,0                   ;в edi указатель на байт для патча
    9. Next_offset:
    10.     mov eax,lFileOffset[esi]    ;В еах очередной адрес для патча
    11.     cmp eax,0
    12.     je write_OK
    13.  
    14.         invoke SetFilePointer,hFile,eax,NULL,FILE_BEGIN
    15.         cmp eax,-1
    16.         jne @F
    17.        
    18.         mov ebx,offset szErrFilePtr
    19.         call print_str
    20.         jmp error                        ; если ошибка, то переход на сообщение о ошибке
    21. @@:
    22. ;----------------------------------------
    23. ; Записываем байты в файл
    24.  
    25.     lea eax,BytesToWrite[edi]       ; в еах указатель на байт из строки BytesToWrite
    26.  
    27.         invoke WriteFile,hFile,eax,1,offset lBytesWriten,NULL
    28.         test eax,eax
    29.         jne @F
    30.        
    31.         mov ebx,offset szErrWriteFile ;
    32.         call print_str
    33.         jmp error                        ; если ошибка, то переход на сообщение о ошибке
    34.  
    35. @@:
    36.     add esi,4
    37.     add edi,1
    38.     jmp Next_offset
    39. write_OK:
    Вроде все работает. Но мне кажется как то криво написан код. Подскажите как его можно записать более правильно. Я не слишком искушен в программировании, но код, написанный знающими людьми кажется простым, понятным и красивым. Мой код мне таким не кажется.
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    mov reg,0 <=> xor reg,reg
    cmp reg,0 <=> test reg,reg
    cmp reg,-1 <=> dec reg jz label inc reg
    add reg,1 <=> inc reg
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    лучше юзать один индексный регистр.
     
  4. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Вроде получилось. Ты примерно это имел ввиду?

    mov eax,lFileOffset[esi*4]
    ...................
    lea eax,BytesToWrite[esi]

    Я просто с первого раза не догнал как одним регистром смещать указатель, то на один, то на четыре байта.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Sturgeon
    ваш код не будет работать на больших файлах
     
  6. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Asterix
    А почему, если не секрет?. И с какого размера файл можно считать большим?
    Я вот и спрашиваю, чтобы понять свои ошибки, чему-то научиться.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Sturgeon
    чтобы не повторятся рекомендую почитать в msdn справку по SetFilePointer,
    там написано и про размер файлов и есть примеры кода
     
  8. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Ну, 2-х гигабайт я думаю мне за глаза хватит:)
    Но в целом информация интересная. Если что, буду знать в каком направлении смотреть. Спасибо, что обратили мое внимание на этот момент.