Что-то очень мелкие задачки народ решать не стал (только leo предложил вариант с весьма оригинальным методом получения масок), то ли задачки оказались сложные или не интересные, то ли народ просто отдыхал, но рискну предложить еще одну задачку. В регистрах EAX,EBX и ECX находятся 3 различных числа в диапазоне от 0 до 2^32-1, нужно написать оптимизированный по размеру код без переходов, который запишет в EAX число от 0 до 5, в зависимости от того, как упорядочены EAX,EBX и ECX: Если EAX<EBX<ECX, то EAX=0 Если EAX<ECX<EBX, то EAX=1 Если EBX<EAX<ECX, то EAX=2 Если EBX<ECX<EAX, то EAX=3 Если ECX<EAX<EBX, то EAX=4 Если ECX<EBX<EAX, то EAX=5 Думаю что как использовать SBB и ADC народ еще не забыл Усложнённая задачка: диапазон чисел от -2^31 до 2^31-1. Quantum Исправил.
37 байт Код (Text): xor esi,esi zn@0 db 50h ;0 @1 db 56h @2 db 52h ;2 @3 db 53h ;3 @4 db 51h ;1 @5 db 54h ;4 @6 db 56h @7 db 55h ;5 push ecx sub ecx,ebx rcl esi,1 sub ebx,eax rcl esi,1 pop ecx sub ecx,eax rcl esi,1 xor eax,eax mov al,zn@0[esi] and al,0fh add esp,8*4
Вместо Код (Text): push ecx sub ecx,edx ;... pop ecx достаточно cmp ecx,edx (-2 байта). И ещё -1, если вместо: Код (Text): xor eax,eax mov al,zn@0[esi] and al,0fh сделать так: Код (Text): mov al,zn@0[esi] and eax,0fh
27 байт mov edx, ecx cmp eax, ebx rcl ecx, 1 cmp ebx, edx rcl ecx, 1 cmp eax, edx rcl ecx, 1 and ecx, 7 mov eax, 000001010011100101b shr eax, cl and eax, 7
упс ошибочка вышла 31 байт mov edx, ecx cmp eax, ebx rcl ecx, 1 cmp ebx, edx rcl ecx, 1 cmp eax, edx rcl ecx, 1 and, ecx, 7 lea cx, [ecx+2*ecx] mov eax, 000 000 001 101 010 011 000 110 b shr eax, cl and eax, 7
Quantum А я и забыл про cmp 29 байт xor esi,esi mov edi,50413200h cmp ecx,ebx rcl esi,1 sub ebx,eax rcl esi,1 sub ecx,eax rcl esi,3 mov ecx,esi ror edi,cl mov eax,edi and eax,0fh
asd тогда так: 27 байт mov edx, ecx xor ecx, ecx cmp eax, ebx rcl ecx, 1 cmp ebx, edx rcl ecx, 1 cmp eax, edx rcl ecx, 3 mov eax, 00142305h shr eax, cl and eax, 7
Кто не успел - тот опоздал: Код (Text): mov edx,ecx mov ecx,$9A1 cmp ebx,edx adc ecx,ecx cmp eax,ebx adc ecx,ecx cmp eax,edx adc ecx,ecx shr ecx,cl xchg eax,ecx and al,7 Всего 24 байта! Внимательно изучите сдвиг и константу.
Black_mirror В подобных задачках меня смущает неоптимальный выбор кодировки результатов выполнения условий. Казалось бы какая разница, поменяй местами 4-е и 5-е условие и результаты сравнения станут более упорядоченными и задачку можно решить проще без всяких хитрых констант: Код (Text): 1) cmp eax,ebx sbb edx,edx inc edx cmp ecx,ebx rcl edx,1 cmp ecx,eax sbb eax,eax neg eax lea eax,[edx+eax*2] 2) cmp ecx,eax sbb edx,edx cmp ebx,eax rcl edx,1 cmp ecx,ebx rcl edx,1 xchg eax,edx cdq and edx,6 add eax,edx Или это чересчур просто и "мелко"
leo На счёт "опоздал" я поторопился Кодировка результатов была выбрана абсолютно произвольно, будем считать что это для совместимости с остальным кодом(которого не существует, как и матрицы В начале я думал что самый которкий вариант решения - через таблицу, но мне так и не удалось загнать таблицу в 1 байт. Но даже предложенные тобой варианты не являются самыми мелкими, вот как нужно изменить первый вариант, чтобы сделать на 1 байт меньше. Код (Text): cmp eax,ecx sbb eax,eax inc eax