forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Обмен значениями двух переменных (только двух переменных) (http://forum.boolean.name/showthread.php?t=1254)

SubZer0 06.08.2006 19:26

Обмен значениями двух переменных (только двух переменных)
 
У всех на форумах есть, надо вот и тут тоже напостить...

есть несколько способов обмена значениями двух переменных:

метод первый:
Код:

a=a+b
b=a-b
a=a-b

(точно также работает и с умножением)

:)

jimon 12.08.2006 16:41

Re: Обмен значениями двух переменных (только двух переменных)
 
я тут решил поигратся с етой штукой :)
(ну от нефиг делать)

на asm именно такой алгоритм можно представить как :
Код:

mov ax,[a]
mov dx,[b]

add ax,dx //a = a+b

mov cx,ax //b = a-b
sub cx,dx
mov ax,cx

sub ax,dx //a = a-b

mov [a],ax
mov [b],dx

самый низкий уровень программирования
ето система даже не asm
а набор мнемоник который показывает как работает проц со стеком
при таких операциях
Код:

push a
push a
push b
//в стеке <- b,a,a

add //складывание a+b в стеке
//в стеке <- a+b,a

push a
//в стеке <- a,a+b,a

sub // (a) - (a+b)
//в стеке <- b,a

pop a //замена b в a
//в стеке <- a

pop b
//в стеке пусто

но вот правильный кодер на asm не парится и пишет сразу :
Код:

push [a]
push [b]
pop [a]
pop [b]

учитесь юзать стек господа

ASM РУЛИТ ! :-)

impersonalis 12.08.2006 17:32

Re: Обмен значениями двух переменных (только двух переменных)
 
Очередь LIFO на нижнем уровне - рулит!

SubZer0 12.08.2006 18:17

Re: Обмен значениями двух переменных (только двух переменных)
 
Цитата:

Сообщение от jimon
учитесь юзать стек господа

ЖЖОШ

задание было именно без юзания порсторонних средств, а так можно и файлы заюзать (типа там сохранить а потом прочитать), можно еще через буфер клавы пропустить и через ДМА, а еще можно в видеопамять записать, и через звуковуху можно(проиграть два байта и записать их)... но это все не то, что я хотел...

еще есть вариант с "XOR"... ;)

jimon 12.08.2006 18:19

Re: Обмен значениями двух переменных (только двух переменных)
 
хе
я тебе расписал на asm твой алгоритм :) (не твой правда)
предложил свой

в итоге мое и твое в любом случае юзает стек, какие проблеммы ?

alcoSHoLiK 28.02.2007 13:37

Re: Обмен значениями двух переменных (только двух переменных)
 
А если я так делаю, я неправильный кодер?
Код:

mov ax,a
xchg ax,b


jimon 28.02.2007 15:13

Re: Обмен значениями двух переменных (только двух переменных)
 
alcoSHoLiK

возьмем хотя бы инфу по 486 машинам (там хотя бы расписано сколько тактов занимают команды)

смотрим суда :
http://www.penguin.cz/~literakl/intel/m.html
http://www.penguin.cz/~literakl/intel/x.html
у тебя mov accum,mem ... 1 такт
и xchg accum,reg .. 3 такта
в суме 4 такта

если юзать push pop (мой метод) то
http://www.penguin.cz/~literakl/intel/p.html
выходит 4*2 + 6*2 = 20 тактов в суме
Хотя если работать с регистрами - то 10 тактов

довольно интересно ... знаеш мне понравилось :super:
видимо чем больше я знаю, тем больше я знаю что ничего не знаю :)
кстати интересно компиляторы такую оптимизацию делают ?

alcoSHoLiK 28.02.2007 15:34

Re: Обмен значениями двух переменных (только двух переменных)
 
Получается тогда, что в этой ситуации стек вообще неэффективно использовать. Даже xor'ом быстрей будет:
Код:

mov ax,a    ;1 такт
xor ax,b    ;2 такта
xor b,ax    ;3 такта
xor ax,b    ;2 такта

В сумме - 8.

jimon 28.02.2007 15:51

Re: Обмен значениями двух переменных (только двух переменных)
 
но тогда ето нужно будет писать как inline функцию... или вообще как дефайн

c0mrad 28.02.2007 16:11

Re: Обмен значениями двух переменных (только двух переменных)
 
Цитата:

ASM РУЛИТ !
Даешь это в бинарном коде :lol:!

alcoSHoLiK 28.02.2007 16:34

Re: Обмен значениями двух переменных (только двух переменных)
 
Код:

1110 1011 0000 0101 1001 0000 0101 0000 0000 0000 0110 0000 0000 0010 1110 1010 0001 0000 0011 0000 0001 0010 1110 1000 0111 0000 0110 0000 0101 0000 0001 1100 0011
Это мой вариант с xchg.


Часовой пояс GMT +4, время: 06:40.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot