как получить от cl.exe word ptr[xxx]

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 10 авг 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    cmp word ptr[esi+ecx],0x2020



    как добиться от cl.exe такой инструкции?

    if (*((short*) lpSource+i) == 0x2020) - это не идёт.

    Превращается в соответсвии с дурной привычкой подставлять размерность операнда в такое:

    cmp word ptr[esi+ecx*2],0x2020



    Два раза проверять на

    *((char*) lpSource+i) == 0x20 && *((char*) lpSource+i+1) == 0x20

    - на это он выдает буквально два сравнения

    cmp byte ptr[esi+ecx],20

    je _label

    cmp byte ptr[esi+ecx+1],20

    je _label



    Как-то должна генериться одна инструкция для word ptr?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Чему равно i?

    Afaik ecx*2 из-за (short *).
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Код (Text):
    1. int foo(char *src, int i)
    2. {
    3.   return *((short *)(src + i)) == 0x2020 ? 1 : 0;
    4. }
    5.  
    6.  
    7. _TEXT   SEGMENT
    8. _src$ = 8                       ; size = 4
    9. _i$ = 12                        ; size = 4
    10. _foo    PROC NEAR
    11. ; File c:\t.c
    12. ; Line 4
    13.     mov ecx, DWORD PTR _i$[esp-4]
    14.     mov edx, DWORD PTR _src$[esp-4]
    15.     xor eax, eax
    16.     cmp WORD PTR [edx+ecx], 8224        ; 00002020H
    17.     sete    al
    18. ; Line 5
    19.     ret 0
    20. _foo    ENDP
    21. _TEXT   ENDS
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Код без купюр (i не может быть больше 28):


    Код (Text):
    1. void copy_name(LPSTR lpDest, LPSTR lpSource){
    2.     [b]int  i=0;[/b]
    3.     while (i < 28){
    4.         *((char*) lpDest+i) = *((char*) lpSource+i);
    5.         if (*((short*) lpSource+i) == 0x2020) break;
    6.         i++;
    7.         }
    8.         *((char*) lpDest+i) = 0;
    9. }
    10.  
    11. ======================================================================  =
    12. 00401276  /$ 8B5424 04      MOV EDX,DWORD PTR SS:[ESP+4]
    13. 0040127A  |. 53             PUSH EBX
    14. 0040127B  |. 56             PUSH ESI
    15. 0040127C  |. 57             PUSH EDI
    16. 0040127D  |. 8B7C24 14      MOV EDI,DWORD PTR SS:[ESP+14]
    17. 00401281  |. 8BF7           MOV ESI,EDI
    18. 00401283  |. 33C9           XOR ECX,ECX
    19. 00401285  |. 8BC2           MOV EAX,EDX
    20. 00401287  |. 2BF2           SUB ESI,EDX
    21. 00401289  |> 8A1C06         /MOV BL,BYTE PTR DS:[ESI+EAX]
    22. 0040128C  |. 8818           |MOV BYTE PTR DS:[EAX],BL
    23. 0040128E  |. 66:813C4F 2020 |CMP WORD PTR DS:[[b]EDI+ECX*2[/b]],2020
    24. 00401294  |. 74 07          |JE SHORT FoneBook.0040129D
    25. 00401296  |. 41             |INC ECX
    26. 00401297  |. 40             |INC EAX
    27. 00401298  |. 83F9 1C        |CMP ECX,1C
    28. 0040129B  |.^7C EC          \JL SHORT FoneBook.00401289
    29. 0040129D  |> 5F             POP EDI
    30. 0040129E  |. 5E             POP ESI
    31. 0040129F  |. C60411 00      MOV BYTE PTR DS:[ECX+EDX],0
    32. 004012A3  |. 5B             POP EBX
    33. 004012A4  \. C3             RETN




    Не получается. Хотя i как и у тебя, int.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Ты хочешь проверить не являются ли два байта начиная с i-того двумя пробелами?

    Если да, то надо писать *((short*) (lpSource+i)).
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Если так:
    Код (Text):
    1. void copy_name2(char *dst, char *src)
    2. {
    3.   int i;
    4.   for (i = 28; i && 0x2020 != *((short *) src); i--)
    5.     *dst++ = *src++;
    6.   *dst = 0;
    7.   return ;
    8. }
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q



    Блин, изначально именно так и было:



    Остальной код видимо сбоил, поэтому в поисках причины и поубирал эти скобки. Поставил скобки на место - получается

    CMP WORD PTR DS:[EAX],2020

    Сам положил себе грабли :)



    Спасибо :)