A
Здесь просто
x! (x<0) = -(-x!).Но ИМХО, должно быть тогда так:
(-2)! = (-1)*(-2) = 2
(-3)! = (-1)*(-2)*(-3) = -6
(-4)! = (-1)*(-2)*(-3)*(-4) = 24
(-5)! = (-1)*(-2)*(-3)*(-4)*(-5)= -120.
Это проще, вообще говоря, реализовать.
Size: a a a
EK
x! (x<0) = -(-x!).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Но это, опять же. Берётся
cdq
xor eax,edx
sub eax,edx ; eax = abs(x)
stc
adc edx,edx
xchg eax,ecx ; ecx = abs(x)
xchg eax,edx ; eax = sign(x): 1 or -1
jecxz .zero
@@: imul ecx
loop @B
.zero:
; edx:eax = x!
abs(x)! * sign(x)LW
LW
DB
LW
DB
LW