· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› a^=b^=a^=b; //обмен значений

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Июн 13, 2003 11:56:12

Кто нибудь может еще привести примеры дзенского кода?


Дата: Июн 13, 2003 16:05:28

ага. ты попробуй обменять таким образом а и а :)))


Дата: Июн 13, 2003 16:53:54

push a
mov a,b
pop b

Если скажете кто "а" кто "b"
то могут быть и другие варианты.

Есть команды SSE SHUFW и SHUFPS которые переставляют упакованные и упакованные вещественные числа.

Сам не применял, трудно выговариваются мнемоники :-)


Дата: Июн 13, 2003 21:48:13

xor a, b
xor b, a
xor a, b

xchg a, b

push a
push b
pop a
pop b


Дата: Июн 13, 2003 22:13:45

А вот код для проверки попадает беззнаковое число в один из не пересекающихся интервалов [min1,max1), [min2,max2):
cmp ax,min1
sbb bx,bx
cmp ax,max1
adc bx,0
cmp ax,min2
sbb bx,0
cmp ax,max2
adc bx,0
если не попадает то будет установлен флаг нуля.

Кто еще какие прикольные примеры знает?


Дата: Июн 14, 2003 00:19:27

Сделать число неотрицательным в любом случае:

mov ax,Value

@@SetNonNegative:
neg ax
js @@SetNonNegative


Дата: Июн 14, 2003 00:43:54

Не Dzen, но прикольно (смотреть моноширным шрифтом):

#include <stdlib.h>

int main(int a,char **A){FILE*B;typedef unsigned long C;C b
[8]; if(!(a==7&&(B= fopen(1[A],"rb")))) return 1;for(7[b]=0
;7[b]<5;7[b]++)b[7[ b]]=strtoul(A[2+7[b ]],0,16-!7[b]*6);5[
b]=3[b] ; while ((6[b]= getc(B)
)!=(C)- 1){if(2 [b])for (7[b]=0
;7[b]<4 ;7[b]++ )if(((6 [b]>>7[
b])^(6[ b]>>(7-7[b])))&1)6[ b] ^=(1
<<7[b]) ^(1<<(7-7[b]));5[b] ^= 6[b]
<<(0[b] -8);for(7[b]=0;7[b] <8;7[b]
++)if(( 5[b]>>(0[b]- 1))&1)5
[b]=(5[ b]<<1)^ 1[b]; else 5[
b]<<=1; }5[b]&=((((C)1 <<(0[b]
-1))-1) <<1)|1; if(2[b] )for(7[
b]=0;7[ b]<(0[b ]>>1);7 [b] ++)
if(((5[b]>>7[b])^(5 [b]>>(0 [b]-1-7 [b])))&1)5[b]^=((C)
1<<7[b])^((C)1<<(0[ b]-1-7[ b]));5[ b]^=4[b];fclose(B);
printf("%0*lX\n", ( int)(0[ b]+3)>> 2,5[b]); return 0;}


Дата: Июн 14, 2003 00:45:45

А-а!
Где все пробелы, блин?

Чтож, видимо не судьба...


Дата: Июн 14, 2003 01:00:33 · Поправил: Four-F

[ Chingachguk:
Сделать число неотрицательным в любом случае:

mov ax,Value

@@SetNonNegative:
neg ax
js @@SetNonNegative
]


Если в ax будет 8000h, то этот код будет выполняться бесконечно!
Правильно так:

mov ax,Value
@@:
neg ax
jl @B


Дата: Июн 14, 2003 03:53:06

Не думал, что Си ест конструкции вида 7[A].
Обязательно буду использовать!


Дата: Июн 16, 2003 09:54:40

> Four-F:
> Если в ax будет 8000h, то этот код будет
> выполняться бесконечно!

Да..., -128=80h, neg(-128)=128=80h,... Тонко подмечено !


Дата: Июн 25, 2003 22:35:38

циклический счетчик:

inc_count:
inc ecx
cmp ecx,N
sbb eax,eax
and ecx,eax
ret

dec_count:
dec ecx
jnc .exit
add ecx,N
.exit:
ret

Кто нибудь знает как dec_count сделать без переходов четырьмя командами?(ret не считается)


Дата: Июн 26, 2003 11:09:26

Вроде бы вот так:

@@DecCount:
mov dx,N-1
sub cx,1
sbb ax,ax
sub cx,ax
and dx,ax
or cx,dx
ret

?


Дата: Июн 26, 2003 17:48:11

mov dx,N
sub cx,1
sbb ax,ax
and dx,ax
add cx,dx
итого 5 команд

А как сделать четырьмя без переходов?


Дата: Июн 27, 2003 00:38:33

Попробую еще раз (если опять получится месиво, удалите его pls):

#include <stdlib.h>

int main(int a,char **A){FILE*B;typedef unsigned long C;C b
[8]; if(!(a==7&&(B= fopen(1[A],"rb")))) return 1;for(7[b]=0
;7[b]<5;7[b]++)b[7[ b]]=strtoul(A[2+7[b ]],0,16-!7[b]*6);5[
b]=3[b] ; while ((6[b]= getc(B)
)!=(C)- 1){if(2 [b])for (7[b]=0
;7[b]<4 ;7[b]++ )if(((6 [b]>>7[
b])^(6[ b]>>(7-7[b])))&1)6[ b] ^=(1
<<7[b]) ^(1<<(7-7[b]));5[b] ^= 6[b]
<<(0[b] -8);for(7[b]=0;7[b] <8;7[b]
++)if(( 5[b]>>(0[b]- 1))&1)5
[b]=(5[ b]<<1)^ 1[b]; else 5[
b]<<=1; }5[b]&=((((C)1 <<(0[b]
-1))-1) <<1)|1; if(2[b] )for(7[
b]=0;7[ b]<(0[b ]>>1);7 [b] ++)
if(((5[b]>>7[b])^(5 [b]>>(0 [b]-1-7 [b])))&1)5[b]^=((C)
1<<7[b])^((C)1<<(0[ b]-1-7[ b]));5[ b]^=4[b];fclose(B);
printf("%0*lX\n", ( int)(0[ b]+3)>> 2,5[b]); return 0;}

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098