EK
Size: a a a
EK
ВХ
ВХ
EK
mov edx,65535
xor ecx,ecx
@@: sub edx,1
adc ecx,ecx
jecxz @B
Но тогда и цикл c JZ (JNZ) нужно так же делать. По сути, тут просто JECXZ нужно заменить на JZ.ST
cdq
stc
adc edx,edx
mov ecx,edx
imul edx
xchg ecx,eax
jecxz $+6
imul ecx
loop $-2
факториал. варианты?EK
; eax = x19 байт кода, без переполнения (хотя, я не понимаю, что у вас там за переполнение происходит), работает с нулём, без тормозных loop'ов.
cdq
xor eax,edx
sub eax,edx ; eax = abs(x)
jz .zero
stc
adc edx,edx
mov ecx,edx ; ecx = sign(x): 1 or -1
@@: imul ecx,eax
dec eax
jnz @B
xchg eax,ecx
.zero:
; eax = x!
EK
EK
stcна
adc edx,edx
lea edx,[edx+edx+1]
Но математически, конечно, брать факториал от отрицательного числа неверно.EK
; eax = xВ целом, можно сделать быстрее, но на 17 байт, заменив
cdq
xor eax,edx
sub eax,edx ; eax = abs(x)
jz .zero
stc
adc edx,edx
xchg eax,ecx ; ecx = abs(x)
xchg eax,edx ; eax = sign(x): 1 or -1
@@: imul ecx
loop @B
.zero:
; edx:eax = x!
loop @B
на dec ecx/jnz @B
:)ВХ
; eax = xВ целом, можно сделать быстрее, но на 17 байт, заменив
cdq
xor eax,edx
sub eax,edx ; eax = abs(x)
jz .zero
stc
adc edx,edx
xchg eax,ecx ; ecx = abs(x)
xchg eax,edx ; eax = sign(x): 1 or -1
@@: imul ecx
loop @B
.zero:
; edx:eax = x!
loop @B
на dec ecx/jnz @B
:)O
k
k
EK
EK