![]() |
|
Модераторы: bsa |
![]()
|
|
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Ну, это смотря какого уровня абстракции рассматривать Например, для такого исходного кода
хороший оптимизирующий компилятор может сгенерировать в точности такой же машинный код, как и для
|
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 1 Всего: 146 |
ни один компилятор переменые на который будет указывать указатель ниоставит в регистрах, как правило почти все переменые ложатся на стек , указатель будет на стек со смещением,
а то что оптимизирует компилятор в регистры как правило переменые циклов , если программер сам не указал тип регистра , но в этом случае компилятор может не пропустить указатель на регистр к dll я вообще не понял что сказать хотели.... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
вобщем если мыслить абстрактно - то
есть переменные, обычно в памяти, адреса этих переменных - это ссылки. переменные хранящие адреса (ссылки) - указатели |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
под словом "переменная" подразумевалось собирательное название именований, используемых в коде для ассоциации с каким либо "объектом" рад был бы услышать правиильное название этого термина. Константный указатель и ссылка неизменяются по разным "идеологическим" причинам. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Ну, правильно, переменная - это обозначение объекта, вводимое через его объявление. Поскольку ссылка - это не объект, переменная не может обозначать ссылку. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
чего то не то.. UnrealMan, ведь должно же быть собирательное слово для a и ra ?! |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Такая вот абстракция получилась
Поправьте меня если я буду не прав в комментариях...
Не спрашивайте зачем я это выложил, я сам не знаю, просто интересно было посмотреть, что же там внутри Это сообщение отредактировал(а) SABROG - 20.12.2008, 14:38 |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 1 Всего: 146 |
данная комбинация имхо обозначает что взять указатель ( т.е. адресс) и в функцию уходит указатель (адресс) переменой... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Имхо по ebp-4 должно находится содержимое переменной, в моем случае это содержимое имеет тип int. В то время как lea берет адрес на это содержимое, т.е. ссылку (не указатель). Далее адрес (ссылка) пихается в переменную ra (вы меня извините, что я так свободно оперирую понятием переменной, но на уровне ассемблера любой адрес доступный для записи - переменная), которая лежит по адресу ebp-8. Теперь сам адрес ebp-8 по праву можно считать указателем, т.к. по этому адресу лежит ссылка (адрес a). Но из-за того, что в функцию передается именно ссылка, а не указатель, то значение ссылки извлекается обратно в регистр. Тут видно, что по-хорошему компилятор должен оптимизировать все это до такой степени, чтобы никаких новых переменных не заводилось вообще. При оптимизации -O1 и выше он вообще удаляет все что связано с этими переменными и саму фукнцию func, т.к. они не используются. Остается один лишь return. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
SABROG,
у тебя как-то все сложновато на самом деле все намного проще на уровне ассемблера и ниже есть только адреса (точнее смещение относительно сегментов) и значения по этим адресам -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 1 Всего: 146 |
по моему надо конкретно определится что есть указатель, а что есть ссылка!
на мой взгляд указатель это переменная которая содержит адресс переменой на которую указывает ! так что асмовая команда lea как раз соответствует этой задаче.
http://www.xs4all.nl/~smit/asm01001.htm ваше высказывание? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Есть две команды
Обе выполняют одну и ту же работу - берут адрес и пихают в регистр. Но когда дело доходит до адресной арифметики, то обычным mov уже не отделаться:
В скобках происходит математическая операция с адресом, результат которой помещается в eax (не содержимое по этому адресу, а всего-лишь сам адрес). В моем случае эта операция Адрес_ebp-4_байта=адрес(ссылка)_на_переменную_содержащую_значение_int(4_байта). MAKCim, у меня то как раз все просто, я с ассемблера в C++ пришел. Правда сейчас подзабыл многое. Если говорить о смещениях и сегментах, то да, в данном случае смещения я называю адресом, несмотря на то, что это не реальный адрес как в реальном режиме процессора и FLAT памятью. Т.ч. можно называть смещения - ссылками, а смещения, которые содержат смещения - указатели Это сообщение отредактировал(а) SABROG - 22.12.2008, 00:21 |
||||||
|
|||||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Операция выполняемая данной командой эквивалентна: eax = ebx + 4*ecx? Если да, то давать отдельную мнемонику не было никакого смысла - можно было бы тогда и mov обойтись без квадратных скобок, более того, это было бы понятней, чем использование LEA. Имхо. |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Как говорится пути компилятора неисповедимы, тем более, что код скомпилен без оптимизации. Да и скорее всего mov использовался бы в случае, если переменные были статическими и глобальными.
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |