Что является значением x86 инструкции, “называют dword ptr ds: [00923030-й]”?

Без использования параметров запроса в URL-адресе вам придется проверить URL-адрес для какого транспортного средства и сравнить его со строковым значением. К сожалению, в этом случае не может быть параметров запроса

Я более или менее делал небольшие ярлыки, которые просто перенаправили бы меня обратно к пути компонента. Таким образом, при нажатии кнопки «Обновить», «Назад» и «Вперед» путь перенаправляется только на vehicle путь. Вот мой модуль маршрутизации:

  {path: 'vehicle/:vehType', pathMatch: 'full', redirectTo: 'vehicle'},
10
задан Ciro Santilli 新疆改造中心法轮功六四事件 20 September 2015 в 10:58
поделиться

3 ответа

Обновленное [РЕДАКТИРОВАНИЕ]

Каждый раз, когда Вы видите операнд памяти, который смотрит что-то как ds:0x00923030, это - режим относительной адресации сегмента. Исполнительный адрес, отнесенный tp, в линейном адресе 0x00923030 относительно базового адреса ds сегментный регистр.

Сегментация памяти в x86 архитектуре несколько сбивает с толку, и я думаю, что Википедия делает хорошее задание объяснения ее.

В основном x86 имеет много специальных сегментных регистров: cs (сегмент кода), ds (сегмент данных), es, fs, gs, и ss (сегмент стека). Каждый доступ к памяти связан с определенным сегментным регистром. Обычно, Вы не указываете сегментный регистр, и в зависимости от того, как к памяти получают доступ, сегментный регистр по умолчанию используется. Например, cs регистр используется для команд считывания.

Каждый сегментный регистр имеет определенный базовый адрес и предел. Базовый адрес определяет физический адрес, которому соответствует линейный адрес 0x00000000, и предел определяет максимальный допустимый линейный адрес для того сегмента. Например, если бы базовый адрес был 0x00040000, и предел был 0x0000FFFF, то единственные допустимые линейные адреса были бы 0x00000000 к 0x0000FFFF, и соответствующие физические адреса были бы 0x00040000 к 0x0004FFFF.

Таким образом физический адрес, в котором находится называемая подпрограмма, дан базовым адресом, сохраненным в ds сегментный регистр, плюс 0x00923030. Но мы еще не сделаны - инструкция имеет слово ptr в нем. Это добавляет дополнительный уровень абстракции, таким образом, фактическая цель подпрограммы является адресом, сохраненным в местоположении ds:0x00923030.

В синтаксисе AT&T (принятый ассемблером GNU), инструкция была бы записана следующим образом:

lcall *ds:0x00923030

Для полных окровавленных деталей того, что делает инструкция, см. 80 386 справочников. Этот конкретный вариант инструкции "CALL r/m16" (назовите близкий регистр косвенным / память косвенный).

17
ответ дан 3 December 2019 в 15:36
поделиться

Этот определенный код операции звонит через виртуальный адрес (32 бита здесь) нахождению в местоположении, на которое указывает логический адрес ds:[00923030h].
Логический адрес сделан из двух компонентов:

  1. Селектор сегмента на 16 битов, ds в этом случае, который является в основном индексом в (глобальный / локальный) таблица дескрипторов, управляемая операционной системой. Такой селектор также содержит информацию прав доступа для данного сегмента, который проверяется на доступ (текущий уровень полномочий, CPL)
  2. Смещение на 32 бита
    Заключительный адрес затем вычисляется следующим образом: базовый адрес, выбранный от селектора + смещение

Обратите внимание на то, что вышеупомянутое вычисление обозначает линейный адрес, не физический (см. объем руководств Intel 3a, рисунок 2.2), который затем переводится с помощью стандартного механизма для подкачки страниц 4 КБ, т.е. адрес состоит из индекса для подкачки страниц каталога, таблицы страниц и смещения в выбранную страницу. Следует иметь в виду, хотя, что все основное потоковое использование операционной системы так называемая модель сплошной памяти, что означает, что все селекторы сегмента указывают для обращения к 0x00000000 с предельным набором к 0xFFFFFFFF, который является причиной, почему Вы можете бросить между всеми сегментами и в конечном счете приводите к (легкой) эксплуатации переполнения буфера.

Ассемблерная инструкция, которую Вы дали, очень вероятно, будет вызов через Таблицу адресов Импорта (дополнительную информацию см. в этой большой статье) исполняемого файла, т.е. довольно маловероятно, что это - порядковый вызов подпрограммы.
Код как это испускается компиляторами, потому что заключительный виртуальный адрес импортированной функции от внешнего dll не может быть известен в целом во время компиляции (из-за перебазирования dlls). При помощи такой конструкции вызова загрузчик ОС может вставить корректный виртуальный адрес в указателе адреса на логическим адресом, и компилятор не должен заботиться, какой адрес заключительная функция имеет так или иначе.

10
ответ дан 3 December 2019 в 15:36
поделиться

IIRC, это принимает значение регистра DS (и смещает его, оставил 4 бита), добавляет к этому, непосредственное данное значение, выбирает значение dword от получающейся ячейки памяти, которая становится адресом для вызова. (РЕДАКТИРОВАНИЕ: это сохраняется для 16-разрядного реального режима, поскольку защищенный режим видит другие ответы.)

1
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

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