Самый Эффективный способ установить Регистр на 1 или (-1)

Я беру ход блока теперь и парня, который проверяет, наши домашние присвоения очень педантичное олдскульное пятно оптимизации. Например, он вычитает 10%, если он видит:

mov ax, 0

вместо:

xor ax,ax

даже если это только используется однажды.

Я не полный новичок в программировании блока, но я не эксперт по оптимизации, таким образом, я нуждаюсь в Вашей помощи в чем-то (мог бы быть очень глупый вопрос, но я спрошу так или иначе): если я должен установить значение регистра к 1, или (-1) это лучше для использования:

mov ax, 1

или сделайте что-то как:

xor ax,ax
inc ax

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

19
задан Thomas 13 May 2010 в 13:12
поделиться

4 ответа

Быстрый поиск в Google для размера таймингов инструкций 8086 появился http://8086.tk/ , который, кажется, имеет все тайминги и размеры для инструкций 8086 (и других) наборы.

Несомненно, вы можете найти в Интернете официальную документацию Intel с аналогичной информацией.

Для вашего конкретного вопроса:

xor ax,ax
inc ax

занимает 3 + 3 = 6 тактовых циклов и 2 + 1 = 3 байта, а

mov ax,1

занимает 4 тактовых цикла и 3 байта.

Так что в этом случае лучше второе.


Но вам нужно поговорить с вашим учебным заведением об этом парне. Не верится, что 10% за такую ​​простую вещь.

Вы должны спросить, что делать, если у вас есть две возможности: одна быстрее и одна короче.

Затем, как только они признают, что существуют разные способы кодирования в зависимости от того, чего вы пытаетесь достичь, скажите им, что вы пытаетесь достичь удобочитаемости и ремонтопригодности, и серьезно не можете совершить прыжок. о потраченном впустую цикле или байте здесь или там * a .

Оптимизация - это то, что вы обычно делаете, если и когда у вас есть проблемы с производительностью, после того, как фрагмент кода находится в почти завершенном состоянии - это почти всегда напрасная трата усилий, когда код все еще подвержен незначительной вероятности изменения. .

Что бы это ни стоило, sub ax, ax , похоже, находится на одном уровне с xor ax, ax с точки зрения тактов и байтов, так что, возможно, вы могли бы добавить это в смешайте в следующий раз, чтобы заставить его еще немного поработать.

* a) Нет, не совсем, но иногда интересно выговаривать: -)

10
ответ дан 30 November 2019 в 05:06
поделиться

Я бы использовал mov [e] ax, 1 при любых обстоятельствах. Его кодировка не длиннее, чем более хакерская последовательность xor , и я почти уверен, что она быстрее где угодно. 8086 достаточно странный, чтобы быть исключением, и, поскольку он настолько медленный, такая микрооптимизация будет иметь наибольшее значение. Но в любом другом месте: выполнение 2 «простых» инструкций всегда будет медленнее, чем выполнение 1, особенно если вы учитываете опасность данных и длинные конвейеры. Вы пытаетесь прочитать регистр в следующей инструкции после его изменения, поэтому, если ваш ЦП не может обойти результат этапа N конвейера (где выполняется xor ) на этап N- 1 (где inc пытается загрузить регистр, не говоря уже о добавлении 1 к его значению), у вас будут задержки.

Другие моменты, которые следует учитывать: пропускная способность выборки инструкций (спорно для 16-битного кода, оба имеют размер 3 байта); mov избегает изменения флагов (более вероятно, что это будет полезно, чем принуждение их всех к нулю); в зависимости от того, какие значения могут содержать другие регистры, вы могли бы сделать lea ax, [bx + 1] (также 3 байта, даже в 32-битном коде, не влияет на флаги); как говорили другие, sbb ax, ax тоже может работать в определенных обстоятельствах - он также короче на 2 байта.

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

P.S.Новое домашнее задание: xor bx, bx быстрее, чем xor bx, cx (на любом процессоре)?

0
ответ дан 30 November 2019 в 05:06
поделиться

В зависимости от ваших обстоятельств, вам может сойти с рук ...

 sbb ax, ax

Результатом будет либо 0, если флаг переноса не установлен, либо -1, если флаг переноса установленный.

Однако, если приведенный выше пример неприменим к вашей ситуации, я бы рекомендовал метод

xor  ax, ax
inc  ax

. Он должен удовлетворить вашего профессора своими размерами. Однако, если ваш процессор использует какой-либо конвейер, я ожидаю, что между двумя инструкциями будет некоторая задержка, похожая на сцепление (я вполне мог ошибаться в этом). Если такая связь существует, скорость можно немного улучшить, немного изменив порядок ваших инструкций, чтобы между ними была другая инструкция (та, которая не использует ax).

Надеюсь, это поможет.

2
ответ дан 30 November 2019 в 05:06
поделиться

Вам будет лучше с

mov AX, 1

на 8086. Если вы отслеживаете содержимое регистров, возможно, вы можете добиться большего успеха, зная это, например , BX уже содержит 1:

mov AX, BX

или, если вы знаете, что AH равен 0:

mov AL, 1

и т. Д.

3
ответ дан 30 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: