|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.03.2024, 18:01 | #1 |
Пользователь
Регистрация: 06.01.2021
Сообщений: 52
|
Гоу все учить ассемблер, мне нравится)
Примерно что я услышал у одного англоязычного (как я понял, из США) программиста. Идея в том, что понимание того, как компьютер устроен "под капотом" помогает нам, как программистам, принимать более правильные, лучшие решения, т.к. это помогает нам понимать, почему одни вещи медленнее других.
Я его идею понял так: само понимание того, как всё работает на уровне архитектуры компьютера (не обязательно быть экспертом ассемблера) приводит к тому, что, программируя на каком-то более высокоуровневом языке, мы будем чаще принимать правильные решения с точки зрения производительности/потребления памяти, что упростит разработку в целом. Как-бы мы начинаем видеть, почему что-то работает медленно, и вообще почему это написано плохо. Вот моя первая прога, в двух вариантах (32 и 64-bit на Linux). cpuid работает так: если в аккумуляторе у нас 0, то тогда он нам выдаёт информацию о производителе процессора в виде 12 байт кодов ASCII в такой последовательности регистров: ebx:edx:ecx Для того, чтобы получить полное название своего процессора, надо положить в eax число от 0x80000002 до 0x80000004 и с каждым этим числов вызывать cpuid, эта команда положит нам последовательное в регистры eax:ebx:ecx:edx часть 48-байтной строки, а именно по 4 байта (размер регистров) в каждый из 4х регистров, т.е. по 16 кодов ASCII. Мы их запишем в заранее зарезервированную память. [SPOILER=] Код:
Код:
Код:
Код:
Код:
Код:
У меня тут мб ещё куча ошибок, но это можно сказать первая прога не считая всякого баловства с с регистрами и хеллоу ворлдами. Ещё мало чего понимаю, но мне жуть как интересно Интересно дебажить, gdb тоже классная штука: Запускаем: Код:
Код:
Код:
Код:
|
17.03.2024, 19:21 | #2 |
Форумчанин
Регистрация: 13.03.2023
Сообщений: 113
|
Этот англоязычный программист забыл одну важную вещь: архитектур компьютера существует больше одной. На одном x86/x64 свет клином не сошелся. И при смене архитектуры все эти ассемблерные игры превращаются в тыкву.
И еще вторую важную вещь: современные оптимизирующие компиляторы учитывают возможности процессора гораздо лучше, чем среднестатистический кодер. Важно только не мешать их работе, например, не заниматься преждевременной "оптимизацией" кода. Поэтому хорошее знание стандарта языка более важно. Знание ассемблера тоже не помешает, но оно полезнее при отладке некоторых тонких ситуаций на низком уровне. |
17.03.2024, 20:57 | #3 | |
Пользователь
Регистрация: 06.01.2021
Сообщений: 52
|
Цитата:
В одной книге находил интересную мысль, суть в том, что программист, не представляющий, как там всё работает хотя бы примерно, просто не понимает, что он на самом деле делает, когда пишет на высокоуровневом языке. Я вот не совсем понимаю, почему, когда я уменьшаю выделенную память с 49 байт на меньшее число, то оно не segfault'ится пока я не выделю 0. Последний раз редактировалось iXNomad; 17.03.2024 в 21:00. |
|
17.03.2024, 21:11 | #4 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
Цитата:
Ой, это Linux. С форматом ELF не знаком, но предполагаю, что там нечто похожее. 1000h — 4096 байта, как раз размер страницы. Меньше не может быть выделено, если секции не объединяются. Последний раз редактировалось Vapaamies; 17.03.2024 в 21:13. |
|
17.03.2024, 21:41 | #5 | |
Пользователь
Регистрация: 06.01.2021
Сообщений: 52
|
Цитата:
Т.е. если я выделяю 1 или больше байтов, ОС мне даёт сразу целую пачку? А почему тогда если я пытаюсь сделать что-то такое (записать/напечатать больше, чем есть места) в C, вылезти хоть на 1 байт, у меня обычно стабильный segfault? Судя по всему, логика курса МГУ действительно правильная. Основы программирования (Pascal) - Архитектура ПК (ASM) - ОС (C) Последний раз редактировалось iXNomad; 17.03.2024 в 21:45. |
|
17.03.2024, 22:04 | #6 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
В Си, если не брать жесткую встроенку, память выделяется через менеджер кучи, работающий поверх страничного механизма ОС. Вот в KolibriOS, например, так и не сделали системный менеджер кучи, и программам или приходится городить доморощенный, или выделять по странице при каждом вызове malloc(). Каково?
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Что вам нравится и не нравится в вашей профессии? | Illusiony | Свободное общение | 17 | 07.12.2018 21:22 |
Начал учить Ассемблер и запутался | Andrey2011a | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 24.09.2011 23:37 |
php не нравится del | ilushka2306 | PHP | 3 | 08.05.2011 15:16 |
Не понятно что ему не нравится | _ILYA_ | Visual C++ | 3 | 29.10.2010 20:25 |
Чем вам не нравится Delphi? | docbrain | Свободное общение | 116 | 16.10.2010 10:18 |