S0ER
Архитектура | Программирование | Профессиональное развитие Соер.Клуб - https://t.me/soer_live По всем вопросам писать на @soerdev
Показати більше📈 Аналітичний огляд Telegram-каналу S0ER
Канал S0ER (@softwareengineervlog) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 10 455 підписників, посідаючи 11 378 місце в категорії Технології та додатки та 60 831 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 10 455 підписників.
За останніми даними від 26 серпня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -9, а за останні 24 години на 0, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 28.39%. Протягом перших 24 годин після публікації контент зазвичай збирає N/A% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 2 968 переглядів. Протягом першої доби публікація в середньому набирає 0 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 80.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як rbp, архитектура, callme, mov, указатель.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Архитектура | Программирование | Профессиональное развитие
Соер.Клуб - https://t.me/soer_live
По всем вопросам писать на @soerdev”
Завдяки високій частоті оновлень (останні дані отримано 27 серпня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
int callme() {
return 1;
}
void main() {
int (*func_ptr)() = callme;
func_ptr();
}
Здесь мы создаем указатель на функцию func_ptr, который указывает на функцию callme, и затем вызываем функцию через этот указатель.
Как это выглядит в ассемблере?
Используем Compiler Explorer, чтобы преобразовать этот код в ассемблер. Вот что получилось:
callme:
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:callme
mov rax, QWORD PTR [rbp-8]
call rax
nop
leave
ret
Что здесь происходит?
Создание указателя на функцию:
В функции main мы видим, что адрес функции callme сохраняется в памяти по адресу [rbp-8]:
mov QWORD PTR [rbp-8], OFFSET FLAT:callme
Здесь OFFSET FLAT:callme — это адрес функции callme в памяти.
Загрузка указателя в регистр:
Затем этот адрес загружается в регистр rax:
mov rax, QWORD PTR [rbp-8]
Вызов функции по указателю:
После этого происходит вызов функции через регистр rax:
call rax
Инструкция call использует значение в регистре rax как адрес функции, на которую нужно перейти.
Пролог и эпилог
Как и в случае с обычным вызовом функции, здесь также присутствуют пролог и эпилог:
Пролог:
push rbp
mov rbp,
rsp sub rsp, 16
Здесь сохраняется значение rbp, устанавливается новый кадр стека и выделяется место для локальных переменных.
Эпилог:
leave ret
Здесь восстанавливается значение rbp и выполняется возврат из функции.
Пример с массивом в функции
Давайте добавим массив в функцию callme и посмотрим, как это повлияет на ассемблерный код:
int callme() {
char a[128];
return 1;
}
В ассемблере это будет выглядеть так:
callme:
push rbp
mov rbp, rsp
sub rsp, 8 ; <-- обратите внимание, тут сработала Red Zone
mov eax, 1
leave
ret
Здесь видно, что в прологе добавилась инструкция sub rsp, 128, которая выделяет место на стеке для массива a[128].
Вывод
Сегодня мы узнали, как вызов функций по указателю выглядит на уровне ассемблера.
Основные моменты:
Указатель на функцию — это просто адрес функции в памяти.
Вызов функции по указателю осуществляется через регистр, в котором хранится адрес функции.
Пролог и эпилог присутствуют как при обычном вызове функции, так и при вызове через указатель.
Таким образом, даже такие высокоуровневые конструкции, как указатели на функции, имеют свое прямое отражение в ассемблерном коде.int callme() {
return 1;
}
void main() {
int (*func_ptr)() = callme;
func_ptr();
}
Здесь мы создаем указатель на функцию func_ptr, который указывает на функцию callme, и затем вызываем функцию через этот указатель.
Как это выглядит в ассемблере?
Используем Compiler Explorer, чтобы преобразовать этот код в ассемблер. Вот что получилось:
callme:
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:callme
mov rax, QWORD PTR [rbp-8]
call rax
nop
leave
ret
Что здесь происходит?
Создание указателя на функцию:
В функции main мы видим, что адрес функции callme сохраняется в памяти по адресу [rbp-8]:
mov QWORD PTR [rbp-8], OFFSET FLAT:callme
Здесь OFFSET FLAT:callme — это адрес функции callme в памяти.
Загрузка указателя в регистр:
Затем этот адрес загружается в регистр rax:
mov rax, QWORD PTR [rbp-8]
Вызов функции по указателю:
После этого происходит вызов функции через регистр rax:
call rax
Инструкция call использует значение в регистре rax как адрес функции, на которую нужно перейти.
Пролог и эпилог
Как и в случае с обычным вызовом функции, здесь также присутствуют пролог и эпилог:
Пролог:
push rbp
mov rbp,
rsp sub rsp, 16
Здесь сохраняется значение rbp, устанавливается новый кадр стека и выделяется место для локальных переменных.
Эпилог:
leave ret
Здесь восстанавливается значение rbp и выполняется возврат из функции.
Пример с массивом в функции
Давайте добавим массив в функцию callme и посмотрим, как это повлияет на ассемблерный код:
int callme() {
char a[128];
return 1;
}
В ассемблере это будет выглядеть так:
callme:
push rbp
mov rbp, rsp
sub rsp, 128
mov eax, 1
leave
ret
Здесь видно, что в прологе добавилась инструкция sub rsp, 128, которая выделяет место на стеке для массива a[128].
Вывод
Сегодня мы узнали, как вызов функций по указателю выглядит на уровне ассемблера.
Основные моменты:
Указатель на функцию — это просто адрес функции в памяти.
Вызов функции по указателю осуществляется через регистр, в котором хранится адрес функции.
Пролог и эпилог присутствуют как при обычном вызове функции, так и при вызове через указатель.
Таким образом, даже такие высокоуровневые конструкции, как указатели на функции, имеют свое прямое отражение в ассемблерном коде.