|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|||||||||||||||||||||
Компилятор, препроцессор, язык Си26.12.2023, 21:49. Показов 2404. Ответов 22
Всем привет. Стал изучать указатели и возник вопрос, связанный с инициализацией переменных и адресов. Что происходит с компилятором? Решил провести и программу для теста.
Алгоритм такой 1. Создать переменную 2. Выйти из области видимости 3. Создать переменную 4. Вернуться в область видимости 5. Проверить адрес Программа работает как и ожидалось, смещение в стеке 4 байта, но если повторить итерацию, то адреса дадут неожиданный результат, что сломало мне мозг. Для объяснении проблемы выведу адресацию в таком стиле X+0. Алгоритм выглядит так: инициализация X+0(имя переменной = i) выход из {} инициализация другой переменной, где ей дают X+4(потому что int занимает в стэке 4 байта, если я правильно понимаю) вход в {}, где снова инициализируется i, и ей снова дается адрес X+0 инициализация переменной i в другой области видимости{}, где ей даётся адрес X+8 но прикол в том, что на этот раз, программа выдала адреса другим образом. Ожидалось адресация X+0, X+4, X+8 и т.д., но она выдала X+0, X+8, X+4. Вопрос почему? Второй вопрос, как компилятор хранит переменные. Почему он понимает, что в одном месте к переменной X я обращаюсь по адресу X+0, а в другом месте к переменной Х, я обращаюсь по адресу X+N? Программа написана таким алгоритмом:
Вот полный код
Решил дописать код только что. У меня появилась теория, что инициализация переменных идет либо в порядке исполнения, либо с конца кода программы. Добавил 3 и 4ый указатель. Алгоритм инициализации: p2 p3 p4 p1 если рассматривать с точки зрения кода p1 p2 p4 p3 если рассматривать с точки зрения исполнения программы. Адресация не соответствует ожиданиям x+0 x+12 x+4 x+8 если рассматривать адресацию слева-направо и справа-налево с точки зрения кода и исполнения, это невозможно ни при каких обстоятельствах. Как и нелогичное поведение программы
Добавлено через 9 минут Всё. Я разобрался в теме. Инициализация переменных идет снизу вверх, не по алгоритму, а снизу вверх по коду. Просчитался.
p1, p4, p3, p2
0
|
|||||||||||||||||||||
| 26.12.2023, 21:49 | |
|
Ответы с готовыми решениями:
22
Как настроить компилятор Visual Studio 2017 на язык Си? Русский язык в консоли Windows 10. IDE: CodeLite. Компилятор: TDM-GCC-32 Ассемблер - это макропроцессор, транслятор, препроцессор, интерпретатор, компилятор, кросскомпилятор или транслитератор? |
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
||||||||||||
| 27.12.2023, 16:25 | ||||||||||||
Сообщение было отмечено orcali как решение
Решение
Поэтому адреса i2 = i5, i3 = i6 Это разные области видимости, но одного уровня. Кроме того можно видеть что i6 = i7. Это похоже на оптимизацию, (создание-удаление переменных на стеке выполняется с помощью push-pop команд).
0
|
||||||||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
|
|
| 27.12.2023, 20:04 | |
|
а если включить оптимизацию и не выводить в явном виде на экран адрес переменной, то этого адреса может и не быть
0
|
|
|
фрилансер
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
|
|||
| 27.12.2023, 21:57 | |||
|
Если хочется немного контроля - нужно пользоваться динамической памятью Добавлено через 41 секунду
0
|
|||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
||
| 27.12.2023, 22:51 [ТС] | ||
|
Всем спасибо за ответы. Я думал, что меня 060$рут. Вообще у меня было вопросов 6, но я решил прежде чем задавать их на форуме прогуглить. И 4 из них пропало. Я буквально вчера узнал, что такое #define. Я думал это константа, спасибо авторам учебников, которые называют ее константой. Я столько мучился, а все мои проблемы решала она. Вернусь к теме. Начну с моего ошибочного умозаключения, который я написал в конце, и никто не подправил, мб потому что из-за наличия понимания в этой теме, не заметили мою ошибку. Я стал вести адресацию как Х+N, но я уверен, что вы все знаете про то, что стэк находится в конце процесса. Так что адресация идет X-N, где X самый последний байт. Из-за чего я сделал ошибочное заключение, утвердив, что адресация переменных идет снизу вверх по коду. Что никто не подправил. На самом деле, адресация идет в порядке текста в коде. И чем больше адрес, тем ближе переменная к началу стека, где стек находится в конце процесса. Алексей1153, я не совсем согласен с вашим ответом, потому что "компилятор играет так, как посчитает нужным". Какой вывод я должен сделать из этого? Компьютер работает как посчитает нужным? Еще вы не поняли почему я упомянул препроцессор. Ответ простой. Затупил как и на протяжении всей этой темы.
Добавлено через 5 минут (j2)=2295042648 -> 3282959024 (j3)=2295042644 -> 0 (i1)=2295042640 -> 0 (i2)=2295042632 -> 3282864000 (i3)=2295042628 -> 0 (i4)=2295042636 -> 32531 (i5)=2295042624 -> 0 (i6)=2295042620 -> 0 (i7)=2295042616 -> 0 У меня программа отработала так, у каждого свой адрес
0
|
||
|
фрилансер
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
|
|||
| 27.12.2023, 22:54 | |||
![]() А код работает так, как посчитал нужным программист
0
|
|||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|
| 27.12.2023, 22:56 [ТС] | |
|
С такими ответами я точно стану гиком
0
|
|
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
|||||
| 28.12.2023, 02:03 | |||||
|
Не по теме:
0
|
|||||
|
из племени тумба-юбма
|
|
| 28.12.2023, 02:49 | |
|
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 28.12.2023, 13:43 | ||
|
В частности для корректной работы локальная переменная совсем не обязательно должна быть в стеке, и совсем не обяательно ее помещение в стек (если оно действительно нужно) должно быть в том порядке, в котором вы ее объявили в коде. Если адрес переменной не нужен и она умещается в регистр - она будет в регистре. Если оптимизатор посчитал, что выгоднее (с точи зрения, например, скорости доступа) переставить местами размещение в стеке двух объявленных вами переменных - он сделает это. Компилятор работает как посчитает нужным, при условии соблюдения видимого (требуемого программистом и при отсутствии UB) поведения.
1
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||||||
| 28.12.2023, 21:36 | ||||||
#define - основной способ объявления именованных констант в языке С. Именно это, скорее всего, было сказано в вашем учебнике, а вы уже сами додумали это все до некоего огульного "называют ее константой".Все это уже подробно разбиралось Расположение переменных в памяти Структура стека в MSVC
1
|
||||||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|||||||
| 29.12.2023, 12:35 [ТС] | |||||||
|
Спс за ссылки. Я пробежался глазами, теперь нужно смотреть их код, и вдумчиво читать, что там написано.
----Вопрос-1---- Чем отличается Hello World в консоли, от Hello World драйверов, от Hello World операционных систем, от Hello World ядра операционной системы? ----Словесные прелюдии---- Если я захочу что-то из этого написать, то мне всегда предложат написать Hello world. Я видел разные блок-схемы абстракций ПК, и не находил блок-схему со всеми уровнями. Я буквально вчера узнал, что такое X-система, но поленился узнать какие аналоги ее есть. В общем вся моя боль заключается в том, как закрасить пиксель на уровне ядра. Как покорить всё это железо. Я хочу покорить железо настолько, чтобы ставить Linux на микроконтроллер жесткого диска, и компрометировать безопасность операционных систем. В общем хочу вертеть ПК как кубик-Рубика. Я хотел бы стать пентестером, но я не хочу взламывать сайты, это не очень интересно. Хотя проникнуть на сервак сайта и получить root-права это интересно. Но мне до всего этого пока-что далеко. Не много проседает настроение, потому что прошло много времени, и я ничему не научился. Спасибо чуваку, который на этом форуме скинул скриншот поисковика гугла(на самом деле яндекса, просто гугл звучит лучше). В принципе я понимаю, как я выгляжу со стороны для прошаренных. В теории можно просто кидать скриншоты гугла, когда у людей возникают вопросы. Но есть разные методы обучения. Иногда нужно провести диалог, для того, чтобы проверить информацию на ее корректность, и понять куда двигаться дальше. Весь интернет превратился в то, что один двоичник списывает у другого. Один скажет ахинию, так его еще начнет цитировать весь интернет. "Язык Си написан на язык Си". Я думаю первые программисты, которые писали первые компиляторы с помощью перфокарт(или чего-либо еще), каждый раз переворачиваются в гробах от этой фразы. Да, язык Си прошел раскрутку через Си++(точнее компилятор, если я всё правильно понимаю), но прежде Си++ использовался фортран и ассемблер https://qna.habr.com/q/1083290.Также можно посмотреть процентное соотношение https://github.com/gcc-mirror/gcc. ----Вопрос-2---- Как называются нюансы в ЯП? ----Приведу пример----
Добавлено через 12 минут Да, и жалкое это зрелище, когда на вопрос, - как сделать человека? - тебе всегда отвечают, - лепи из пластилина! ИЗ ПЛАСТИЛИНА МОЖНО СДЕЛАТЬ ВСЁ!!!! - еще раздражает, когда пытаются выставить идиотом. Особенно когда задаешь вопросы про то, как работает ПК(как выглядит человечек), тебе так поверхностно и легко отвечают. Еще мнят о себе высоко. Ты несколько лет делаешь сайты, а написать ядро или какой-нибудь драйвер не можешь. Очень сложно найти свет во тьме интернета. На форумах часто несут ахинию, кругом невежество, либо безбрежность. Спорят программисты на темы "нужен ли ассемблер?" и т.п. И кому верить? Проблематика вопроса "как сделать человека" в IT заключается в том, что тот кто задает этот вопрос: не знает что такое рука, что такое нога и т.п. Я помню когда во втором классе спросил у учителя по информатике: "Что такое радиоэлементы? Что такое триггеры? Вычислительная техника? Что такое перфокарты? Как их вставляли в компьютеры? Можете мне рассказать про процессор с архитектурой Фон-Неймана? Чем отличаются диалекты языков ассемблера? Как написать компилятор? Что такое микроконтроллеры? Почему флешка это не компьютер, хотя на ней стоит микроконтроллер, а микроконтроллер это компьютер? Что такое ядро ОС? Что такое драйвера? Что такое docker? Что такое интернет-протоколы? X-протоколы? Файловые системы? Файлы? Почему я не могу посмотреть код директории на линуксе, если философия линукса директория это файл, всё - файл? Что такое операционная система? и т.д.", и все эти вопросы я задал ей в одном вопросе, - что такое провод? - в итоге она посмотрела на меня как дольаеьа. А какой вопрос может задать мальчик во втором классе, который думает, что компьютер сделан из проводов? Хотя суть этого вопроса была в том, как из красного шнурка получился Counter-Strike: Source. Простите, накипело
0
|
|||||||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
||||||
| 29.12.2023, 13:42 [ТС] | ||||||
|
Вот еще пример. Этапы компиляции. Давайте посмотрим на разные схемы. Когда я задаю вопросы на темы работы ПК, у меня такое ощущение, что люди обучаются по четвертой картинке. Еще раз извиняюсь, форумчане, накипело. За полгода, ох, как накипело. Давайте посмотрим на первые три схемы. Да, схемы делают для упрощенной иллюстрации, но это привожу примеры как появляется невежество из-за небрежности(или невежества, потому что интернет это списать у другого двоичника и написать статью или еще хуже, залить видео на ютюб). Все эти схемы несут свои недостатки. Первая схема несет важную информацию о том, что в одном из этапов компиляции, код превращается в ассемблерный. Хотя умалчиваются остальные этапы. В других этапах умалчивается об ассемблере. Вторая иллюстрация делает упор на объединение проекта. Третья иллюстрация пытается показать весь путь, игнорируя ассемблер. Прикол в том, что таких схем много, и это наверно создает нагрузку на форумы в виде невежественных вопросов и невежественных ответов, которые появлялись на небрежных ответах других шарющих людей. Я никого не обвиняю, просто получился какой-то френдли фаир или что-то т.п. (Я не имел ввиду, что я думаю, что я шарю). Просто самоучке очень сложно отличать it's true от it's false, особенно, когда тебе часто отвечают, что это просто или ты еще тупой или в духе "из пластилина можно сделать всё что угодно!". Кстати, если в эту тему попадет какой-нибудь типичный самоучка, который вместо того, чтобы гуглить попадет на эту тему, в принципе я думаю ему было бы полезно что-то узнать из всей этой темы. Особенно момент "true/false", когда натыкаешься постоянно на споры прогеров. Очень полезно я думаю новичкам(это просто совет себе и резюмирую полученную инфу для себя, проделать такой опыт). Хорошо, что когда изучают интернет-протоколы, хотя бы показывают утилиты tracerout(для Linux, для windows tracert) и ping. А то я бы со всем потерял веру в человечество
0
|
||||||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|
| 29.12.2023, 13:46 [ТС] | |
|
В общем я иду к тому, что хочу дорасти до такого уровня, чтобы говорить: "это не меня заперли с вами, это вас заперли со мной"
))
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||||
| 29.12.2023, 19:45 | |||||||||
|
orcali, учатся по книгам. Вот например маааленький список для тем "язык+алгоритмы+архитектура": (https://www.cyberforum.ru/post12974695.html) Для драйверов и низкого уровня в целом будет свой список. Для написания ОС - свой. Для уровня железа - свой.
На форумах никто не будет для вас писать книги. Вам могут ответить на конкретный вопрос, который вы должны сформулировать, читая книгу. Нет смысла ждать другого. На общие вопросы - вы получите общие ответы, которые, как правило, будут зависеть от специфики опыта отвечающего. Что касается статей и видео: максимум - это практическое пособие к книгам. В смысле сначала вы читаете, потом идете смотреть видео, где, возможно, покажут какой-то пример или точку зрения. Только так. Не наоборот. Чтобы выучиться - надо много вкалывать. Очень много. Ждать, что вам все до косточек объяснят - наивно. Даже самый лучший объясняльщик не сможет это сделать, если вы не возьмете за труд его послушать. А еще есть такая штука как "контекст". Схемы, которые вы привели выше, объясняют что-то в контексте, т.е. чтобы их понимать правильно, нужно знать какой контекст предполагался. Здесь нет никакого абсолютного знания. Есть подходящий для текущей задачи контекст. Поэтому на один и тот же вопрос можно найти множество казалось бы разных ответов, и если игнорировать контекст, то будет казаться, что ответа нет вообще. И да, учиться, только чтобы в итоге кого-то "нагнуть" (как "нагнул" автор цитаты, которую вы привели) - это так себе цель. Добавлено через 1 час 32 минуты В консоли у вас есть библиотека времени исполнения, командная оболочка. В драйвере - API ядра. В операционной системе - загрузчик, BIOS и т.д. (Hello World есть здесь: https://wiki.osdev.org/Bare_Bones) Работает так: для двух подвыражений a, b возвращается результат последнего. При этом оба подвыражения выполняются указанном порядке. https://en.cppreference.com/w/... ator_other
2
|
|||||||||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
|||
| 29.12.2023, 20:52 [ТС] | |||
|
Я сейчас сижу на работе, и ко мне пришел клиент, и я как раз ему рассказал про эту тему, которую сейчас мы с вами обсуждаем и про свою позицию. Он программист. По его мимике и сарказму было понятно, что я безнадежен. Это очень неприятно было, но меня это не остановит. Хотя я ему рассказал, что не хочу делать сайты. Мне это не интересно. Еще я высказал свои мысли о том, что хочу изучить ассемблер, чтобы понять как работает ПК. Ему не понравилась эта идея. Хотя в интернете я видел, что пентестерам нужен ассемблер. За то он меня подьеьал за место, в котором я работаю. Но я выбрал это место за 12 часов свободного времени и легкого потока клиента, где можно сидеть с ноутбуком и изучать ПК. В общем всё идет к тому, что я скоро начну читать книжки по философии стоицизма и продолжать изучение. Мне нужно понять все эти абстракции, и как они связаны между собой со всеми подводными камнями(не прям со всеми, но чтобы выработалась корочка). В общем меня ждет долгий тернистый путь. Я буквально вчера узнал, что я дое6истый. Обычно я не пытаюсь лезть в дебри, углубляться и т.д. Но я не знаю почему когда интересуюсь ПК, у меня миллиард вопросов, причем дотошно-придирчивых. Я никогда таким не был. И возможно из-за того, что программисты не лезут в дебри, на свет появляются schoolхакеры, которые за 5 минут с помощью эксплойтов могут компрометировать ПО, в котором более >50млн строчек кода. Добавлено через 17 минут 0000 0001 1111 1110 1111 1111 Миллион раз благодарю. Ты не представляешь как мне стало легче. Побольше бы таких людей.
0
|
|||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
||
| 29.12.2023, 21:03 [ТС] | ||
|
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 29.12.2023, 21:31 | |||
|
orcali, У Танненбаума есть еще одна книга "Архитектура компьютера", многие вопросы освещаются там.
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||
| 29.12.2023, 22:08 | ||||
|
Скорее "Компилятор языка Си написан на Си". И это правда. В том смысле, что это можно сделать. Это никак не противоречит тому, что первый компилятор был написан на чем-то другом. Как только реализация была завершена, компилятор можно было попробовать переписать на реализованном языке. Это показатель жизнеспособности языка и зрелости реализации. Если ваш компилятор способен скомпилировать сам себя, значит вы определенно пришли к успеху.
0
|
||||
|
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
|
||
| 30.12.2023, 11:02 [ТС] | ||
|
1. Современные операционные системы 2. Архитектура компьютера 3. Интернет-протоколы 4. Язык Си 5. Язык Ассемблера Не в ту сторону рокировку сделал. Надо было делать в короткую сторону, а я сделал в длинную. У меня пока такой план: ОС->АрхитектураПК->ИнтернетПротоколы->Библия Kali Linux -> Собеседование Также параллельно Язык Си->Собеседование->Ассемблер->Собеседование->Эксплойты->Собеседование и т.д. Также мне нужно подумать над тем, какие проекты мне показывать. Чтобы показать, что я могу. Если этот путь ничего не даст, надо будет думать что дальше делать. Я хотел бы заниматься физическим пентестом, когда ты проникаешь в банк, взламываешь видео-камеры, подделываешь пропуска и т.п. Или пентест в более запретные и более защищенные места. Хочу как можно дальше держать свою IT-деятельность от WEB-сайтов(хотя это самый популярный путь пентестеров). Кстати, внизу прилипил картинку, я ее называю "распятие программистов", как 1 превращается в 0, и как 0 превращается в 1. У меня на днях на мониторе вышел конденсатор из строя. Починил мой друг. Кстати, прародители хакеров это радиотехники. У меня в голове давно вертится мысль, как вывести транзистор из строя на компьютере. Точнее написать программу для этого. Теперь я задумался, а что если написать программу, которая взорвет все конденсаторы на мониторе. Но это вряд ли возможно, потому что от таких вещей защищают блоки питания, которые 220V преобразуют в 5V. А вот вывести биполярный транзистор с плавающим затвором, с помощью программы в теории можно. Просто сделать программу, которая будет бесконечно перезаписывать один и тот же бит в памяти, пока тот не выйдет из строя. А проверить это можно чтением байта. По идеи, если я туда запишу 1111 1111, а выведу 1 бит из строя, то на выходе должен получить 1101 1111 И операционная система не должна это заметить. По крайней мере я на это надеюсь ![]() В общем еще раз благодарю, и низкий поклон. Просто не дотерпел, и полез на форум.
0
|
||
| 30.12.2023, 11:02 | |
|
Помогаю со студенческими работами здесь
20
Компилятор с языка PL/1 на язык Ассемблер Можно ли сделать язык(компилятор к нему тоже), который бы не зависел от ОС и програмного обеспечения? Препроцессор Препроцессор Препроцессор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|