lstrcpyA - (eax, edx)

Discussion in 'WASM.WIN32' started by nitrotoluol, Jul 21, 2007.

  1. nitrotoluol

    nitrotoluol New Member

    Blog Posts:
    0
    Joined:
    Sep 5, 2006
    Messages:
    848
    У кого Виндовс, отличная от ХП СП2 просьба проверить, что возвращает lstrcpyA в регистре edx,

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

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

    rain New Member

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

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    IMHO, это не от форточек зависит, а от компиляторов. А они все совершенствуются...
     
  4. rain

    rain New Member

    Blog Posts:
    0
    Joined:
    Apr 22, 2006
    Messages:
    976
    KeSqueer не шарите
     
  5. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    rain
    Поясните, в чем не прав.
    А, Вы наверное подумали, ... Короче, я имел ввиду компилятор, которым систему собирали.
     
  6. rain

    rain New Member

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    rain
    отнюдь не от звезд а от того, как компилятор (!), которым собирали систему, собрал функцию lstrcpy.
    А именно как он юзал регистр EDX.
     
  8. rain

    rain New Member

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

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    rain
    Дык и я про тоже.
     
  10. rain

    rain New Member

    Blog Posts:
    0
    Joined:
    Apr 22, 2006
    Messages:
    976
    KeSqueer тогда простите за пост #4 слово "компиляторы" меня как-то сбило с толку
     
  11. CnCVK

    CnCVK New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2006
    Messages:
    108
    Ну там специальный компилятор - зачем он часто вставляет в начало функции MOV EDI,EDI.

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

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

    Между прочим выгодней использовать strcpy & strlen чем win32 API функции - 80% они будут встроены (в cl)в виде:
    Code (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

    Blog Posts:
    0
    Joined:
    Jun 2, 2007
    Messages:
    26
    Между прочим, в Delphi в исходнике Source\System.pas много хороших готовых методов на asm'е.
    Например, процедуру Move можно и в asm'е использовать, если немного переделать:
    Code (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
    Использовать для перемещений ВЕЗДЕ! :

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

    Asterix New Member

    Blog Posts:
    0
    Joined:
    Feb 25, 2003
    Messages:
    3,576
    чтобы программу можно было переносить не нужно полагаться на недокументированные фичи ;)
     
  14. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    А разве lstrcpy не длину строки возвращает? Тогда и конец найти можно одним сложением.
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Blog Posts:
    0
    Joined:
    May 7, 2007
    Messages:
    431
    KeSqueer
    Нет, вот цитата по поводу возвращаемого значения If the function succeeds, the return value is a pointer to the buffer.
     
  16. asmlamo

    asmlamo Well-Known Member

    Blog Posts:
    0
    Joined:
    May 18, 2004
    Messages:
    1,742
    ... не советую
     
  17. CnCVK

    CnCVK New Member

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

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    CnCVK
    И как, простите, запись длины в начале избавит от переполнения?
     
  19. CnCVK

    CnCVK New Member

    Blog Posts:
    0
    Joined:
    Aug 9, 2006
    Messages:
    108
    Запись длины в начале позволит очень легко контролировать строки (точнее их размер).
    И не надо постояно 'считать' символы до нуля. (трата времени)
     
  20. Mental_Mirror

    Mental_Mirror New Member

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