// Язык Ассемблера #1 [FASM, Linux, x86-64] //
ฝัง
- เผยแพร่เมื่อ 10 ส.ค. 2019
- Библиотека (со всеми процедурами, которые будут разобраны в последующих видео): github.com/Number571/ASMLIB
Материал по ассемблеру FASM:
flatassembler.narod.ru/fasm.htm
www.cyberforum.ru/fasm/thread1...
Примеры программ с ассемблером NASM (во многом схож с диалектом FASM):
asmtutor.com/
Книга по языкам ассемблера:
Assembler для DOS, Windows и UNIX (Автор: Зубков С.В.) - วิทยาศาสตร์และเทคโนโลยี
Только начал изучать асм и тут ролик от тебя. Жду продолжение
I know I am kinda off topic but does anybody know a good place to watch newly released movies online ?
@Cayson Jaxson lately I have been using flixzone. Just search on google for it =)
Огромное спасибо за данный видео-урок давно был заинтересован в языке ассемблер, но ничего не понимал, после этого видео появилась понимание, хоть и чуть-чуть, но уже понимаю. Ещё раз спасибо!!!
Спасибо большое Автору за отличную работу !!!
Спасибо! Было интересно, четко и внятно!
Действительно прекрасный человек.
Мне нравится такой стиль обучения. Я так PHP, С/С++ и другие языки выучил давно-давным в далеком детстве. Учил языки на готовых коммерческих проектах (правда первые проекты делал для знакомых, сроков как таковых не было). Надо было сделать сайт. Купил книгу и по книге уже делал готовый сайт. Точно так же и C++. Проект для знакомых, тоже накупил, накачал литературы и делал.
Теперь уже давно работаю программером. ASM интересует лишь в образовательных целях и возможно реально когда то буду использовать на практике для написаний процедур для С/С++
Как раз в след. семестре ассемблер, на каникулах прослушаю ваши видео! Звучит очень полезно :)
Рекомендую почитать Столярова А.В. Введение в профессию. Азы программирования. После первого тома начинаешь читать второй про ассемблер и там в разы доходчивее.
Спасибо! Очень хорошее видео. Разобрался, всё получилось.
Спасибо за труд и знания .Удачи вам а я продолжаю )
большое спасибо.все понятно и разборчиво!
Так-так-так, не намёк ли обои в видео, что окончанием курса будет урок по взлому CERN'а и его продолжением будут уроки машинного кода, концом которых будет взлом IBM-5100?
Бро офигеть. Лукас!!!!
Очень полезно, спасибо!
)))
фасм, насм, пасм, в данный момент мы ...звук выстрела...
Ту-Туру, КриптоФан! Благодарю тебя за твои труды. У меня к тебе вопрос, ты сам учил ассемблер или ходил на какие-то курсы?
классный урок, очень интересно
Я человек простой: вижу шайтан-калитку - ставлю лайк и подписос
Топ, ясно и понятно!
Давным-давно я распечатывал дамп памяти , брал в руки техническую документацию по шестнадцатеричным кодам дампа и восстанавливал исполняемый код программы на ассемблере.. Потом написал на ассемблере дис-ассемблер. Увлекательное время было , когда ты мог взять под контроль большой комп универа или вносить ошибки в исполняемый код программы кореша для шутки или недруга в момент его исполнения.
Нихрена не понятно, но ооочень интересно, уже 5й раз буду пересматривать, что бы осмыслить все что здесь сказано и показано🤣🤣
З.Ы К автору никаких претензий, это исключительно моя невнимательность и несостоятельность в этих вопросах)
Интересный у тебя канал))
Большое спасибо!
спасибо за видео, все очень круто и понятно
Круто!
пользуюсь линуксом, нету драйвера на мышку что бы управлять подсветкой. Думаю такой надо накодить драйвер, узнав и инторнете что можно на ассемблире. открыл этот видос! понял что мне подсветка ненужна!
О, я немного пишу на асме для 8051-совместимых микроконтроллеров. Какое все непохожее! Но кое-что знакомое есть, местами понятно. Поставил Debian на виртуалку, будем попробовать.
ВРАТА ШТЕЙНА!!!
Красавчик
Спасибо!
Подскажите пожалуйста какую нибудь литературу по FASM ассемблеру.
Полезные уроки, благодарю за проделанный труд. Хотел бы спросить, изучал ли ты C++? Если да, то будут ли уроки по нему?
Смысл ?
По c++ полным полно гайдов , тот же Гоша Дударь .
@@babyblade1 Но объясняет он так: "Это переменная, сюда пишем тип данных перед названием, а дальше название". Это тупо отрывок из его уроков, так он объясняет. Но есть другие каналы, которые намного лучше объясняют
Thank you!
Мне очень нравится вот эти, два языка Ассемблер и C. И я думаю ни один язык высокого уровня, не должен обходится без низкого. А познакомился я с ними при программирование микроконтроллеров. Вопросы у меня к вам! Для взаимодействия с аппаратной частью пк нужен Ассемблер? Как раньше графический интерфейс писался на ассемблере? И посоветуйте хорошую литературу по ассемблеру в которой бы желательно, рассмотрено от взаимодействия с аппаратной частью и кончая создание графического интерфейса.
Здравствуйте! Скажите пожалуйста, что мне делать, когда я скомпилировал программу из данного видео и дал ему право исполняться, он выдал ошибку сегментирования. ОС Xubuntu 18.04
echo $? в линуксе выведет код возврата приложения (в винде echo %errorlevel%)
Годный контент! Жаль такого мало в интернетах
спасибо за видео, жаль канал забросил((9(
Лайк за Haskell
Не знаю как это обьяснить , но я ток посмотрел врата штейна . И из за всех тем в аниме связанных с древними языками кода , вспомнил про ассемблер и решил посмотреть , что он из себя вообще представляет . И тут эти обои кхаааааах)
Нечего не понятно, но очень интерестно
Да, материал преподается не очень доходчиво. Рекомендую почитать Столярова А.В. Введение в профессию. Азы программирования. После первого тома начинаешь читать второй про ассемблер и там в разы доходчивее.
@@nickdsl а по масм32 какая книга хорошая?
Первая часть фразы в точку!
благодарю за видео, что то на попугае не выдает ошибку на exit если rbx поставить не 0. просто выдает что программа не прошла. И "релизная" версия выдает Segmentation fault.
Спасибо
Интересно, но если это номер 1, то наверно надо было начать хотя бы с ознакомлением инструментов более детально, что и как настроено, а не сказать, что будем FASM использовать и как хотите и где хотите думайте как его запускать.
Спасибо за уроки! пожалуйства скинь мне свой Sublime Text (extension) не могу установить Ассемблер
Почему компиляторы С/С++ не эффективно компилируют, почему нужно писать на Ассемблере?
Подскажите!
не нужно тебе писать на ассемблере, расслабься
Какой дистрибутив?
я, если честно, не очень понял **для чего** это нужно? типа, если хочется сократить код до килобайта, (с таким функционалом то) есть си и альтернативные компиляторы gcc с мощным препроцессингом.
использовать ассемблер для максимальной оптимизации? ну, наверное, хз. но раз так, может хорошим примером будет показать, как си код транслируется в ассемблерный? есть визуализаторы процесса исполнения кода, это я могу понять. но какие прикладные проблемы решает чистый ассемблер я понять не могу.
короче, у тебя еще есть возможность читать комменты, очень прошу: прокачивай подачу, особенно в направлении объяснять, зачем это нужно и как именно это работает. в русскоязычном ютубе есть очень дерьмовые по подаче видео на разнообразные айтишные темы, но все скатываются в говно именно из-за подачи. так что у тебя есть все шансы сделать офигенный материал.
cool
Привет, создай беседу ВК/ телеграмм , для вопросов и общения , твои уроки очень помогают , спасибо!
Беседу создавать лень )
По поводу вопросов, можете писать в личные сообщения, отвечу как смогу.
@@CryptoFunIT где взять такие же обои как у тебя?
@@user-uz2fm8pq3s mega.nz/#!h99BHKRI!tEZPe51Squpo1LcBlWCc9P2ne0y-ATyPt5wgCx_GxzM
@@CryptoFunITЛентяй?
Ссылочку на обои можно?
Найс
Здравствуйте!) почему в начале плей-листа не рассказывается о том какой редактор используется? Почему структура папок именно такая? В какой папке какой файл создать? Может я не достаточно умен для этого плейлиста, направите тогда на видео где посмотреть о том о чем здесь нету, а то в первом видео уже куча всего создано и не понятно по какой логике. Желательно так чтобы было понятно еще мне на виндовс …
new_line equ 0xA это что то типа int new_line=0xA; ??? или я не так понимаю?
Псевдо-инструкция equ подобна строке из языка программирования Си:
#define new_line 0xA
То-есть, equ определяет имя константы и связывает его со значением, которое будет заменяться на этапе препроцессора. Тем самым, equ не занимает никакой отдельной памяти в работающей программе, а просто является подстановкой. В ассемблере FASM есть ещё две похожие операции на equ, а именно fix и '='. Псевдо-инструкция fix имеет высший приоритет подстановок, то-есть её можно без проблем использовать для переопределения инструкций препроцессора и только после неё начинаются другие подстановки:
define fix equ
inc fix include
И последняя псевдо-инструкция - это знак '=', которая в отличие от equ вычисляет значение выражения сразу на этапе препроцессинга. Это легко можно проверить при помощи символа взятия текущего адреса в программе '$'. Если мы определим
len equ $-msg
как взятие длины сообщения, то всё будет в данном случае печально, так как вместо длины сообщения мы получим полную инструкцию $-msg, вместо конкретной длины и итогом будет являться ошибка.
Если же мы определим
len = $-msg
то в len будет храниться конкретное число, которое можно уже использовать для указания длины сообщения.
JMP exit ! Вы не вызываете подпрограмму, а производите системный вызов завершения программы. После call в стеке остаётся адрес, адресующий команду после call - зачем засорять стек мусором ?. Понятно что система стек очистит, но правило хорошего тона :)
Почему компиляторы С/С++ не эффективно компилируют, почему нужно писать на Ассемблере?
Подскажите!
@@sledleo Любой язык высокого уровня перекладывает свои операторы на команды процессора. И в этом процессе возникает избыточный код. Операторов в С десятки, а команд у процессора сотни, а с учётом MMX итд может уже и тысячи. У компилятора нет искусственного интеллекта поэтому он это делает стандартными блоками которые далеко не всегда подходят для вашей задумки. Это как строить дачу из каменных блоков египетской пирамиды :) Но для коммерческого софта важна цена, время разработки и командная работа - поэтому большинство программ на С.
Подскажите, какой формат у windows?
Может уже поздно, но отвечу на всякий случай. Формат у Windows - PE GUI, а у 64-х разрядной соответственно PE GUI64
Какой редактор используете?
лучше vim ( на первый взгляд страшно, но там можно поставить кучу плагинов, очень удобно!) и QtCreatora я не встречал(зависит от задачи)
Случайно обнаружил: section '.data' writable если поставить выше данных и есть код после данных, то вызывает ошибку сегментирования. Т.е. надо после данных обязательно ставить секцию типа executable
Ничего не понял оказалась в предложениях после того как жарить шашлык, ну ладно пойду проходить три раза в неделю)
Хоть и кодим на высоких уров. языках но никогда и не поймем низкий уровень и тот кто его знает и шарит то БОГИ программирование)
Логично , что низкоуровневые языки сложнее . Тк высокоуровневые языки операются на них
Для меня низкий уровень языка это вызов изучить его от и до, и знать как работает твоя коробка с платами
false main.asm
make: *** [Makefile:11: once] Ошибка 1
Я несколько раз перепроверил и там все как в видео. В чем проблема?
Что если у меня 64 разрядный проц ? Запускать на виртуалке ?
Кто знает как в строке поменять местами слова? Это по Ассемблеру.
Какой Линукс стоит и какие пакеты ? Какие плагины в ВСК?
если бы не изучал до этого ассемблер, наверно бы не понял многого.
норм!
Вот и все )
На сайте Интела есть документация по их ассемблеру.
Любителям курить маны и знающим англиский язык, welcome:
software.intel.com/en-us/articles/intel-sdm#combined
Доки к самому FASM'у тута:
flatassembler.net/docs.php
Красиво, но нулевой байт в конце строки ни к чему, т.к. на него ориентируется лишь стандартная библиотека C (в пример методы из stdio.h, string.h ...); системные же вызовы (аля write, read) безразличны к нулевому байту и ориентируются на точное указание кол-во записываемых/читаемых байтов (3-им аргументом, соответственно в регистре edx для i386)
А почему у тебя программа для x86-64, но при этом конвенцию системных вызовов ты используешь для 32бит ? В linux x86-64 exit это не 1, а 60 и аргументы там складываются не в rbx.
То же самое хотел спросить. Ведь в x64 системный вызов - это syscall, а не int 80
Я пишу в mov rbx, 55 в exit, компилирую линкую, но ошибка не вылазит. у меня ubuntu
Попытался вывести "hello, word" программу 100 раз перепроверил, скомпилировал, слинковал. запускаю ./main вообще ничего не выводит. Помогите
Пропишите после выполнения программы в терминале:
echo $?
Отобразится код ошибки завершения программы. В моём же случае я использовал make скрипты, которые выводят на экран этот самый код.
Чем меньше тем быстрее
Ставлю лайк только за "врата штейна"
Чем отлаживать FASM на Linux? gdb понимает не все символы просто, это проблема.
Поробуйте применить edb.
либо я не врубился, либо мы занимаемся обезьяней работой. Ты в конце функции вычисления длинны строки перенёс значение из rdx в rax, а в функции вывода переносишь это же из rax в rdx...
Мельком посмотрел. "
" - это не прерогатива высокоуровневых языков. Это просто твой fasm не поддерживает экранирование символов и все тут. Попробуйка тогда nasm или yasm. А может даже в опциях и в fasm можно это указать. Но, насколько я знаю nasm поддерживает строковые литералы с экранированием...
Какой у тебя дистрибутив ?
Antergos вроде
@@morpache521 Спасибо тебе, я посмотрел обзор на этот дистрибутив. Теперь думаю может себе поставить, а я думал что у тебя убунту с темой какой-то
Скажите пожалуйста, а как дизассемблировать программы? У мены Linux, и я ищу дизассемблер с графическим интерфейсом.
Дизассемблером с графическим интерфейсом я не пользуюсь, в основном просто применяю консольную программу objdump для анализа машинного или ассемблерного кода исполняемой программы.
Спасибо! А какой командой его ставить на Xubuntu?
P.S. Оказывается стоит по умолчанию.
Почему в exit 1 это exit, а в start'e 1 - stdout? И где можно найти список этих значений?
; Завершение (eax=1) программы с кодом 0 (ebx=0).
mov eax, 1
mov ebx, 0
...
; Запись (eax=4) в стандартный поток вывода (eax=1).
mov eax, 4
mov ebx, 1
...
Все эти системные вызовы являются 32-битными и работают они при помощи инструкции int со значением 0x80. Помимо 32-битных системных вызовов, существуют также и 64-битные, которые работают при помощи инструкции syscall. Список как 32-битных, так и 64-битных, системных вызовов под платформу Linux можете посмотреть здесь, как для ARM так и для x86 процессоров: chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md.
Спасибо вам.
Пойду ка питончик поучу
Я может тупой но я не могу уже третий день заставить выполняться этот код на vs code в винде. Retroassembler не понимает этот синтаксис, fasm из терминала не выполняется
Наверное уже поздняк, но в Винде другие прерывания.
на 19 минуте я потерялся.
Странно одно!
Для функции print_string задается строка с '0' в конце и параметром len одновременно :)
И функция прерывания 80h, принимает регистры в странном порядке.
Регистр AX остался аккумулятором.
DX был указателем на данные.
СХ был счетчиком.
Что стало не так?
Адрес msg передается в регистре счетчика, а в регистре данных длина :)
И это intel придумали, не я!
Это в кернеле у линухе такая штука
сначала пушим
затем попим)))
це MATE?
Здравствуйте мне тоже помогитe, 10bc +2ac
Я один все время слышал Рбикс Рдикс Кслор??
КСТАТИ НОРМ ВЫБОР С++ И PHP?
Смотря для чего
ладно, посмотрю я эти грёбаные врата штайна
Орррррр
врата штейна кайф
Db- define byte, а не data byte
А я думал с++ сложный )))))
я тоже так думала... наивная ))
на самом деле, с++ очень сложный язык, если быть гуру-кодером, который умеет жанглировать ооп, знает и умеет пользоваться stl, лямбда функций, потоков, асинхронщины и прочего страшного мракобесия 11 стандарта, то ассемблер очень даже дружелюбный и юзерфрендли.
@@xender2112 я так не считаю
@@xender2112 Ага, также скажу, что ассемблер это очень сложный язык тк много архитектур, а к x86 вышло столько дополнений, что там инструкций тебе надо знать штук 700+. Так еще там нет ООП, и из абстракции разве-что метки и макросы, отчего это совсем не френдли яп
Все.... Ахаааа, такого слова паразита ещё не встречал...
Спасибо те мужик за туториал по ассемблеру но сделай пожалуста видос как добавить фасм в этот долбаный саблайм текст не впадло
А кто придума делать в х86 так мало регистров, и чем это обусловлено?
Если выражаться терминами книги Код (Чарльза Петцольда), то регистр есть некая защёлка, хранящая какое-либо число и с этим числом производящая действие. Для работы процессора достаточно одной защёлки, аккумулятора или другими словами регистра общего назначения. Действительно, если мы способны хранить и брать значения помещая их в регистр из оперативной памяти, то точно также мы можем производить с хранимым значением в регистре вычисления взятые из этой же оперативной памяти.
Как пример, мы можем сложить числа следующим образом (представим, что у нас есть единственный регистр = A и некий язык ассемблера со своими правилами, не вдаваясь в архитектуру процессора, просто представим, что защёлка представляет 8-битное число, адресация оперативной памяти также представляется в виде 8-битного числа. Следовательно, если защёлка способна хранить только 8-битное число, то поместиться из адреса может только 8 бит. Адрес 0x00 = 8 бит, 0x01 = следующие 8 бит и тд.):
mov A, [0x00] ; здесь берётся значение, хранимое по адресу 0, соответственно защёлка сохранило число
add [0x01]; здесь для операции add мы говорим сложить число хранимое по адресу 0x01 с числом, хранимым в регистре A
mov [0x02], A; сохраняем полученное значение в оперативную память по адресу 0x02
Учитывая то, что возможно использование push и pop операций даже в 8-битном процессоре, вполне реально создать программу любой сложности имея только один единственный регистр, другой вопрос состоит лишь в том, каких усилий это потребует.
Таким образом, защёлка или регистр - это собственная память процессора, увеличивая их количество увеличивается сам объём процессора, если углубляться в теорию всего этого, то увеличивается количество транзисторов. Поэтому ограничиваются всегда конечным числом регистров, что впринципе логично, а функцию хранения значений представляют оперативной памяти.
Современные процессоры, хранят 64-битное число и их количество достаточно масштабно для хорошей оптимизации компиляторов.
@@CryptoFunIT
"Код" я читал, все это понимаю, спасибо. Жалко, что сразу не придумали RISC, где регистров выше крыши.
Чем больше регистров тем длиннее будет машинный код команды и код программы в целом. Когда-то это было очень важно, сейчас уже не так критично.
"как работает ассемблер и как работает язык ассемблера" это одно и то же (с) Мюллер
Он же спустя 5 секунд объяснил в чём разница
int 21h
Вам привет из Украины.
Я уже підтоптаный. То есть старый.
А старого собаку новым трюкам не обучишь.
Я ассемблер уже не освою.
Вы могли бы дизассемблировать файл для процессора 8086??
db -- определить файл байт дефайн байт ане дата
Блин,откуда такие знания?)
Привет парни. Кто может дизасемблировать прошивку.? надо достать функцию одну и на си перевести
Качаешь дизассемблер для вашей архитектуры и может быть понадобится дезобфускатор
Если бы ещё AT&T синтаксис был бы...
я конечно извиняюсь, но кому нужен elf64? я думаю, все на винде сидят, а не на маках.
Я думаю он на чём привык и сидит и показал примеры, но в реалях нынешних Linux всё более и более захватывает разные отрасли, потому думаю пример тоже хороший, а кому надо под Windows - так про него тоже не мало примеров и перестроятся.