Без использования параметров запроса в URL-адресе вам придется проверить URL-адрес для какого транспортного средства и сравнить его со строковым значением. К сожалению, в этом случае не может быть параметров запроса
Я более или менее делал небольшие ярлыки, которые просто перенаправили бы меня обратно к пути компонента. Таким образом, при нажатии кнопки «Обновить», «Назад» и «Вперед» путь перенаправляется только на vehicle
путь. Вот мой модуль маршрутизации:
{path: 'vehicle/:vehType', pathMatch: 'full', redirectTo: 'vehicle'},
Обновленное [РЕДАКТИРОВАНИЕ]
Каждый раз, когда Вы видите операнд памяти, который смотрит что-то как 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"
(назовите близкий регистр косвенным / память косвенный).
Этот определенный код операции звонит через виртуальный адрес (32 бита здесь) нахождению в местоположении, на которое указывает логический адрес ds:[00923030h]
.
Логический адрес сделан из двух компонентов:
Обратите внимание на то, что вышеупомянутое вычисление обозначает линейный адрес, не физический (см. объем руководств Intel 3a, рисунок 2.2), который затем переводится с помощью стандартного механизма для подкачки страниц 4 КБ, т.е. адрес состоит из индекса для подкачки страниц каталога, таблицы страниц и смещения в выбранную страницу. Следует иметь в виду, хотя, что все основное потоковое использование операционной системы так называемая модель сплошной памяти, что означает, что все селекторы сегмента указывают для обращения к 0x00000000 с предельным набором к 0xFFFFFFFF, который является причиной, почему Вы можете бросить между всеми сегментами и в конечном счете приводите к (легкой) эксплуатации переполнения буфера.
Ассемблерная инструкция, которую Вы дали, очень вероятно, будет вызов через Таблицу адресов Импорта (дополнительную информацию см. в этой большой статье) исполняемого файла, т.е. довольно маловероятно, что это - порядковый вызов подпрограммы.
Код как это испускается компиляторами, потому что заключительный виртуальный адрес импортированной функции от внешнего dll не может быть известен в целом во время компиляции (из-за перебазирования dlls). При помощи такой конструкции вызова загрузчик ОС может вставить корректный виртуальный адрес в указателе адреса на логическим адресом, и компилятор не должен заботиться, какой адрес заключительная функция имеет так или иначе.
IIRC, это принимает значение регистра DS (и смещает его, оставил 4 бита), добавляет к этому, непосредственное данное значение, выбирает значение dword от получающейся ячейки памяти, которая становится адресом для вызова. (РЕДАКТИРОВАНИЕ: это сохраняется для 16-разрядного реального режима, поскольку защищенный режим видит другие ответы.)