Задача в зависимости от значения числа в eax поместить в cl "+" "-" или " " + если eax - положительное - если отрицательное пробел если 0. Безбранчевый код с оптимизацией по размеру. eax портить нельзя. Свободный только один регистр (пусть edx) Пока такой незатейлевый код: Код (Text): mov cl,2Bh ;"+" cdq ;edx = 1...1 if eax < 0 0..0 if eax >=0 and dl,2 ;dl=2 if eax < 0, 0 if eax >= 0 add cl,dl ;cl=2B+2=2D("-") if eax < 0,=3B+0=3B("+") if eax >=0 cmp eax,1 ;CF if eax = 0 sbb edx,edx ;edx=1..1 if eax = 0,=0..0 if eax <> 0 and edx,2Bh-20h ;edx=0B if eax = 0,=0 if eax <> 0 sub cl,dl ;cl=2B-0B=20h(" ") if eax = 0, =cl-0 if eax <> 0
Может знак лучше оставить в dl? Код (Text): test eax,eax pushf pop ecx shr cl,3 mov edx,$2D202B shr edx,cl mov cl,dl
у меня тоже похожее созрело, 6 команд на 16 байт Код (Text): mov ecx,0x2d2b2002 ;('-' shl 24) or ('+' shl 16) or (' ' shl 8) or 2 cdq cmp eax,1 sbb cl,dl shl cl,3 shr ecx,cl
Black_mirror Идея интересная, если бы не AF. По докам он undefind после shr x,не ноль. На практике проверил - выставил AF, сдвинул shr edx,3 - AF не сбросился (PIII). Значит он окажется в cl, если не сбросится с помощью test, конечно. По докам опять же - после test AF undefind. На практике проверил - после test он сбросился. Однако можно ли быть уверенным о других камнях? Если принудительно сбросить, получится длинее в байтах чем первый вариант.
Раз c AF забраковали, тогда 5 команд, 14 байт: Код (Text): cdq cmp edx,eax adc edx,edx lea ecx,[edx*8+$2D2B2008] shr ecx,cl
Код (Text): cdq ;-1,0 cmp edx,eax ;eax=0 CF=0,eax<0 CF=0 ,eax > 0 CF=1 adc edx,edx ;eax=0 edx=0, eax < 0 edx=-2, eax > 0 edx=1 lea ecx,[edx*8+$2D2B2008] ;eax=0 cl=8+0=8, eax < 0 8+-16= -8 =11000 = 24;eax>0 cl=8+8=16 shr ecx,cl Всё верно. Блестяще. Пора мне на пенсию