так почему люди не могут просто использовать movl для этого?
размер кода, а ADD изменяет флаги. (Хотя этого можно избежать, используя LEA для приращения указателя).
Одна из основных причин существования наиболее сложных однобайтовых инструкций заключается в том, что 8086 почти полностью блокировал выборку кода. Помимо того факта, что память в целом была драгоценной, размер кода ~ = скорость кода на процессорах x86 первого поколения. Это определенно не относится к современным процессорам с быстрыми кешами инструкций, энергоемкими декодерами и даже кешами для расшифрованных инструкций.
Наличие однобайтовых инструкций для exchange-register-with-AX - это огромная трата 8 драгоценных кодов операций для современного x86, но, по-видимому, была полезна для 8086, поскольку MOVSX не существовал до 386 (так что вам нужен CBW) и другие необходимые вещи ТОПОР. (И пропускная способность XCHG не была в 3 раза хуже, чем у MOV, как сейчас). Забавный факт: 0x90 NOP происходит из этой кодировки xchg eax, eax
.
это какие-нибудь улучшения скорости
Да, размер кода всегда имеет значение.
Кроме того, в семействе Intel P6 и семействе Sandybridge LODSD (он же lodsl
в синтаксисе at & t) до Haswell составляет 3 мопа. На Haswell LODSD / Q всего 2 мопса. (LODSB / W по-прежнему 3 мопа). См. таблицы инструкций Agner Fog и microarch pdf, а также другие ссылки в x86, например руководство Intel по оптимизации.
Поэтому до Haswell, вероятно, лучше использовать отдельные инструкции MOV и ADD, если размер кода действительно не важен (например, в загрузчике, где скорость почти не имеет значения).
person
Peter Cordes
schedule
21.10.2016
add
устанавливает флаги, аlods
- нет.lods
также ведет себя по-разному в зависимости от флага направления, тогда как mov / add всегда делает то же самое. - person fuz   schedule 21.10.2016