Какова цель инструкции LEA?

Раньше я боролся с блогом электронной почты HTML. Вот некоторые из моих советов о стилизации для максимальной совместимости между почтовыми клиентами.

  • Встроенные стили - лучший друг. Абсолютно не связывайте таблицы стилей и не используйте тег <style> (например, GMail, разделите этот тег и все его содержимое).
  • Против вашего лучшего суждения, использования и злоупотребления таблицами. <div> s просто не будет его обрезать (особенно в Outlook).
  • Не используйте фоновые изображения, они пятнистые и будут вас раздражать.
  • Помните, что какой-то адрес электронной почты клиенты автоматически преобразуют введенные гиперссылки в ссылки (если вы сами не привязываете <a>). Иногда это может привести к негативным последствиям (скажем, если вы добавляете стиль каждой гиперссылки к другому цвету).
  • Будьте осторожны с гиперссылкой на фактическую ссылку с чем-то другим. Например, не печатайте http://www.google.com, а затем связывайте его с https://gmail.com/. Некоторые клиенты будут отмечать это сообщение как спам или нежелательный файл.
  • Сохраните изображения в виде нескольких цветов, чтобы сохранить размер.
  • Если возможно, вставьте свои изображения в свой адрес электронной почты. Электронному письму не нужно будет обращаться к внешнему веб-серверу, чтобы загрузить его, и они не будут отображаться в виде вложений в адрес электронной почты.

И, наконец, тест, тест, тест! Каждый почтовый клиент делает все иначе, чем браузер.

613
задан Michael Petch 17 April 2018 в 01:55
поделиться

5 ответов

Все нормальные "вычислительные" инструкции как добавляющее умножение, эксклюзивное или набор, состояние отмечает как нуль, знак. При использовании сложного адреса AX xor:= mem[0x333 +BX + 8*CX], флаги установлены согласно xor операции.

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

ясно, что, после того как процессор способен к использованию сложного адреса для обработки его содержания, это способно к вычислению его для других целей. Действительно это может использоваться для выполнения преобразования x <- 3*x+1 в одной инструкции. Это - общее правило в программировании блока: Использование инструкции однако это качает Вашу лодку. единственная вещь, которая - количества, полезно ли конкретное преобразование, воплощенное инструкцией, для Вас.

Нижняя строка

MOV, X| T| AX'| R| BX|

и

LEA, AX'| [BX]

имеют тот же эффект на AX, но не на флаги состояния. (Это нотация ciasdis .)

0
ответ дан 22 November 2019 в 21:53
поделиться

lea - это сокращение от "эффективного адреса загрузки". Он загружает адрес ссылки местоположения операндом-источником в операнд-адресат. Например, вы можете использовать его для:

lea ebx, [ebx+eax*8]

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

57
ответ дан 22 November 2019 в 21:53
поделиться

У меня есть точные данные для Visual C # 2008. Краткая версия заключается в том, что лучше всего тратить деньги на более быстрый процессор, чем на более быстрый ввод-вывод . Далее следует более длинный ответ ...

Наше решение C # (.NET 3.5) содержит 81 проект с более чем 2 миллионами строк кода (включая комментарии и пустые строки). Пару лет назад мы перешли с ПК с процессором Pentium 4 3 ГГц со стандартными жесткими дисками на ПК с процессором Core 2 Duo 2,6 ГГц с жесткими дисками WD Raptor 10 000 об / мин (74 ГБ). Ускорение было огромным. Примерно с 10 минут до 3,5 минут. И все это в 32-разрядной среде Windows XP Pro с 4 ГБ ОЗУ.

У нас также есть одна гигабайтная i-RAM (для информации в Google), которая по сути представляет собой жесткий диск RAM с резервным аккумулятором. В отличие от SSD, который быстро читает, но медленнее записывает, i-RAM работает и в том, и в другом случае. но если вы потеряете заряд, то батареи хватит только на 12 часов, так что вы должны быть дисциплинированы при регистрации. Это сократило время компиляции на платформе Core 2 Dou еще на минуту (до 2,5 минут) по сравнению с жестким диском Raptor со скоростью вращения 10000 об / мин.

С тех пор я обнаружил, что эти старые диски Raptor на 74 ГБ со скоростью 10000 об / мин немного медленнее, чем ваши современный привод со скоростью вращения 7200 об / мин, разновидность сада, и мы доказали, что результаты стабильных тестов подходят. Мы не пробовали новые Velociraptors, но они, безусловно, будут быстрее, но, вероятно, недостаточно, чтобы окупиться только на время компиляции.

На прошлой неделе мы получили новую платформу Intel Core i7-870 с G.Skill Falcon 128 SSD ГБ (с контроллером Indilix Barefoot) и стандартный жесткий диск 500 ГБ в качестве второго диска. Я также вставил i-RAM в этот компьютер и протестировал все конфигурации.

По сравнению с Core 2 Duo, который компилировался за 3,5 минуты для жесткого диска и 2,5 минуты для i-RAM, i7-870 компилируется за 1 минуту 40 секунд для SSD, HDD и i-RAM плюс-минус 3 секунды. .

Таким образом, оба раза мы обновляли рабочие станции разработчиков, подавляющее большинство улучшений производительности во время компиляции C # было связано с более быстрым процессором, а не более быстрым диском. Если вы хотите ускорить компиляцию, вкладывайте деньги в ЦП, а не в диск.

Тем не менее, SSD намного быстрее загружает Visual Studio и открывает решение (хотя у меня нет времени для этого) . Если вы можете позволить себе SSD, вы никогда не вернетесь назад, поскольку каждая программа на вашем компьютере загружается намного быстрее, это невероятно. Но это не сильно ускорит ваши компиляции. И это благодаря однопоточности Visual Studio C #. Если бы Microsoft когда-либо объединилась и сделала свой компилятор в среде IDE многопоточным, тогда мы бы действительно могли использовать эти четыре ядра ...


Обновление, май 2012 г .: Теперь мы снова обновили наши ПК и на основе того, что мы узнали, прежде чем сосредоточиться на производительности процессора. Новые ПК оснащены процессорами Intel Core i7-2600k, разогнанными до 4,6 ГГц, с твердотельным накопителем Intel 510 Series 120 ГБ SATA III, 16 ГБ оперативной памяти и большим процессорным кулером! Удивительно, но это почти сократило время компиляции вдвое, и я определенно списываю это на очень большое увеличение мощности процессора, а не на более быстрый SSD.

Компиляция C # в Visual Studio 2010 результаты были:

  • 159 секунд: стандартный Intel Core i7-870 (2,9–3,3 ГГц), 4 ГБ ОЗУ с SATA II SSD
  • 109 секунд: стандартный Intel Core i7-2600k (3,4–3,8 ГГц) 16 ГБ ОЗУ с SATA III SSD
  • 84 секунды: Вы также можете использовать LEA для быстрого умножения регистров на 3, 5 или 9.

    LEA EAX, [EAX * 2 + EAX]   ;EAX = EAX * 3
    LEA EAX, [EAX * 4 + EAX]   ;EAX = EAX * 5
    LEA EAX, [EAX * 8 + EAX]   ;EAX = EAX * 9
    
74
ответ дан 22 November 2019 в 21:53
поделиться

Как указывали другие, LEA (эффективный адрес загрузки) часто используется как «трюк» для выполнения определенных вычислений, но это не его основная цель. Набор инструкций x86 был разработан для поддержки языков высокого уровня, таких как Pascal и C, где массивы - особенно массивы int или небольших структур - являются обычным явлением. Рассмотрим, например, структуру, представляющую координаты (x, y):

struct Point
{
     int xcoord;
     int ycoord;
};

Теперь представьте себе такой оператор:

int y = points[i].ycoord;

где points [] - это массив Point . Предположим, что база массива уже находится в EBX , а переменная i находится в EAX и xcoord и ycoord - это 32 бита (так что ycoord имеет смещение 4 байта в структуре), этот оператор может быть скомпилирован в:

MOV EDX, [EBX + 8*EAX + 4]    ; right side is "effective address"

, который попадет в y в EDX . Коэффициент масштабирования 8 обусловлен тем, что каждая точка имеет размер 8 байтов. Теперь рассмотрим то же выражение, которое используется с «адресом» оператора &:

int *p = &points[i].ycoord;

. В этом случае вам нужно не значение ycoord , а его адрес. Вот здесь и появляется LEA (эффективный адрес загрузки). Вместо MOV компилятор может сгенерировать

LEA ESI, [EBX + 8*EAX + 4]

, который загрузит адрес в ESI .

755
ответ дан 22 November 2019 в 21:53
поделиться

Из «Дзен сборки» Абраша:

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

Что это дает? Две вещи, которые не предоставляет ADD :

  1. возможность выполнять сложение с двумя или тремя операндами и
  2. возможность сохранять результат в любом регистре; не только один из исходных операндов.

И LEA не изменяет флаги.

Примеры

  • LEA EAX, [EAX + EBX + 1234567] вычисляет EAX + EBX + 1234567 (это три операнда)
  • LEA EAX, [EBX + ECX] вычисляет EBX + ECX без отмены результата.
  • умножение на константу (на два, три, пять или девять), если вы используете его как LEA EAX, [EBX + N * EBX] (N может быть 1,2,4,8).

Другой вариант использования удобен в циклах: разница между LEA EAX, [EAX + 1] и INC EAX заключается в том, что последний изменяет EFLAGS , а в первом нет; это сохраняет состояние CMP .

если вы используете его как LEA EAX, [EBX + N * EBX] (N может быть 1,2,4,8).

Другой вариант использования удобен в циклах: разница между LEA EAX, [EAX + 1] и INC EAX заключается в том, что последний изменяет EFLAGS , а первый - нет; это сохраняет состояние CMP .

если вы используете его как LEA EAX, [EBX + N * EBX] (N может быть 1,2,4,8).

Другой вариант использования удобен в циклах: разница между LEA EAX, [EAX + 1] и INC EAX заключается в том, что последний изменяет EFLAGS , а первый - нет; это сохраняет состояние CMP .

533
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

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