Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2014, 18:25   #1
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию Как & возвращает адрес регистра?

Здравствуйте.

Каждый регистр стандартно состоит из 8 триггеров, то есть 1 байт = 8 бит.
Не секрет что триггеры таким образом группируются, образуя машинное слово.

Но, появился такой вопрос.
У меня 32 разрядная среда компиляции C++ кода.
Соответственно такой код:
Код:
int number;
Выделит 32 бита в памяти под хранения информации.

Вопрос заключается в следующем:
Когда я сделаю так:
Код:
std::cout << &number;
На экране появится номер(адрес) регистра в памяти, который содержит собственно значение переменной number.
Но, ведь под 32 бита выделяются смежные 4 регистра, так вот на какой именно из них возвращается адрес?
Или может быть они там как-то виртуально контроллируются со стороны ОС, или быть может возвращается адрес на самый первый регистр в группе регистров, хранящих значение number, а после по той же истории как и с последовательным хранением данных типа array считывается значение?

Мне лично кажется что здесь та же история что и с последовательным чтением адресов array с итерацией, только здесь сам компилятор на автомате читает таким образом регистры в ОЗУ, это в принципе и объясняет тот факт, что C++ строго типизированный язык программирования.

Буду рад если проясните этот момент.
Заранее спасибо за ответ.

Последний раз редактировалось DakotaZ; 19.10.2014 в 18:29.
DakotaZ вне форума Ответить с цитированием
Старый 19.10.2014, 18:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Цитата:
Но, ведь под 32 бита выделяются смежные 4 регистра, так вот на какой именно из них возвращается адрес?
Зависит от эндианности...

Цитата:
Или может быть они там как-то виртуально контроллируются со стороны ОС, или быть может возвращается адрес на самый первый регистр в группе регистров, хранящих значение number, а после по той же истории как и с последовательным хранением данных типа array считывается значение?
Как-то так, но не ОС - сначала компилятором, а потом процессором - он умеет адресовать их.
p51x вне форума Ответить с цитированием
Старый 19.10.2014, 19:02   #3
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Зависит от эндианности...
Объясните пожалуйста что такое эндианность?
Только без ссылки в википедию, там это слишком научно объясняется.

Цитата:
Сообщение от p51x Посмотреть сообщение
Как-то так, но не ОС - сначала компилятором, а потом процессором - он умеет адресовать их.
То есть при запросе фактически программе возвращается регистр из 32х битов?
И фактически программа ничего не знает об адресации триггеров и регистров, она запрашивает у процессора, процессор выдает поток битов.
Верно?

Последний раз редактировалось Stilet; 19.10.2014 в 19:32.
DakotaZ вне форума Ответить с цитированием
Старый 19.10.2014, 20:48   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Цитата:
Объясните пожалуйста что такое эндианность?
Только без ссылки в википедию, там это слишком научно объясняется.
Почитайте там без науки.

Цитата:
То есть при запросе фактически программе возвращается регистр из 32х битов?
И фактически программа ничего не знает об адресации триггеров и регистров, она запрашивает у процессора, процессор выдает поток битов.
Верно?
Вы пытались хоть что-то почитать по программированию? Программа ничего не запрашивает в вашем понимании (сленг пока оставим). Программа - это, упрощенно, список команд для процессора. Он их читает и выполняет. Написано, загрузить двойное слово (32 бита) - грузит, написано загрузить слово (16 бит) - загрузил...
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 00:17   #5
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Почитайте там без науки.


Вы пытались хоть что-то почитать по программированию? Программа ничего не запрашивает в вашем понимании (сленг пока оставим). Программа - это, упрощенно, список команд для процессора. Он их читает и выполняет. Написано, загрузить двойное слово (32 бита) - грузит, написано загрузить слово (16 бит) - загрузил...
Разве слово это не 8 бит?
А двойное соответственно 16 бит.
DakotaZ вне форума Ответить с цитированием
Старый 21.10.2014, 00:55   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а про какую архитектуру речь?
"группировка тригерров в машинное слово" меня немного смущает.

на х86, х64 проц читает из памяти по 32 или 64 байта (зависит от модели проца), так чтобы кеш линия была заполнена целиком. даже если программе нужен только один байт, из памяти будет прочитанно 32 либо 64 байта.
адресация естесвенно котролируется системой и процом.
f.hump вне форума Ответить с цитированием
Старый 21.10.2014, 03:39   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,603
По умолчанию

Цитата:
int number;
Выделит 32 бита в памяти под хранения информации.
Этот код в памяти 32 бита не выделит. Компилятор выделяет место под переменную в файле, делая образ исполняемой программы для оперативной памяти. & по всей видимости возвращает не адрес регистра, а смещение адреса переменной в файле (offset), причем это смещение вычисляется программно компилятором на этапе компоновки и кодогенерации. В регистр переменная может попасть только во время исполнения.

В памяти место выделяется при выделении памяти из кучи оператором new или функцией malloc.

Втыкать нужно в формат PE, а не в архитектуру процессора в данном случае. Рекомендую воспользоваться программой IDA Pro, чтобы понять.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 21.10.2014, 19:46   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Цитата:
Сообщение от DakotaZ Посмотреть сообщение
Разве слово это не 8 бит?
А двойное соответственно 16 бит.
Нет. 8 бит - байт, 16 бит - слово, 32 - двойное,..
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 21:01   #9
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет. 8 бит - байт, 16 бит - слово, 32 - двойное,..
В книге написано что регистр хранит в себе машинное слово, а учитывая тот факт, что 1 регистр это 8 бит, значит 8 бит(1 байт), это машинное слово.
DakotaZ вне форума Ответить с цитированием
Старый 21.10.2014, 21:04   #10
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от challengerr Посмотреть сообщение
Этот код в памяти 32 бита не выделит. Компилятор выделяет место под переменную в файле, делая образ исполняемой программы для оперативной памяти. & по всей видимости возвращает не адрес регистра, а смещение адреса переменной в файле (offset), причем это смещение вычисляется программно компилятором на этапе компоновки и кодогенерации. В регистр переменная может попасть только во время исполнения.

В памяти место выделяется при выделении памяти из кучи оператором new или функцией malloc.

Втыкать нужно в формат PE, а не в архитектуру процессора в данном случае. Рекомендую воспользоваться программой IDA Pro, чтобы понять.
Получается что заменяя значение переменной в программе, значение фактически меняется в образе программы в ОП?
Получается что процессор к программе никакого отношения не имеет?
странно...
DakotaZ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему Val возвращает 0 & 0? Dynn Паскаль, Turbo Pascal, PascalABC.NET 3 12.05.2014 14:07
Как убрать замену символьных ссылок(&#xD;&#xA; и т.д.) при сериализации(печати) xml? hard-t JavaScript, Ajax 0 19.01.2012 09:50
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
C++/Абсолютный адрес регистра Ebp coNsept Общие вопросы C/C++ 6 29.03.2011 12:56
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39