Наиболее эффективный способ установить регистр на 1 или (-1)

StackOverflow https://stackoverflow.com/questions/2826872

Вопрос

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

mov ax, 0

вместо:

xor ax,ax

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

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

mov ax, 1

или сделать что-то вроде:

xor ax,ax
inc ax

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

Это было полезно?

Решение

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

Без сомнения, вы можете найти официальный Intel Doco в Интернете с похожей информацией.

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

xor ax,ax
inc ax

занимает 3 + 3 = 6 часов и 2 + 1 = 3 байта, пока

mov ax,1

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

Так что последнее лучше в этом случае.


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

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

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

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

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

* а) Нет, на самом деле не, но весело время от времени отдавать :-)

Другие советы

Тебе лучше с

MOV AX, 1

На 8086. Если вы отслеживаете содержимое реестра, вы можете сделать лучше, если вы знаете, что, например, BX уже имеет 1 в нем:

MOV AX, BX

Или если вы знаете, что ах 0:

mov al, 1

и т. д.

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

 sbb ax, ax

Результатом будет либо будет 0, если флаг для ношения не устанавливается или -1, если установлен флаг для ношения.

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

xor  ax, ax
inc  ax

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

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

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

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

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

PS Новая домашняя работа: xor bx,bx Любой быстрее, чем xor bx,cx (на любом процессоре)?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top