Другие языки программирования и технологии

Регистры.

Хочу спросить одну весч, которая мешает мне нормально делать лабу... Вот допустим у нас есть процессор и у него 4 регистра AX BX CX DX Я пишу код на ассамблере, юзаю эти регистры - записываю в них что-нить, переписываю и прочее... Но ведь ими пользуються и другие программы....почему я им, и они мне, не мешают? Или что же это, когда процессор уделяет внимание одной программе, он всё что в регистрах записывает куда-нить, а когда переключаеться на другую программу, восстаналивает значение регистров, при которых он прервал ту программу в последний раз? Вот не могу понять =( Вот это весь вопрос. То что ниже - это чисто любопытство, если вам не лень, буду благодарен за ответ. Да и кстати, а как вам хватает этих регистров? У меня например лаба - смоделировать математический ко-процессор при 64битной системе представления вещественных чисел. И я чувствую, что не хватит мне тех регистров, что есть в процессоре....Тогда как? P.S. Нам assmbler почти не давали, вот и нубствую по привычке XD
Дело в том, что процессоры, особенно, современные, многозадачны.
Происходит это следующим образом (приведу пример на двух процессах)
- каждому работающему процессу отводится определенное время выполнения (зависит от тактовой частоты процессора)
- когда наступает время выполнения очередного процесса, ВСЕ данные регистров сохраняются в стеке (команда PUSH АХ, PUSH ВХ, PUSH СХ, и т. д. ), а первыми (т. е. они извлекутся последними) туда помещаются данные регистров CS:IP, т. е. точки продолжения процесса.
- когда процесс отработал, он освобождает (подчищает) за собой стек и все данные предыдущего процесса восстанавливаются из стека (команда POP). А так как последними извлекаются данные регистров CS:IP, то процесс начинает работать с той же точки, на выполнении которой он был прерван. При этом все регистры уже настроены соответствующим образом.
Но из-за нехватки памяти нередки бывали ранее ошибки типа "переполнение стека". Неопытные ассемблеристы тоже частенько забывают подчистить за собой стек и тогда происходит сбой в системе ибо управление передается в непредсказуемую точку.
Именно поэтому регистры так легко использовать. Опытные программисты частенько пользуются стеком (зная что и в каком порядке туда было помещено) для нестандартной обработки нескольких процессов.

Для обработки вещественных чисел раньше применялся сопроцессор, которому нужно было только передать "операцию" и ссылки на данные в оперативной памяти. Сейчас же используются операции непосредственно в памяти, основанные на сдвигах значений (например если сдвинуть влево биты в байте, то число умножается на два, т. е. 00000001 (единица) сдвинутая влево 00000010 (даст двойку)) . Но это непростой способ и для этого нужно знать булеву математику.
Жазулан Айталиев
Жазулан Айталиев
67 356
Лучший ответ
Артур Савченко Спасибо за ответ. Интересно =)
Про регистры ответили. Только не совсем верно. Контекст задачи (процесса, потока) сохраняет и восстанавливает многозадачная ОС при истечении кванта времени, выделенного потоку .
Кроме регистров, любая программа может использовать память (сегмент данных и стек, например) для хранения чего-либо и для вычислений, регистров на все про все конечно же не хватит.
тебе поможет книга Тома Свана-Программирование на языке ассемблер... .
А что касается регистров так как я понял (читая эту книгу) есть регистры общего назначения (которые можем юзать мы) и те которые доступны тока процессору.... Ну и четырех регистров по мне так мало
ты написал регистры 16-разрядного процессора
с приставкой E(EAX,EBX) это уже 32 битные
Хотя может в этом и фишка- 16*4=64 - вот тебе ровно 64 бита под число с плавающей запятой, и не битом более
SJ
Sergej Jakovlev
7 387
ну так во многозадачной среде при переключении на выполнение другого потока/процесса процессор сохраняет контекст- т. е. состояние регистров, этим часто и измереяется быстродействие его работы- потому что самые большие накладные расходы идут на переключение контекстов процессов
На счет ассемблера- не скажу что я большой специалист, имхо он сейчас не часто встречается в чистом виде, я его изучаю, только длшя того чтобы понять как все это работает на самом низком уровне (не машинные же коды зубрить)) ) На счет регистров процессора- как я понимаю, в 64 битных есть больше регистров, также в своременныз архитектурах есть регистры, котроые плохо документированы, например для мультимедийных иснтрукций
По ассемблеру есть несколько хороших книг, например Магда Ассемблер для процессоров X86, ПИрогова я не перевариваю- уж очень трудно пишет