lstrcpyA - (eax, edx)

Тема в разделе "WASM.WIN32", создана пользователем nitrotoluol, 21 июл 2007.

  1. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    У кого Виндовс, отличная от ХП СП2 просьба проверить, что возвращает lstrcpyA в регистре edx,

    На ХП в еdx - указатель на конец результирующей строки.

    Чтобы программу можно было переносить, мне нужно узнать, это особенность конкретной реализации либо во всех виндах функция ведет себя подобным образом, т.е. хочу узнать, стоит ли после копирования самостоятельно искать конец строки, либо можно положиться на АПИшку.
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    имхо не стоит, лучше написать пару лишних строк кода
    upd:
    под xp sp1 x64 (wow) в еdx там адрес конца строки (следующего за нулевым символом байта)
    w2k3 sp1 -- то-же самое
    w2k sp4 -- длина строки вместе с нулевым символом
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    IMHO, это не от форточек зависит, а от компиляторов. А они все совершенствуются...
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    KeSqueer не шарите
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    rain
    Поясните, в чем не прав.
    А, Вы наверное подумали, ... Короче, я имел ввиду компилятор, которым систему собирали.
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    :) сожелею мой друг но компиляторы тут не при чём.
    всё дело в так называемых соглашениях вызова (поиск по "calling conventions") в частности о __stdcall (х64 родную архитектуру не в счёт). Компилятор которым собирает M$ систему один, поэтому в данном случа результат (edx) будет зависеть только от него, а он в праве менять edx как угодно, так что тут от звёзд все зависит
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rain
    отнюдь не от звезд а от того, как компилятор (!), которым собирали систему, собрал функцию lstrcpy.
    А именно как он юзал регистр EDX.
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    хм... ну конечно я же написал
    (компилятора)
    видать коряво изъяснился, естественно всё зависит _только от него_, но перёд зать что там будет (в edx), какие опции оптимизации выстявят, что нового в нём понапридумают MS это могут знать только звёзды
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    rain
    Дык и я про тоже.
     
  10. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    KeSqueer тогда простите за пост #4 слово "компиляторы" меня как-то сбило с толку
     
  11. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Ну там специальный компилятор - зачем он часто вставляет в начало функции MOV EDI,EDI.

    А вообще EDX может принимать любое значение - он ведь считается временным и не сохраняется.

    лучше добавляй длину от lstrlenA или от просто strlen.

    Между прочим выгодней использовать strcpy & strlen чем win32 API функции - 80% они будут встроены (в cl)в виде:
    Код (Text):
    1. mov      edi, [string]
    2. or       ecx, -1        
    3. xor      eax, eax      
    4. repne    scasb          
    5. not      ecx
    и в ECX длина строки :)
     
  12. tinok

    tinok New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2007
    Сообщения:
    26
    Между прочим, в Delphi в исходнике Source\System.pas много хороших готовых методов на asm'е.
    Например, процедуру Move можно и в asm'е использовать, если немного переделать:
    Код (Text):
    1. Move proc USES EDI ESI ECX, Source:DWORD, Dest:DWORD, Count:DWORD
    2.       MOV   ESI, Source
    3.       MOV   EDI, Dest
    4.       MOV   ECX, Count
    5.       CMP   EDI, ESI
    6.       JA    @1
    7.       JE    @2
    8.       SAR   ECX, 2
    9.       JS    @2
    10.       REP   MOVSD
    11.       MOV   ECX, Count
    12.       AND   ECX, 03H
    13.       REP   MOVSB
    14.       JMP   @2
    15.   @1: LEA   ESI, [ESI+ECX-4]
    16.       LEA   EDI, [EDI+ECX-4]
    17.       SAR   ECX, 2
    18.       JS    @2
    19.       STD
    20.       REP   MOVSD
    21.       MOV   ECX, Count
    22.       AND   ECX, 03H
    23.       ADD   ESI, 4-1
    24.       ADD   EDI, 4-1
    25.       REP   MOVSB
    26.       CLD
    27.   @2: RET
    28. Move Endp
    Использовать для перемещений ВЕЗДЕ! :

    Код (Text):
    1. invoke lstrlenA, pszStrSource
    2. inc eax
    3. invoke Move, pszStrSource, pszStrDest, EAX
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    чтобы программу можно было переносить не нужно полагаться на недокументированные фичи ;)
     
  14. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    А разве lstrcpy не длину строки возвращает? Тогда и конец найти можно одним сложением.
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    KeSqueer
    Нет, вот цитата по поводу возвращаемого значения If the function succeeds, the return value is a pointer to the buffer.
     
  16. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    ... не советую
     
  17. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Советую вообще не использовать эту тупые C строки - они вечно вызывают ошибки переполнения.
    Намного круче сделать как в pascale и в win ядре - длину в начало.
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    CnCVK
    И как, простите, запись длины в начале избавит от переполнения?
     
  19. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Запись длины в начале позволит очень легко контролировать строки (точнее их размер).
    И не надо постояно 'считать' символы до нуля. (трата времени)
     
  20. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Great
    Просто в UNICODE_STRING - есть поле "размер", а есть поле "максимальный размер". Вот в таких строках переполнить сложнее, потому как явное ограничение размера буфера, и забота по обработке ложиться на функцию обрабатывающую строку, а не на программиста, из-за которого обычно и происходят переполнения.