00:00:00 Музыка 00:03:00 Вступление 00:09:45 С чего начнем 00:09:25 Что нужно чтобы повторить 00:14:00 Технический перерыв 00:18:20 Продолжение - Что нужно чтобы повторить 00:20:20 Что такое язык ассемблера 00:23:00 Пишем первую простую программу используя машинный код 00:23:50 Технический перерыв 00:24:15 Продолжение - Пишем первую простую программу используя машинный код 00:36:00 Пишем программу под bios 00:44:45 Про системы исчисления в современных электронных вычислительных машинах 01:04:30 Завершаем стрим
SP - понятно что stack pointer, а BP - видимо base pointer, типа база для операндов подпрограммы. Они же в паре практически всегда используются, но непонятно нафига если и относительно SP можно считать.
Добрый день, хотелось бы услышать от вас мнение о других языках программирования: Go, Rust в сравнении с Node.js , сложно определиться где и какой лучше для каких задач
Регистр IP забыли. Регистр флагов забыли. Эти важны. SI - Source Index. Ну и я бы все-таки регистры переменными не называл даже для упрощения, ибо потом у людей начнется путаница, когда начнете им объяснять, что переменные - это ячейки памяти. Регистры - это железные операционные ячейки процессора, в которые он откуда-то грузит данные, как-то их обрабатывает, и потом из них куда-то кладет результат. Все-таки, обучаться этому легче на более простом процессоре, нежели 8086. На мой взгляд, 8080 или Z80 - идеальнейшие варианты. В 8086 много уже предсказуемого развития, которое, тем не менее, отвлекает внимание от сути.
Регистр IP - это регистр которым вы не можете управлять напрямую. В отличии от тех регистров которые были озвучены. Только косвенно. Потому, его я не озвучивал, но он безусловно появиться в будущем когда мы будем говорить о том, как процессор выполняет те или иные команды Про регистры процессора. Я не понял что означает - куда-то кладт результат. Если Вы пытаетесь сказать, что существует необходимость содержимое регистра, например скопировать в оперативную память, для того, чтобы потом что-то с этим делать, то я совершенно не согласен с этим. По причине того, что можно писать программу которая будет оперировать только регистрами процессора. Без необходимости держать рещультаты своей работы отдельно в оперативной памяти или какой-либо еще. Регистры процессора - это таже самая память. Только именованная и самая быстрая. Как только мы говорим про именнованность - мы сразу получаем типичную аналогию с коробочками. Которыми регистры и есть.
@@demimurych1 я вам говорю о том, что ваше объяснение регистров для людей непонятное, которое введет их в заблуждение в будущем. Разумеется, вы можете простейшие программы писать так, что у них не будет никакого результата, который не надо будет никуда выводить, но это будет скорее частный случай, потому что вы описали поведение зависшей программы, не подающей признаков жизни во вне. Поэтому да, обычно существует необходимость писать из регистров куда-то в память или устройство ввода/вывода, чтобы в работе процессора был какой-то смысл для нас. Поэтому регистры - это операционные ячейки, в которых вы оперируете данными, их конкретное количество, у многих из них конкретное назначение. А ваше объяснение, в т.ч. о том, что "имена к ним прибиты", помешает правильному восприятию регистров, некоторые из которых могут быть легко переименованы внутренними триггерами. Это механика из даже более старого Z80. Что касается регистра IP, то вы внезапно пишете в него напрямую, когда прыгаете jp или call на какой-то адрес, или когда совершаете возврат из процедуры. ret, по сути, можно было бы переименовать в какой-нибудь _pop ip,_ а _jmp addr_ - в _mov ip, addr,_ или _add ip, disp,_ если у нас относительный переход. Я упростил, поэтому без сегментных регистров. Да, мнемоника придумана другая, но суть действия с регистром ровно та же. Мнемоника - это просто мнемоника, понятное обозначение машинных кодов для человека, как вы сами совершенно правильно и сказали. Т.е. в принципе это обычный регистр, с той только разницей, что он постоянно инкрементируется, и что по адресу, на который он указывает, из памяти вычитываются инструкции, или их части, которые затем выполняются. Поэтому его часто называют программным счетчиком, чем он и является. Ну опять же согласитесь, сложно его "коробочкой" назвать с такими его свойствами. Сильно умная коробочка получается с прибитым к ней счетчиком. Инструкция Int nn - это тоже не само прерывание, а всего лишь аналог инструкции call с чтением адреса из памяти по смещению. Просто используется механизм векторов прерываний процессора для вызова функций DOS, потому что так через таблицу удобнее публично делиться адресами интерфейсов - обработчиков исполнителей служб dos и bios, есть короткая инструкция int nn. Если бы этого механизма в данном процессоре не было, использовался бы обычный call адрес, и ничего бы не поменялось. Прерывание - это немного другое, это когда из-вне происходит воздействие на процессор, вынуждающее его выполнить обработчик нужного прерывания в случайный для процессора момент времени, прервав выполнение вашей программы, а не когда вы в коде int nn написали. Ну еще генерацию процессором прерываний самому себе в связи с трассировкой инструкций, или в связи с выполнением неподдерживаемой инструкции можно за уши притянуть, но это тоже уже такое себе, опять же тут просто задействован механизм векторов прерываний, реального прерывания не было, лишь его имитация для удобной обработки особой ситуации.
@@demimurych1 и в javascript, когда называют переменные "коробочками", имеют в виду структуры в памяти, имеющие адрес. А вот процессор может загрузить и содержать в своем регистре значение такой "коробочки", или адрес ячейки памяти (указатель на "коробочку"). Грубо говоря, регистры - это его руки, вот он может брать в свои руки значения из коробок, т.е. или из памяти с адресом, или из устройств ввода/вывода с адресом, что-то с ними делать, считая буквально на пальцах этих своих рук (АЛУ), и по завершению вычислений класть посчитанное в эти или другие коробки, чтобы мы увидели результат - либо в память с адресом, либо в устройство с адресом, которые ничего подобного со своими значениями делать не умеют. Ну хотя, устройства может быть и умеют, на то они и устройства. Вы реально этими своими "коробочками" и "переменными" запутаете людей.
Assembler для javascript разработчика так же нужен как Bootstrap C++ разработчику.. Я как плюсовик за 6 лет коммерческого опыта не столкнулся с задачей где нужен был ассемблер, что говорить о js разработчиках.
Максим, держись там, в плане здоровья, я тебя прекрасно понимаю. Относительно ASM для JS прогеров, ты ведь понимаешь, что это 0.1% от всех JS вообще понимают, что ты тут рассказываешь? Хотя ASM для DOS вроде сейчас входит в стандартный курс программирования, хотя хз как сейчас, когда я учился у нас был в рамках Pascal. На сколько практичным будет изучение байт-кода, очень сомнительные перспективы, потому, что сегодня она так, завтра поменяли, что-то в среде, будет по другому. Даже в рамках образовательной, тоже такое занятие на любителя, копаться в байтах. С точки зрения реверс инженерии, может быть, когда совсем уже других способов не осталось.
я в самом начале посвятил єтому 30 секунд. єсли вы, озаботитесь производительностью или єффективностью своего js кода, то вы неизбежно придете к логам v8 о том, как он работает с вашим кодом. а єто автоматически будет требовать от вас, базовых навыков чтения ассемблерного кода.