Одновременный доступ к регистрам процессора в Windows

Не DOS, но тоже нам интересно

Одновременный доступ к регистрам процессора в Windows

Сообщение civilizationliker » 06 сен 2020, 23:18

Всем привет.

Надеюсь на форуме есть люди владеющие ассемблером для x86.

Решил изучить давно подаренную книгу по ассемблеру MASM. Изучая главы и примеры я задумался о том что регистровая память - аппаратный ресурс и если с оперативной памятью понятно что экземпляры кода программы загружаются для её экономии один раз, а вот память под данные у каждого процесса своя, то с регистрами это как-то неочевидно, куда их дампить.

Решил провести эксперимент.
Есть код

Код: Выделить всё
mov eax, 16
mov ebx, 16
add eax, ebx


Запустив под отладчиком одновременно 2 экземпляра такой программы и предположив что регистры общие выполнив две инструкции в первом экземпляре и одну во втором получим eax = 32 (20h), ebx =16 (10h). Далее выполняем последнюю инструкцию первого экземпляра, в eax запишется 32 (20h). И выполнив последнюю инструкцию во втором экземпляре должны получить в реистре eax = 48 (30h). Но этого не происходит, значения не накладываются друг на друга, сначала я обратил внимание что начальные значения всех регистров отличались между собой, недолго думая я пришёл к выводу что тут всё честно - программы выполнялись на разных ядрах современного многоядерного процессора. Так что для чистоты эксперимента я скомпилировал код для Windows98 и выполнил на своей ретро-машине. Теперь начальные значения регистров стали одинаковыми что подтвердило теорию про ядра, но вот результат оказался таким же, в обоих программах при вышеуказанной последовательности eax в конце становился 32 (20h)

1.jpg
1.jpg (195.31 Кб) Просмотров: 640

2.jpg
2.jpg (191.84 Кб) Просмотров: 641

3.jpg
3.jpg (191.82 Кб) Просмотров: 639


Вопрос, как происходит и происходит ли "свопинг" регистров процессора когда два процесса исполняются на нём одновременно и запрашивают один и тот же регистр?
Последний раз редактировалось civilizationliker 07 сен 2020, 00:05, всего редактировалось 1 раз.
Ретро-компы
1) i440bx - Pentium II 350, 384mb, GF4MX400 64mb, Sound Blaster AWE 64 Value
2) Ноут Toshiba Satellite 2060 cds - AMD K6-2 366, 160 mb, s3virge-dx 2mb, ESS 1978f
civilizationliker
Опытный даунгрейдер
 
Сообщения: 17
Зарегистрирован: 01 авг 2020, 14:47

Re: Одновременный доступ к регистрам процессора в Windows

Сообщение uav » 07 сен 2020, 00:08

civilizationliker, естественно, регистры сохраняются и восстанавливаются при переключении задач:
https://ru.wikipedia.org/wiki/Переключение_контекста
Конкретный механизм этого в Windows не подскажу, но соответствующие механизмы обеспечиваются самим процессором в защищённом режиме.
Тут вот есть подробнее:
http://www.club155.ru/x86addr-multitasking
Одновременно две программы/задачи на одном ядре выполняться всё равно не могут - т.е. каждой программе выделяется некоторое время, в течение которого она выполняет какие-то действия, затем контекст переключается и работать начинает следующая программа/задача. Ну и так далее.
При этом для каждой задачи сохраняется её набор регистров и всяких дополнительных параметров.
Последний раз редактировалось uav 07 сен 2020, 00:13, всего редактировалось 4 раз(а).
Аватара пользователя
uav
Мастер Даунгрейда
 
Сообщения: 976
Зарегистрирован: 22 дек 2008, 14:21

Re: Одновременный доступ к регистрам процессора в Windows

Сообщение civilizationliker » 07 сен 2020, 00:59

большое спасибо, исчерпывающий ответ ))
Ретро-компы
1) i440bx - Pentium II 350, 384mb, GF4MX400 64mb, Sound Blaster AWE 64 Value
2) Ноут Toshiba Satellite 2060 cds - AMD K6-2 366, 160 mb, s3virge-dx 2mb, ESS 1978f
civilizationliker
Опытный даунгрейдер
 
Сообщения: 17
Зарегистрирован: 01 авг 2020, 14:47


Вернуться в Прочее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2