Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2017, 07:20   #1
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию Почему xor esi, esi вместо mov esi, 0?

Почему везде используется
Код:
xor esi, esi
вместо
Код:
mov esi, 0
?
Этому есть какое-то рациональное объяснение?
Cuprum5 вне форума Ответить с цитированием
Старый 14.07.2017, 07:29   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Ксор быстрее исполняется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 14.07.2017, 07:43   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Ксор быстрее исполняется.
Сомневаюсь... а вот опкод короче а это важно...
waleri вне форума Ответить с цитированием
Старый 14.07.2017, 08:36   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

  1. sub esi,esi
  2. and esi,0
  3. imul esi,0
  4. shr esi,32
21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
Mikl___ вне форума Ответить с цитированием
Старый 14.07.2017, 08:37   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Сомневаюсь... а вот опкод короче а это важно...
40 лет назад когда 8086 ещё не было архитектура процессоров была такова. Что читался опкод и если там был признак IMM, то читалось число. Соответственно получалось что для ксора 1 так уходил на декодирование и 1 на исполнение всего 2 такта. А присвоения выполнение занимало 3 такта.
Так продолжалось до конца 80-тых годов когда в процессоры стали встраивать блок переупорядочение команд(вне очередное исполнение).
Из-за того что MOV ESI,0 влияет на регистр флагов она не может упорядочиться. По сути она состояла из двух микро команд, против ксора который имел одну микро команду. Так было в Pentium 1. Потом инженеры почасали репу подумали и отменили у половины команд половину флагов. По скорости команды сравнялись. PII. Ввели в "порт" загрузки/выгрузки распознавание MOV,0 как XOR.

Но опкод то короче! Поэтому за счёт того что циклы с ксором корое они лучше влазят в кэш. Отсутствую кэш промахи. И предсказатель ветвления лучше работает на малых циклах. Так что ксор продолжал лидировать по скорости.

И вот пару лети назад ввели возможность исполнение коротких циклов прямо через кэш мопсов. Тогда эти операции окончательно сравнялись по скорости. Но маркетологи специально делают процессоры с худшими характеристиками и продают их дешевле. Так что это ещё не в каждом процессоре есть.

На заметку если не путаю в AMD-64 для регистров XOR RAX, RAX длина опкода с ксором длиннее чем присвоения.

Подробнее можно прочитать в architectures-optimization-manual.pdf, правда там уже давно исключены ряд старых архитектур. Но можно найти старые версии этого документа, если есть желания.
https://www.intel.com/content/dam/ww...ion-manual.pdf
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 14.07.2017, 08:55   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Привет, Pavia
специально собрал программку
Код:
xor rbx,rbx   |4833DB
mov rbx,0     |48C7C300000000
and rbx,0     |4883e300
and ebx,0     |83e300
xor ebx,ebx   |33DB
movabs rbx,0  |48BB0000000000000000
в случае с обнулением 64-разрядных регистров достаточно обнулить младшие 32-разряда и 32-старших обнуляются целиком

Последний раз редактировалось Mikl___; 14.07.2017 в 08:58.
Mikl___ вне форума Ответить с цитированием
Старый 14.07.2017, 10:58   #7
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
xor быстрее исполняется.
- какое доказательство? Только из-за того в move одни нули, если там, к примеру, идет число 1 в качестве 2-ого операнда? Наберусь смелости и попробую оспорить тот факт, что эти команды выполняются с одинаковой скоростью, команда mov занимает больше памяти, но я хочу поспорить и утверждаю, что они обе(mov и xor) выполнятся одновременно за 1 такт. Попробуйте оспорить обратное. Учтите, что процессор современный, т.к. динозаврические процессоры уже не применяются давным-давно.

Последний раз редактировалось Cuprum5; 14.07.2017 в 11:25.
Cuprum5 вне форума Ответить с цитированием
Старый 14.07.2017, 11:47   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Cuprum5,
что-то я не пойму
Цитата:
Сообщение от Cuprum5
Почему xor esi, esi вместо mov esi, 0?
Pavia пытается объяснить, и тут вдруг
Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- какое доказательство? Только из-за того в move одни нули, если там, к примеру, идет число 1 в качестве 2-ого операнда? Наберусь смелости и попробую оспорить тот факт, что эти команды выполняются с одинаковой скоростью, команда mov занимает больше памяти, но я хочу поспорить и утверждаю, что они обе(mov и xor) выполнятся одновременно за 1 такт. Попробуйте оспорить обратное. Учтите, что процессор современный, т.к. динозаврические процессоры уже не применяются давным-давно.
То есть объяснение и не требовалось? С чего такое хамство? Есть какое-то другое объяснение? Cuprum5 что-то скрывает от нас? Для чего задавать вопрос, если ответ известен?
Mikl___ вне форума Ответить с цитированием
Старый 14.07.2017, 12:40   #9
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Из-за того что MOV ESI,0 влияет на регистр флагов она не может упорядочиться. По сути она состояла из двух микро команд, против ксора который имел одну микро команду. Так было в Pentium 1. Потом инженеры почасали репу подумали и отменили у половины команд половину флагов.
Что-то я не понял, о чём ты?
Когда это mov влиял на флаги?
И в каких командах, начиная с Pentium'а отменились флаги?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с ESI Juli@!Помогите пожалуйста!!!! Black box Помощь студентам 0 21.01.2014 16:13
почему здесь MOV 00000 00000001 все нули,а на конце 1? и так с каждой. VasyaSam Visual C++ 5 07.01.2014 19:56
PDP 11 - команда пересылки mov 27 27. почему это фатальная ошибка? 13xXx13 Помощь студентам 0 15.01.2012 23:34
регистры SI и ESI andygood Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 14.04.2011 13:48
ES -> ESI Slamdunk1992 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 04.01.2011 23:40