Обмен числами в памяти

Тема в разделе "WASM.A&O", создана пользователем Marazm, 7 сен 2005.

  1. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    У меня училка по алгортмизации как-то на лекции сказала что мол можно поменять местами два числа, находящиеся в 2-х ячейках памяти без использования 3-й методом прибовления/вычитания. у меня получился такой код:
    Код (Text):
    1.  
    2. mov eax,45
    3. mov ecx,30
    4. cmp eax,ecx
    5. ja .next
    6. xchg eax,ecx
    7. .next:
    8. add eax,ecx
    9. sub ecx,eax
    10. neg ecx
    11. sub eax,ecx
    12.  


    но как тоже сделать без использования регистров? я что-то команды память-память не видал? может она в представлении HLL это сказала?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не, на регистрах тоже можно. У нас как-то препод тоже дал HLL код. Ну я и подумал, что это лажа, при компилении всеравно третья понадобится. Но потом посидел с ручкой и бумажкой и сделал все на двух регистрах.



    Единственное что точно невозможно - поменять местами два бита, не заюзав третий.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Дай свой HL код, я тебе напишу.
     
  4. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    _DEN_

    Не, вы не поняли. код есть только этот. нужно тоже, но не для регистров а для памяти. можно ли это? или я прав и это не возможно бзе участия регистров? на регистрах можно просто xchg выполнить...
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Код (Text):
    1.  
    2. obmen_reg macro a,b
    3. xor a,b
    4. xor b,a
    5. xor a,b
    6. endm
    7.  



    Код (Text):
    1.  
    2. obmen_reg2 macro a,b
    3. add a, b
    4. sub b, a
    5. add a, b
    6. neg b
    7. endm
    8.  
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. push    [a]
    2. push    [b]
    3. pop     [a]
    4. pop     [b]
     
  7. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    yureckor

    товарищ... спасибо. знаем мы такой варинт. но нужно ДВЕ ЯЧЕЙКИ ПАМЯТИ! с регистрами понятно... этот код тоже работает если 2 ячейки и 1 регистр (хотябы). мне надо ТОЛЬКО 2 ячейки!

    bogrus

    но ведь тогда их 4 - 2 мои + стэк?
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Marazm

    да дурь у твоей училки, память и регистры к процу относятся, а не к алгоритмам, или ты сам зря паришся.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Marazm



    Только на памяти - никак.
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Один из вариантов
    Код (Text):
    1. repeat 32
    2.             rcl     [a],1
    3.             rcl     [b],1
    4. end repeat
    5.             rcl     [a],1
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    bogrus

    Используется регистр eflags :)
     
  12. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    _DEN_> Единственное что точно невозможно - поменять местами два бита, не заюзав третий.



    Вот смотри, что yureckor пишет:
    Код (Text):
    1. xor a,b
    2. xor b,a
    3. xor a,b




    Если a и b - это биты, то произойдёт их обмен, не так ли? ;)
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    captain cobalt



    Эээ... Что-то тут не так :))) yureckor сломал матрицу, раньше нельзя было :)))
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    captain cobalt



    Ну-ка ну-ка, поподробнее с этого места, пожалуйста. В х86 xor работает с отдельными битами?
     
  15. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Z80 работает с отдельными битами :)
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Та не, имеется ввиду, что a и b — множество бит.



    А вот задачка обменять местами два бита в регистре, оставив в сохранности остальные, действительно интересная:
    Код (Text):
    1.  
    2. 1111 0000 -> 1111 0000
    3. 1111 0010 -> 1111 0001
    4. 1111 0001 -> 1111 0010
    5. 1111 0011 -> 1111 0011




    Можно использовать дополнительный регистр в качестве временного.
     
  17. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    IceStudent

    например биты 3 и 12.
    Код (Text):
    1.  
    2.         bt eax, 12
    3.         jc N0
    4.         btr eax, 3
    5.         jmp SF
    6. N0:    
    7.         bts eax, 3
    8. SF:
    9.         jc  N1
    10.         btr eax, 12
    11.         jmp _END        
    12. N1:
    13.         bts eax, 12
    14. _END:
    15.  
     
  18. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    IceStudent

    Для байта дополнительного регистра не нужно:
    Код (Text):
    1. swap:
    2.         test al,01000100b
    3.         jz .exit
    4.         jp .exit
    5.         xor al,01000100b
    6.     .exit:
    7.         ret
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Black_mirror



    В твоем случае нужно. Ты же eflags юзаешь.
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Так можно поменять местами 9-е биты (1-32) в двух регистрах
    Код (Text):
    1.             ror     eax,9
    2.             ror     ecx,9
    3.             adc     eax,eax
    4.             adc     ecx,ecx
    5.             rol     eax,9-1
    6.             rol     ecx,9-1
    Использует eax, ecx, eflags, imm, декодер, конвеер, выполняется 9 тактов, потребляет 5 вольт