Разыменование маркировки в x86 блоке

if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}
5
задан Yuval Adam 18 August 2009 в 21:14
поделиться

3 ответа

Он генерирует эквивалент:

String s = new StringBuilder("abc")
           .append(methodReturningAString())
           .append("ghi")
           .append(anotherMethodReturningAString())
           .append("omn")
           .append("blablabla")
           .toString();

Достаточно умен для предварительного объединения статических строк (то есть «omn» + «blablabla» ) . Вы можете назвать использование StringBuilder «уловкой производительности», если хотите. Это определенно лучше для производительности, чем выполнение пяти конкатенаций, приводящих к появлению четырех ненужных временных строк. Кроме того, использование StringBuilder улучшило производительность (я думаю) Java 5; до этого использовался StringBuffer.

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

String s = "abc" + "def" + foo() + "uvw" + "xyz";

он будет скомпилирован следующим образом: mov ebx, [boo] означает «получить четыре байта со смещением, указанным boo внутри ebx ». Аналогичным образом, mov [goo], ebx переместит содержимое ebx на смещение, указанное goo .

Однако код часто доступен только для чтения, поэтому он не будет будет удивительно видеть, что код просто падает.

Вот как кодируются инструкции в boo :

boo:
b8 03 00 00 00          mov    eax,0x3
c3                      ret

Итак, то, что вы получаете в ebx , на самом деле составляет 4/5 от инструкция mov eax, 3 .

10
ответ дан 18 December 2019 в 11:59
поделиться

Первый mov копирует из смещения goo относительно сегментного регистра [e] DS. Второй mov записывает со смещением foo в расположение данных относительно регистра DS. Если CS и DS совпадают, то это можно игнорировать. Если предположить, что CS и DS совпадают, то в следующий раз вы, вероятно, столкнетесь с различными механизмами защиты, которые делают разделы кода доступными только для чтения.

Продолжение RE:

  1. Метка не похожа на ссылку - вы не разыменовываете как таковую. Ассемблер подставляет число, представляющее расположение в результирующем коде. Вы можете загрузить либо адрес, либо вещь по адресу. [И] указывают на разыменование - я исправил сбивающий с толку элемент в моем первом ответе, чтобы объяснить это. IOW, выполняющий [goo], загружает объект по этому адресу.
  2. Набор инструкций CISC, таких как x86, имеет инструкции [очень] переменной длины - некоторые даже не кратны длине слова. RISC-системы обычно пытаются использовать это, чтобы упростить инструкции декодирования.
  3. 3 - вы изменяете только первые 4 байта mov eax, 2 (который, Здесь нет никаких закрытий или чего-то глубокого такого рода. (Это немного упрощает - код можно перемещать, и во многих случаях исправления применяются к использованию смещений комбинацией компоновщика и загрузчика)

3
ответ дан 18 December 2019 в 11:59
поделиться

Дополнительные ответы:

  1. Это дает вам машинный код, начинающийся с адреса. Насколько это зависит от длины вашей загрузки, в данном случае это 4 байта.

  2. Это может быть несколько команд или только фрагмент команды. На этой архитектуре (Intel x86) команды машинного кода имеют размер от 8 до 120 бит.

  3. 3.

2
ответ дан 18 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

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