Задачка о разбиении на строки (оптимизация по размеру)

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 10 июн 2008.

  1. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    KeSqueer
    + retn 4, т.к. "Функция должна быть STDCALL" (C) Black_mirror
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    KeSqueer
    0040101C 40 INC EAX <- должно быть INC ECX
    А длина 31, можешь пересчитать байты :)

    q_q
    У меня решение от решения KeSqueer не сильно отличается:
    Код (Text):
    1. 00402000 59             pop    ecx
    2. 00402001 5A             pop    edx
    3. 00402002 4A             dec    edx
    4. 00402003 42             inc    edx
    5. 00402004 8B02           mov    eax,[edx]
    6. 00402006 3C00           cmp    al,00
    7. 00402008 7412           je     0040201C
    8. 0040200A 340A           xor    al,0A
    9. 0040200C 7404           je     00402012
    10. 0040200E 3407           xor    al,07
    11. 00402010 75F1           jne    00402003
    12. 00402012 8602           xchg   [edx],al
    13. 00402014 30E0           xor    al,ah
    14. 00402016 42             inc    edx
    15. 00402017 3C07           cmp    al,07
    16. 00402019 7501           jne    0040201C
    17. 0040201B 42             inc    edx
    18. 0040201C 92             xchg   edx,eax
    19. 0040201D FFE1           jmp    ecx
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    пролог:
    pop eax
    pop ecx
    push eax
    ;...
    retn 0

    либо как у Black_mirror:
    pop ecx
    pop edx
    ;...
    jmp ecx
     
  4. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    KeSqueer
    xor al, 0x0D xor 0x0A
    элегантно :)
    взял на вооружение
     
  5. q_q

    q_q New Member

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

    Black_mirror
    00402004 8B02 mov eax,[edx]
    Тут возможны проблемы.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    q_q
    Тогда пишем mov al,[edx], а вместо xor al,ah/inc edx пишем inc edx/xor al,[edx].
     
  7. q_q

    q_q New Member

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

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Оказывается эту задачку можно решить и в 30 байт. А кто сможет в 29?
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Неужели никто не выбросит лишний байт чтобы их стало хотя бы 30?
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Это-то запросто:
    Код (Text):
    1.     pop ecx
    2.     pop edx
    3. .loop:
    4.     mov al, [edx]
    5.     cmp al, 0
    6.     jz  .end
    7.     inc edx
    8.     xor al, 0xA
    9.     jz  @f
    10.     xor al, 0xD xor 0xA
    11.     jne .loop
    12. @@:
    13.     xchg    [edx-1], al
    14.     xor al, [edx]
    15.     cmp al, 0xD xor 0xA
    16.     jne .end
    17.     inc edx
    18. .end:
    19.     xchg    edx, eax
    20.     jmp ecx