Как один байт памяти получает доступ к CPU в 32-разрядной памяти и 32-разрядном процессоре

Я вполне понимаю, что означает 32 или 64-битная система. поэтому в основном все регистры или длина слова составляют 32 или 64 бит.

Для простоты возьмем 32-битную систему и скажем, что я пишу программу на C. Если я объявляю тип int, скажите "int a = 5;" то для var a зарезервировано место памяти одной длины слова. поэтому когда я хочу получить к нему доступ, я могу сделать это, используя адрес слова для этой ячейки памяти.

Но скажу, что у меня есть 4 символа "char a, b, c, d;" так как это один байт, каждый из них помещается в одно слово, поэтому что мне делать, если я хочу получить доступ только к char b? (говоря, что память адресована байтом) теперь говорят, что b - это третий байт в слове.... тогда как это происходит на автобусе? is'nt 3-й байт жестко подключен к 17-й по 24-й линии в автобусе? так что происходит с другими 24 строками при доступе только b?

Ответ 1

Ответ на ваш вопрос во многом зависит от того, какой компилятор вы используете, и от внутренних действий вашего процессора, контроллера памяти и архитектуры памяти (кеш и внешняя память).
У вас есть только контроль над компилятором (при условии, что вы используете компилятор C или С++). Компиляторы имеют разные режимы для случаев, когда вы используете переменные, размер которых меньше размера слова. Существуют флаги для оптимизации скорости и оптимизации памяти. В зависимости от того, какой из этих флагов включен, компилятор может выбрать создание кода, который объединяет все четыре переменные (в вашем случае) в одно слово. Или компилятор может выбрать выделение слова памяти для каждой из переменных, но использовать конкретный байт для хранения фактического значения. Способ, которым компилятор будет делать это для каждого из случаев, состоит в том, чтобы генерировать различные команды инструкций для ЦП. В последнем случае, если переменная считывается из памяти, тогда все слово помещается на шину, а затем в регистр общего назначения. В первом случае слово помещается в регистр, но тогда слово может быть сдвинуто по биту, а остальные биты могут быть обнулены с использованием логической операции И. Таким образом, правый байт будет в регистре. Или может быть архитектура ЦП поддерживает доступ к уровню байтов в слове, и в этом случае это будет только одна операция, выполняемая ЦП. В конце концов, это хорошая идея, чтобы понять, что происходит внутри, но вам все равно, потому что набор инструкций, сгенерированных компилятором, будет работать правильно с вашей точки зрения. Единственный раз, когда вы будете заботиться, - это когда вы пишете программное обеспечение, чувствительное к производительности. В этом случае вам понадобятся сведения о вашем процессоре и памяти, а также флаги, поддерживаемые компилятором.

Ответ 2

Это зависит от ассемблера, он может выбрать одно слово памяти или байт.
Итак, теперь, даже если у вас есть 4 разных символа в слове, что произойдет, все они будут доступны сразу, но только тот, который вам нужен, работает. то есть все они поступают в процессор из памяти, тогда учитывается только байт, который вы хотите, остальные отклоняются.