Консультация № 194840
01.03.2019, 12:36
0.00 руб.
1 4 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

книга Рудаков Финогенов, "Язык ассемблера - УРОКИ ПРОГРАММИРОВАНИЯ" 2001 года. пояснение для примера 72.1
на странице 364, написано именно так, что создаётся впечатление что сначала пушим в стек SS, ESP, затем непонятно почему то - в стек внутреннего уровня из внешнего стека копируется двухсловный параметр, затем пушится CS, EIP, хотя если посмотреть на код то там четыре пуша подряд, и нету никакого вызова/инициализации другой задачи.
Это ошибка или же такой, непонятный алгоритм работы.
Прикрепленные файлы:
b7f7164dba90af558058462c3d5cd79da6433288.png

Обсуждение

давно
Посетитель
402218
66
01.03.2019, 12:40
общий
01.03.2019, 14:59
Адресаты:
и ещё хотелось бы узнать, на счёт сегментов LDT как на картинке
ldt_data descr <.......> ;селектор 0+4
.................................................8+4+3
...
В моём понимании: вот есть таблица LDT/GDT, заполняя её тем способом который на картинке то автоматчески(при LLDT/LGDT) там прописываются сегменты. так как они по 8 байт то 0,8,16 - но это для GDT, для LDT уже с 4-ёх, 4,12,20.. поэтому там плюсом идёт 4. Далее плюс 3 это показатель поля RPL для селектора.Но вот почему же для поля ldt_data плюс 3 нету, то есть получается что этот сегмент с запросом нулевого уровня привилегии, хотя это только по картинке, так как объявлено там 0F2h, что и даёт нам присутсвие, 3 уровень, ... ,и тип LDT. И тут опять, то что описано троеточием, это идентификатор сегмента(памяти или дескриптор системного сегмента) то есть для GDT = 1. А для шлюзов, TSS, LDT == 0. Так вот 0F2h - 1111 0010, где 4-ый бит = 1, но он должен быть =0 так как описывается там LDT о чём нам говорит младшая часть байта - 0010.(хотя тут надо плясать от идентификатора) Опять это ошибка что ли в книге?(То что там за что отвечает написал для того, как это именно Я понимаю, потому что может оказаться все по другому а у Меня просто совпадение )
давно
Посетитель
7438
7205
01.03.2019, 15:20
общий
01.03.2019, 15:25
Адресаты:
Мне кажется, Вы слегка запутались.
Есть два направления вызова:
1) из 0-го кольца задачи из 3-го кольца.
Именно это место показано на фрагменте. Здесь нет никаких передач параметров через стек.
2) вызов сервиса 0-го кольца из прикладной программы 3-го кольца.
Вызов осуществляется через селектор сервиса. И в этом селекторе указано количество передаваемых через стек параметров.
Когда происходит вызов сервиса, вот тогда и происходит автоматическое копирование параметров в стек 0-го кольца.

На дополнительные вопросы отвечу попозже... Пока нет времени вникать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402218
66
01.03.2019, 15:35
общий
01.03.2019, 15:36
Адресаты:
Возможно что Я упустил этот момент, думая что передаются параметры при смене уровня привилегий, то есть только при вызове через шлюз, в котором селектор, тут всё понятно спасибо. Но то что указано на картинке, у Меня складывается впечатление, что Я как будто не тот код описываю, и эти разноцветные линии относятся к другим участкам, хотя Я пересматриваю, и вроде все норма, кроме тех замечаний, которые Я там указал.

Дочитал то что Вы отредактировали. На счёт времени, ничего страшного, Я подождуспасибо.
давно
Старший Модератор
31795
6196
11.03.2019, 13:10
общий
Адресаты:
Блин не успел.

Цитата: Kdsfofwe21
если посмотреть на код то там четыре пуша подряд,

Но это стек шлюза вызова.

стр 364-365:
"Далее в стек внутреннего уровня из внешнего стека копируется двухсловнные параметры, число которых (от 0 до 31) задано в шлюзе вызова"
Системный вызов, формирует шлюз, вот он и добавляет лишние PUSH'ы.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа