Есть строка, в которой могут находиться однобайтные символы с кодами 0xxxxxxx или двухбайтные символы с кодами 0aaaaaabbbbbb, которые в строке представляются парой байт 11aaaaaa, 10bbbbbb или в обратном порядке 10bbbbbb, 11aaaaaa. Например символ с кодом 777h в строке может быть представлен как 11011101, 10110111 или 10110111, 11011101. Необходимо написать функцию GetChar (кроме ret переходов быть не должно!), которая, получив указатель на строку в регистре esi, вернёт в регистре eax символ 0xxxxxxx и увеличит esi на 1, или вернёт 0aaaaaabbbbbb и увеличит esi на 2 (старшие байты eax при этом должны быть обнулены).
Пока вот такой вот монстр в 41 байт: Код (Text): GetChar: xor eax,eax lodsb cmp al,128 sbb edx,edx;-1 если al<128 cmc sbb ecx,ecx;-1 если двухбайтный символ and edx,eax;однобайтный символ или 0 mov ah,[esi] sub esi,ecx and eax,ecx xor ecx,ecx shl ah,2 shl al,2 rcl ecx,4 rol ax,cl;обмениваем AL<->AH если в AL был старший байт shr ah,2 shr eax,2 or eax,edx ret