Я беру ход блока теперь и парня, который проверяет, наши домашние присвоения очень педантичное олдскульное пятно оптимизации. Например, он вычитает 10%, если он видит:
mov ax, 0
вместо:
xor ax,ax
даже если это только используется однажды.
Я не полный новичок в программировании блока, но я не эксперт по оптимизации, таким образом, я нуждаюсь в Вашей помощи в чем-то (мог бы быть очень глупый вопрос, но я спрошу так или иначе): если я должен установить значение регистра к 1, или (-1) это лучше для использования:
mov ax, 1
или сделайте что-то как:
xor ax,ax
inc ax
Мне действительно нужен хороший класс, таким образом, я пытаюсь получить его максимально оптимизированный. (Я должен оптимизировать и время и размер кода),
Быстрый поиск в 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) Нет, не совсем, но иногда интересно выговаривать: -)
Я бы использовал 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
(на любом процессоре)?
В зависимости от ваших обстоятельств, вам может сойти с рук ...
sbb ax, ax
Результатом будет либо 0, если флаг переноса не установлен, либо -1, если флаг переноса установленный.
Однако, если приведенный выше пример неприменим к вашей ситуации, я бы рекомендовал метод
xor ax, ax
inc ax
. Он должен удовлетворить вашего профессора своими размерами. Однако, если ваш процессор использует какой-либо конвейер, я ожидаю, что между двумя инструкциями будет некоторая задержка, похожая на сцепление (я вполне мог ошибаться в этом). Если такая связь существует, скорость можно немного улучшить, немного изменив порядок ваших инструкций, чтобы между ними была другая инструкция (та, которая не использует ax).
Надеюсь, это поможет.
Вам будет лучше с
mov AX, 1
на 8086. Если вы отслеживаете содержимое регистров, возможно, вы можете добиться большего успеха, зная это, например , BX уже содержит 1:
mov AX, BX
или, если вы знаете, что AH равен 0:
mov AL, 1
и т. Д.