Надеюсь на форуме есть люди владеющие ассемблером для 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)
Вопрос, как происходит и происходит ли "свопинг" регистров процессора когда два процесса исполняются на нём одновременно и запрашивают один и тот же регистр?