Как ЦП обращается к одному байту памяти в 32-битной памяти и 32-битном процессоре

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

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

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


person deepak    schedule 18.09.2012    source источник
comment
Проверьте машинный язык, язык ассемблера для этого конкретного ЦП, особенно части, касающиеся адресации памяти и регистров ЦП.   -  person theglauber    schedule 18.09.2012
comment
@deepak, на 32-битных платформах, поддерживающих адресацию байтов, можно записать один байт в память без записи трех других байтов (в соответствии с отключенными сигналами Byte Enable).   -  person Eric Z    schedule 02.01.2014
comment
@EricZ, что произойдет, если нужный мне байт будет вторым байтом (начиная с нуля) в памяти? обычно, когда я обращаюсь к слову из памяти, 2-й байт попадает между позициями битов 23-16 регистра. Но в этом случае он должен будет приземлиться в позиции 7 - 0. Это меня смущает, потому что я думал, что бит 0 из памяти подключен к биту 0 регистра, а бит 31 к биту 31. Я думал, что это было все в схеме, так как же бит, который должен попасть в битовую позицию 16, может попасть в позицию 0 во время доступа к байту?   -  person deepak    schedule 02.01.2014
comment
@deepak, ЦП может прочитать 4 байта из памяти и сдвинуть остальные 3 байта, чтобы создать 2-й байт. Это просто происходит под капотом, даже не видно при сборке.   -  person Eric Z    schedule 02.01.2014


Ответы (2)


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

person shargors    schedule 19.09.2012
comment
наконец-то я понял логику хранения переменной размером меньше слова, большое спасибо - person HKIT; 19.06.2021

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

person user2050939    schedule 07.02.2013