В чем разница между lodsl и movl (% esi),% eax; добавить $ 4,% esi`?

Я читал книгу Программирование с нуля < / em> от Джонатана Барлетта за изучение сборки i386 в Linux.

Моя цель состояла в том, чтобы прочитать исходный код проекта, который был написан на asm, затем я встретил этот LODSL, из руководства я мог знать, что он загружает данные, откуда %esi указывает, и после этого увеличивает размер адреса

Так почему же люди не могут просто использовать movl для этого? это какое-то улучшение скорости или любой другой вопрос, который я не рассматривал?


person jyf1987    schedule 21.10.2016    source источник
comment
Так почему люди не могут просто использовать movl для этого? Могут. Но если есть способ сделать то же самое с помощью всего одной инструкции (и это не окажет существенного отрицательного влияния на производительность), то почему бы вместо этого не использовать его?   -  person Michael    schedule 21.10.2016
comment
Считается, что x86 использует набор инструкций CISC, существует множество инструкций, которые можно удалить (например, SUB не нужен). Тем не менее, хорошо, что они есть; интересно было бы сравнить микрокод для него   -  person Tommylee2k    schedule 21.10.2016
comment
Люди не только могут использовать последовательность mov / add, но и должны это делать, поскольку эта последовательность быстрее, чем lodsl. Тем не менее, разница между ними в том, что add устанавливает флаги, а lods - нет. lods также ведет себя по-разному в зависимости от флага направления, тогда как mov / add всегда делает то же самое.   -  person fuz    schedule 21.10.2016
comment
@ Tommylee2k: LODSD на самом деле не микрокодируется, но декодируется до 3 мопов (или 2 в Haswell и более поздних версиях). Только инструкции, которые декодируют до более чем 4 мопов, должны включать секвенсор микрокода, а не просто декодироваться напрямую на процессорах Intel. (И да, это важно для производительности , потенциально много)   -  person Peter Cordes    schedule 21.10.2016


Ответы (1)


так почему люди не могут просто использовать 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
comment
спасибо за объяснение. лично я предпочитаю mips tyle asm lang. но теперь я получил от вас ответ, флаг отсутствия установки может быть очень полезен, когда вы выполняете некоторую итерацию по массиву. но что касается скорости, похоже, что @FUZxxl по-другому думает об этом в комментарии к моему вопросу. - person jyf1987; 23.10.2016
comment
@ jyf1987: Обычно не нужно избегать установки флагов, но в некоторых ситуациях это полезно. Большинство инструкций x86 устанавливают флаги, и это не делает их медленнее. Прочтите руководство Agner Fog по оптимизации сборки, чтобы узнать, как писать эффективные asm. (Я думаю, что FUZxxl думал о LODSD на процессорах до Haswell, где он всегда менее эффективен, чем ADD + MOV.) Я обычно не рекомендовал бы использовать LODSD, но вопрос был в том, в чем разница, а не должен ли я его использовать. - person Peter Cordes; 23.10.2016