Сначала пытался скомпилировать на 64 конфигурации и не понимал почему не получается, поискал информацию, оказалось только на 32 работает, в видео через 30 секунд получил ответ на свой вопрос, недосмотрел. Спасибо, отличные уроки!
После ваших лекций задания из односеместрового ознакомительного курса по ассемблеру перестали вызывать у меня физическую тошноту и желание выбросится в окно! Огромное спасибо за ваш труд!
Я знаю как она стала такой. В детстве, когда я впервые услышал слово компьютер, на вопрос:Что это такое ? Мне ответили: "Та, это так сложно, ты не разберёшся. Я подумал: "Я не разберусь..?" И стал разбираться...В конце 80-х, в СССР, много не накопаешь. Но уже заболел и разобрался в устройстве ПК.Потом Бейсик... Я не понимал зачем он нужен - я хотел писать программы (.com, .exe)...Своего компа не было.Появился в 2003.Но уже - семья, ребёнок. Так я и не стал программистом.Но писал, не имея системных знаний, по учебникам и докам, написал на j2me, которая не поддерживает числа с плавающей точкой, прогу с их поддержкой. На работе приходилось редактировать специфические файлы в не удобном редакторе. Я в HxD изучил формат файла и написал генератор на VB.NET. Пару приложений под Android на Java… Короче болен до сих пор… Ну, а времени, на своё увлечение так и нет :( @@AlexanderSemenko
Да если бы у меня ещё были друзья и знакомы, которым бы была интересна такая сложная информация. 😂 таких людей во всей России то, дай бог тысяча наберется.
Подобный синтаксис ассемблерной вставки будет работать только под vc++. На компиляторе gcc используется другой синтаксис оформления блока и самих инструкций асма (там по умолчанию синтаксис at&t, а не intel).
Получается что, сначала придумали команды на процессоре, напаяли их на нем, потом придумали язык ассемблер, чтобы было проще пользоваться процессором, потом придумали Си чтобы проще пользоваться ассемблером, потом придумали СПП, чтобы делать более большие программы и ТД до питона. Понятно что до си были какие языки, но в целом такая концепция) Получается любой язык это набор шаблонов кода ассемблера?8
Вы кратко описали историю развития программирования )) И да, любой исполняемый язык программирования в результате компиляции превращается в набор машинных команд, т.е. по сути - в ассемблер.
Прошу ответить, если есть возможность, на несколько вопросов: 1. Приходилось ли выполнять дизассемблирование в CLion? 2. В CLion при подключении компилятора от Visual Studio архитектуры х86, при дизассемблировании кода, результат выглядит несколько иначе, чем в самой Visual Studio. Может есть какой-то способ получить одинаковый результат?
Я не работал с CLion. Машинный код должен быть идентичен в любом дизассемблере. Отличия могут быть только в декорации кода, но сами команды Ассемблера должны быть одинаковы в любом дизассемблере.
Да, это немного не логично (на первый взгляд). Команды, использующие расширенные версии регистров EAX / RAX и сокращённые (AX) отличаются однобайтовым префиксом. Раньше команды для EAX были длиннее, однако, в 64-разрядном режиме такие регистры считаются "родными" (native), и такие команды не имеют префикса, и он теперь используется для оперирования короткими регистрами (AX). Т.е. в 64-разрядном режиме это работает наоборот. В результате, команды для длинных регистров стали короче, а значит - они быстрее выбираются из памяти, что ускоряет работу программы. Т.е. мы пользуемся длинными регистрами не потому, что можем, либо узнали про это, либо это модно - а просто потому, что так наши программы работают быстрее ))
Правильно ли я понимаю, что при вызове самой первой функции, особого смысла в сохранении значения регистра EBP в стек нет? и что оно имеет смысл, только в случае когда функция вызывается другой функцией?
Назначение EBP - хранить копию значения ESP. В примере при вызове функции Make_Sum регистр EBP сохраняется в стек только потому, что в него сразу же будет записана копия из ESP. Ну, а по окончании выполнения функции значение ESP восстанавливается и сравнивается с исходным, хранящимся в EBP. Именно так программа может определить, был ли испорчен стек вызываемой функцией, или нет.
13:40 - Не совсем понятно, что значит вызываемая и вызывающая функция, почему данные хранятся отдельно у этих функций? ведь мы кладем адрес возврата, потом параметры/аргуметы функции, рано или поздно функция будет выполняться и уже из вызываемой превратится в вызывающую (так как вы сказали это текущая), тогда по логике хранения параметров, они должны еще раз продублироваться в стеке занимая место в два раз больше, не врубаюсь что то совсем.
может снимите ещё один ролик с пояснением этого момента? в котором это всё подробно объяснялось бы, приводя реальные примеры, например видео про стек на канале Alek Os тоже непонятное относительно освещения темы вызываемой и вызывающей функции, реально ни одном видео в ютубе на эту тему не проливают свет из просмотренных мною.
под локальными переменами вызывающей функции, подразумевается результат функции которая она возвращает после операции над заранее переданными аргументами?
Поясню на примере: функция F1() вызывает функцию F2(). В таком случае F1() - вызывающая, а F2() - вызываемая. Обе функции могут иметь свои собственные локальные переменные - поэтому эти данные и должны храниться отдельно.
@@assemblerandmath1753 Вы только начали смотреть курс, а уже предлагаете снять дополнительные серии. А что, если в последующих сериях этого курса уже содержатся ответы на ваши вопросы?
@@assemblerandmath1753 Локальные переменные функции - это множество переменных, в которых производятся вычисления внутри функции. Возвращаемый результат вообще не хранится в стеке - он возвращается через регистр. Курс по ассемблеру рассчитан на тех, кто уже разбирается в программировании, поэтому я не объясняю многие простые вещи. Посмотрите хотя бы 10-20 первых частей моего "Базового курса по С++", на котором я очень подробно разбираю основы программирования - после этого вам Ассемблер будет даваться гораздо легче.
Потому что программирование придумали математики. Они же добавили такой термин как "функция" вместе со всем, что к ней относится - результату и аргументам. В математике функция должна "вернуть" результат своей "работы" - поэтому так говорят и в программировании уже много десятков лет и все привыкли.
Ну, я бы не назвал язык, производный от интеловского Ассемблера, "чистым" :-) Я рассматриваю разработку на Ассемблере чисто с практической стороны, поэтому кроме как использования этого языка в виде дополнений к программе на языке высокого уровня, другого применения не вижу.
@@AlexanderSemenko у меня удаляется ссылка на imgur, ютуб не дает приложить скриншот но дизассемблирования нет. imgur. com/a/vkaB2nr (без пробела), также не появляется по нажатию Alt+8
@@AlexanderSemenko Не могу приложить здесь видео, все пять попыток чистит ютуб, я попробовал запустить отладчик на примере программы hello world и пример с ассемблерной вставкой из видео, тоже не появляется дизассемблирование
Не сказал бы что там хорошо объясняется, что такое стёк. Скажем, после просмотра этого видеоролика, тот более менее перевариваемый. Если бы я его посмотрел до того, как посмотрел этот, я бы нечего там не понял)
Единственный нормальный канал для изучение ассемблера
Сначала пытался скомпилировать на 64 конфигурации и не понимал почему не получается, поискал информацию, оказалось только на 32 работает, в видео через 30 секунд получил ответ на свой вопрос, недосмотрел. Спасибо, отличные уроки!
Спасибо. Надо несколько раз просматривать и параллельно с Вами выполнять, чтобы уяснить.
8 марта, а я смотрю видео про ассемблер.
Подписалась. 9 марта тоже буду смотреть.
Поздравляю! ))
После ваших лекций задания из односеместрового ознакомительного курса по ассемблеру перестали вызывать у меня физическую тошноту и желание выбросится в окно! Огромное спасибо за ваш труд!
Ещё одна жизнь спасена! ;-)
Святой человек! Посмотрел бы твои видео лет 25 назад - жизнь была бы другой...
Твоя жизнь не просто так стала такой, какой есть. Ищи ответ на вопрос "зачем это всё", и многое тайное станет понятно ))
Я знаю как она стала такой. В детстве, когда я впервые услышал слово компьютер, на вопрос:Что это такое ? Мне ответили: "Та, это так сложно, ты не разберёшся. Я подумал: "Я не разберусь..?" И стал разбираться...В конце 80-х, в СССР, много не накопаешь. Но уже заболел и разобрался в устройстве ПК.Потом Бейсик... Я не понимал зачем он нужен - я хотел писать программы (.com, .exe)...Своего компа не было.Появился в 2003.Но уже - семья, ребёнок. Так я и не стал программистом.Но писал, не имея системных знаний, по учебникам и докам, написал на j2me, которая не поддерживает числа с плавающей точкой, прогу с их поддержкой. На работе приходилось редактировать специфические файлы в не удобном редакторе. Я в HxD изучил формат файла и написал генератор на VB.NET. Пару приложений под Android на Java… Короче болен до сих пор… Ну, а времени, на своё увлечение так и нет :(
@@AlexanderSemenko
Отличные уроки! Спасибо!
Вот она изюминка курса, мне это нравится, продолжайте)
Класс, этот урок буду повторять несколько раз, спасибо!
Просто нет слов, на сколько это крутая инфа. 🔥🔥🔥
Рекомендуйте друзьям и знакомым!
Да если бы у меня ещё были друзья и знакомы, которым бы была интересна такая сложная информация. 😂 таких людей во всей России то, дай бог тысяча наберется.
Спасибо, было интересно
спасибо ваши уроки шикарны!
Рекомендуйте друзьям и знакомым!
@@AlexanderSemenko обязательно
Спасибо большое
спасибо за урок.
Отличный урок , спасибо .
Круто¡¡¡
Подобный синтаксис ассемблерной вставки будет работать только под vc++. На компиляторе gcc используется другой синтаксис оформления блока и самих инструкций асма (там по умолчанию синтаксис at&t, а не intel).
Получается что, сначала придумали команды на процессоре, напаяли их на нем, потом придумали язык ассемблер, чтобы было проще пользоваться процессором, потом придумали Си чтобы проще пользоваться ассемблером, потом придумали СПП, чтобы делать более большие программы и ТД до питона. Понятно что до си были какие языки, но в целом такая концепция) Получается любой язык это набор шаблонов кода ассемблера?8
Вы кратко описали историю развития программирования )) И да, любой исполняемый язык программирования в результате компиляции превращается в набор машинных команд, т.е. по сути - в ассемблер.
Прошу ответить, если есть возможность, на несколько вопросов: 1. Приходилось ли выполнять дизассемблирование в CLion? 2. В CLion при подключении компилятора от Visual Studio архитектуры х86, при дизассемблировании кода, результат выглядит несколько иначе, чем в самой Visual Studio. Может есть какой-то способ получить одинаковый результат?
Я не работал с CLion. Машинный код должен быть идентичен в любом дизассемблере. Отличия могут быть только в декорации кода, но сами команды Ассемблера должны быть одинаковы в любом дизассемблере.
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
Здравствуйте. Зачем мы используем регистр eax, ведь по разрядности нам бы хватило бы и ax.
?
Да, это немного не логично (на первый взгляд). Команды, использующие расширенные версии регистров EAX / RAX и сокращённые (AX) отличаются однобайтовым префиксом. Раньше команды для EAX были длиннее, однако, в 64-разрядном режиме такие регистры считаются "родными" (native), и такие команды не имеют префикса, и он теперь используется для оперирования короткими регистрами (AX). Т.е. в 64-разрядном режиме это работает наоборот.
В результате, команды для длинных регистров стали короче, а значит - они быстрее выбираются из памяти, что ускоряет работу программы.
Т.е. мы пользуемся длинными регистрами не потому, что можем, либо узнали про это, либо это модно - а просто потому, что так наши программы работают быстрее ))
Правильно ли я понимаю, что при вызове самой первой функции, особого смысла в сохранении значения регистра EBP в стек нет? и что оно имеет смысл, только в случае когда функция вызывается другой функцией?
Назначение EBP - хранить копию значения ESP. В примере при вызове функции Make_Sum регистр EBP сохраняется в стек только потому, что в него сразу же будет записана копия из ESP. Ну, а по окончании выполнения функции значение ESP восстанавливается и сравнивается с исходным, хранящимся в EBP. Именно так программа может определить, был ли испорчен стек вызываемой функцией, или нет.
13:40 - Не совсем понятно, что значит вызываемая и вызывающая функция, почему данные хранятся отдельно у этих функций? ведь мы кладем адрес возврата, потом параметры/аргуметы функции, рано или поздно функция будет выполняться и уже из вызываемой превратится в вызывающую (так как вы сказали это текущая), тогда по логике хранения параметров, они должны еще раз продублироваться в стеке занимая место в два раз больше, не врубаюсь что то совсем.
может снимите ещё один ролик с пояснением этого момента? в котором это всё подробно объяснялось бы, приводя реальные примеры, например видео про стек на канале Alek Os тоже непонятное относительно освещения темы вызываемой и вызывающей функции, реально ни одном видео в ютубе на эту тему не проливают свет из просмотренных мною.
под локальными переменами вызывающей функции, подразумевается результат функции которая она возвращает после операции над заранее переданными аргументами?
Поясню на примере: функция F1() вызывает функцию F2(). В таком случае F1() - вызывающая, а F2() - вызываемая.
Обе функции могут иметь свои собственные локальные переменные - поэтому эти данные и должны храниться отдельно.
@@assemblerandmath1753 Вы только начали смотреть курс, а уже предлагаете снять дополнительные серии. А что, если в последующих сериях этого курса уже содержатся ответы на ваши вопросы?
@@assemblerandmath1753 Локальные переменные функции - это множество переменных, в которых производятся вычисления внутри функции. Возвращаемый результат вообще не хранится в стеке - он возвращается через регистр.
Курс по ассемблеру рассчитан на тех, кто уже разбирается в программировании, поэтому я не объясняю многие простые вещи. Посмотрите хотя бы 10-20 первых частей моего "Базового курса по С++", на котором я очень подробно разбираю основы программирования - после этого вам Ассемблер будет даваться гораздо легче.
а можно для первокласников . почему говорят " вернёт нам результат " . а не покажет или просто равно или както ещё
Потому что программирование придумали математики. Они же добавили такой термин как "функция" вместе со всем, что к ней относится - результату и аргументам. В математике функция должна "вернуть" результат своей "работы" - поэтому так говорят и в программировании уже много десятков лет и все привыкли.
А как написать функцию на чистом NASM?
Ну, я бы не назвал язык, производный от интеловского Ассемблера, "чистым" :-) Я рассматриваю разработку на Ассемблере чисто с практической стороны, поэтому кроме как использования этого языка в виде дополнений к программе на языке высокого уровня, другого применения не вижу.
Странно конечно что MSVC не может в ассемблерные вставки. Clang и GCC позволяет это делать для 64 битных сборок
GCC то позволяет, но вот синтаксис этого позволения убивает желание это делать, проще в отдельный модуль выставить и вызывать из сишного кода:-(
у меня нет дизассемблирования в VS. Облазил весь интернет не понимаю в чём проблема, чекбоксы включены
Не может быть! Эта фича была всегда во всех версиях VS.
@@AlexanderSemenko у меня удаляется ссылка на imgur, ютуб не дает приложить скриншот но дизассемблирования нет. imgur. com/a/vkaB2nr (без пробела), также не появляется по нажатию Alt+8
@@AlexanderSemenko я не очень компетентен в сфере VS поэтому не знаю с чем это может быть связано :(
@@Lathary_EFT_Products Этот пункт появится в меню когда вы запустите программу из под отладчика (F5)! ;-)
@@AlexanderSemenko Не могу приложить здесь видео, все пять попыток чистит ютуб, я попробовал запустить отладчик на примере программы hello world и пример с ассемблерной вставкой из видео, тоже не появляется дизассемблирование
Только вот не ясно параметры пушатся в стэк, они ведь не читаются, а читаются локальные переменные, зачем это извращение?
Япона мать скока материала надо чтобы поставить метку с ретом
мы будем изучать х64 потому что х86 устарела.... ассемблерные вставки можно делать только в х86.... смотрю дальше.
Зачем так долго объяснять что такое файл msi и что он делает!? Это для программистов или для домохозяек? 😢
15 секунд, которые я это рассказываю, для вас, похоже - это целая вечность!
Если Александр не против, оставлю ссылку, здесь хорошо объясняется работа стека - th-cam.com/video/MXoMuymbfo8/w-d-xo.html&ab_channel=AlekOS
Не сказал бы что там хорошо объясняется, что такое стёк. Скажем, после просмотра этого видеоролика, тот более менее перевариваемый. Если бы я его посмотрел до того, как посмотрел этот, я бы нечего там не понял)
Ничего не понятно
Ну, Ассемблер - это не для новичков. Попробуйте сначала пройти мой Базовый курс программирования на С++, после которого вам тут всё будет понятно