У меня училка по алгортмизации как-то на лекции сказала что мол можно поменять местами два числа, находящиеся в 2-х ячейках памяти без использования 3-й методом прибовления/вычитания. у меня получился такой код: Код (Text): mov eax,45 mov ecx,30 cmp eax,ecx ja .next xchg eax,ecx .next: add eax,ecx sub ecx,eax neg ecx sub eax,ecx но как тоже сделать без использования регистров? я что-то команды память-память не видал? может она в представлении HLL это сказала?
Не, на регистрах тоже можно. У нас как-то препод тоже дал HLL код. Ну я и подумал, что это лажа, при компилении всеравно третья понадобится. Но потом посидел с ручкой и бумажкой и сделал все на двух регистрах. Единственное что точно невозможно - поменять местами два бита, не заюзав третий.
_DEN_ Не, вы не поняли. код есть только этот. нужно тоже, но не для регистров а для памяти. можно ли это? или я прав и это не возможно бзе участия регистров? на регистрах можно просто xchg выполнить...
Код (Text): obmen_reg macro a,b xor a,b xor b,a xor a,b endm Код (Text): obmen_reg2 macro a,b add a, b sub b, a add a, b neg b endm
yureckor товарищ... спасибо. знаем мы такой варинт. но нужно ДВЕ ЯЧЕЙКИ ПАМЯТИ! с регистрами понятно... этот код тоже работает если 2 ячейки и 1 регистр (хотябы). мне надо ТОЛЬКО 2 ячейки! bogrus но ведь тогда их 4 - 2 мои + стэк?
Marazm да дурь у твоей училки, память и регистры к процу относятся, а не к алгоритмам, или ты сам зря паришся.
_DEN_> Единственное что точно невозможно - поменять местами два бита, не заюзав третий. Вот смотри, что yureckor пишет: Код (Text): xor a,b xor b,a xor a,b Если a и b - это биты, то произойдёт их обмен, не так ли?
captain cobalt Ну-ка ну-ка, поподробнее с этого места, пожалуйста. В х86 xor работает с отдельными битами?
Та не, имеется ввиду, что a и b — множество бит. А вот задачка обменять местами два бита в регистре, оставив в сохранности остальные, действительно интересная: Код (Text): 1111 0000 -> 1111 0000 1111 0010 -> 1111 0001 1111 0001 -> 1111 0010 1111 0011 -> 1111 0011 Можно использовать дополнительный регистр в качестве временного.
IceStudent например биты 3 и 12. Код (Text): bt eax, 12 jc N0 btr eax, 3 jmp SF N0: bts eax, 3 SF: jc N1 btr eax, 12 jmp _END N1: bts eax, 12 _END:
IceStudent Для байта дополнительного регистра не нужно: Код (Text): swap: test al,01000100b jz .exit jp .exit xor al,01000100b .exit: ret
Так можно поменять местами 9-е биты (1-32) в двух регистрах Код (Text): ror eax,9 ror ecx,9 adc eax,eax adc ecx,ecx rol eax,9-1 rol ecx,9-1 Использует eax, ecx, eflags, imm, декодер, конвеер, выполняется 9 тактов, потребляет 5 вольт