Подчистить код

Discussion in 'WASM.ASSEMBLER' started by t00x, Oct 30, 2010.

  1. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    Code (Text):
    1.   mov ecx, $FFFFFF
    2.   call @loop
    3. @loop:
    4.   pop rax
    5.  
    6.   sub ecx, 1
    7.   jz @exit
    8.  
    9.   push rax
    10.   push rax
    11.   ret
    как избавиться от одного push rax?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Code (Text):
    1. sub rsp,4
    2. mov [rsp], rax
    ну можно и другие извраты придумать. через ebp например.
     
  3. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Заменить pop eax на mov eax, [rsp], а после exit добавить pop eax?
     
  4. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    Code (Text):
    1.   push rax
    2.   ret
    Code (Text):
    1. jmp rax
     
  5. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    n0name
    Насколько я понял это пауза в стиле а-ля 286 :)) значит замена ret на jmp восстанавливающая правильность работы предсказателя ret-ов снизить эффективность (в смысле тормознутость) этой задержки :)))

    t00x
    Code (Text):
    1.  
    2. mov ecx, $FFFFFF
    3.   call @loop
    4. @loop:
    5.  
    6.   sub ecx, 1
    7.   jz @exit
    8.  
    9.   push [rsp]
    10.   ret
     
  6. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
  7. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    а чтобы оставалось push rax непосредственное изменение rsp не получиться обойти?
     
  8. deLight

    deLight New Member

    Blog Posts:
    0
    Joined:
    May 26, 2008
    Messages:
    879
    t00x
    Подчистить микрокод процессора.
     
  9. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    mov rax, [rsp]
    push rax
     
  10. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    Y_Mur
    Спасибо, дошло.
     
  11. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Жаль я объяснил недоходчиво...
     
  12. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    К сожалению, этот код не совсем эквивалентен исходному: когда сработает jz @exit, в стэке всё ещё останется адрес метки @loop.
     
  13. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    baldr
    есть такое - поленился дописать @exit: pop rax :))
     
  14. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Y_Mur,

    А что означает «пауза a'la 286»? Это код, специально написанный так, чтобы предсказатели ветвлений/возвратов P6+ пролетали, аки фанера над городом Парижем?
     
  15. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    Это значит что в эпоху i286 паузы в виде циклов широко применялись, но с приходом многозадачности они есно потеряли актаульность - гораздо лучше отдать процессорное время ожидания задаче которой оно нужнее. Разумного оправдания как паузам а-ля 286 так и нарушению предсказания переходов не вижу, поэтому на всякий случай прозрачно намекнул ТС о повышенной тормозючести такого решения ;) но если очень хочется разобраться в логике организации таких извратных циклов, то почему бы и не подсказать :))
     
  16. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Y_Mur,

    Меня малость испугало упоминание 286. i386 тоже не имеет BTB и прочих прелестей неупорядоченного спекулятивного исполнения команд. Вроде это началось с PPro и иже с ними.