Size: a a a

Ассемблер

2020 December 26

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Вот если б был JNECXZ, тогда вопросов нет :)
источник

ВХ

Віталій Халак... in Ассемблер
while do
источник

ВХ

Віталій Халак... in Ассемблер
@@:
not ecx
...
not ecx
jecxz  @B
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
JECXZ прыгает только в одном случае: когда ECX = 0.
65535 раз он равным нулю быть никак не может.

Можно сделать через доп математику, типа:
   mov edx,65535
   xor ecx,ecx
@@: sub edx,1
   adc ecx,ecx
   jecxz @B
Но тогда и цикл c JZ (JNZ) нужно так же делать. По сути, тут просто JECXZ нужно заменить на JZ.

Вот результат...
Забавно, что JECXZ работает чуть быстрее (пробовал менять местами).
источник

ST

Saenro T in Ассемблер
Вроде работает факториал с положительными/отрицательными
Результат в edx.
источник

ST

Saenro T in Ассемблер
Мне правда ebx не нравится, надо что-то другое думать
источник

ST

Saenro T in Ассемблер
Віталій Халак
cdq
stc
adc   edx,edx
mov   ecx,edx
imul  edx
xchg  ecx,eax
jecxz $+6
imul  ecx
loop  $-2
факториал. варианты?
А теперь вроде без ошибок:

mov ecx, 5 (-5)
call $+14
cdq
inc edx
imul edx, ecx
loop $-3
xchg ecx, ebx
mov ebx, ecx
and ecx, ecx
jns $+6
neg ecx
neg edx
ret

Громоздко?
источник

ST

Saenro T in Ассемблер
Тю, так твой вариант проще
(без jecxz)
Ууу, в моём беда с переполнением)
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
У меня такой вариант получился:

    ; eax = x
   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!

19 байт кода, без переполнения (хотя, я не понимаю, что у вас там за переполнение происходит), работает с нулём, без тормозных loop'ов.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Табы, разумеется, поехали в телеге.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Но я бы сделал 20 байт, заменив
stc
adc edx,edx
на
lea edx,[edx+edx+1]

Но математически, конечно, брать факториал от отрицательного числа неверно.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Если надо прям покороче и скорость некритична, то 16 байт:

    ; eax = x
   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!

В целом, можно сделать быстрее, но на 17 байт, заменив loop @B на dec ecx/jnz @B :)
источник

ВХ

Віталій Халак... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Если надо прям покороче и скорость некритична, то 16 байт:

    ; eax = x
   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!

В целом, можно сделать быстрее, но на 17 байт, заменив loop @B на dec ecx/jnz @B :)
0! = 0?
источник

O

Oleksii 🌈 in Ассемблер
1
источник

a

asm in Ассемблер
Добро пожаловать ema. Не ответив на вопрос, будешь удалён из чата
источник

k

kent in Ассемблер
asm
Добро пожаловать ema. Не ответив на вопрос, будешь удалён из чата
вывфафа
источник

k

kent in Ассемблер
Переслано от kent
источник

k

kent in Ассемблер
Переслано от kent
imul ebx ошибка ?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
У меня 0, да :)
Но можно переделать, если надо под 1.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Определяем sign, затем берём abs.
Если abs = 0, то выходим. В итоге у нас в eax остаётся 1.
источник