Задачка по мотивам UTF-16 (оптимизация по размеру без переходов)

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

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Есть строка, в которой могут находиться однобайтные символы с кодами 0xxxxxxx или двухбайтные символы с кодами 0aaaaaabbbbbb, которые в строке представляются парой байт 11aaaaaa, 10bbbbbb или в обратном порядке 10bbbbbb, 11aaaaaa. Например символ с кодом 777h в строке может быть представлен как 11011101, 10110111 или 10110111, 11011101.
    Необходимо написать функцию GetChar (кроме ret переходов быть не должно!), которая, получив указатель на строку в регистре esi, вернёт в регистре eax символ 0xxxxxxx и увеличит esi на 1, или вернёт 0aaaaaabbbbbb и увеличит esi на 2 (старшие байты eax при этом должны быть обнулены).
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Сколько байт?
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Пока вот такой вот монстр в 41 байт:
    Код (Text):
    1. GetChar:
    2.     xor eax,eax
    3.     lodsb
    4.     cmp al,128
    5.     sbb edx,edx;-1 если al<128
    6.     cmc
    7.     sbb ecx,ecx;-1 если двухбайтный символ
    8.     and edx,eax;однобайтный символ или 0
    9.     mov ah,[esi]
    10.     sub esi,ecx
    11.     and eax,ecx
    12.     xor ecx,ecx
    13.     shl ah,2
    14.     shl al,2
    15.     rcl ecx,4
    16.     rol ax,cl;обмениваем AL<->AH если в AL был старший байт
    17.     shr ah,2
    18.     shr eax,2
    19.     or eax,edx
    20.     ret
     
  4. KeSqueer

    KeSqueer Сергей

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