background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "C and Assembly Language: How To!"

input logo icon
Теги видео
|

Теги видео

asm
assembly
assembly language
c++
kim-1
commodore
programming tutorial
programming
tutorial
assembly laguage
assembly language programming tutorial
assembly language tutorial
assembly language programming
assembly language programming tutorial 8086
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:01
иностранная
00:00:04
[Музыка]
00:00:06
эй, я Дэйв, добро пожаловать в мой магазин сегодня в
00:00:09
Dave's Garage, мы изучаем, как
00:00:10
объединить C и язык ассемблера в
00:00:12
одном проекте в отдельных файлах, а не
00:00:15
использовать встроенную ассемблер, чтобы показать вам,
00:00:17
как это делается. мы собираемся сделать это с помощью
00:00:19
6502 и chem 1, стараясь
00:00:21
максимально упростить задачу, чтобы мы могли сосредоточиться на
00:00:23
деталях интеграции C и ассемблера,
00:00:25
давайте быстро взглянем на
00:00:27
код только в основной функции, чтобы
00:00:29
понять, что это такое собираемся сделать то, как это выглядит,
00:00:31
когда оно это сделает, а затем мы перейдем
00:00:32
к коду и посмотрим, что
00:00:35
это наша основная функция, и все, что она
00:00:37
делает, это очищает экран, печатает текстовый
00:00:39
баннер, а затем печатает числа с
00:00:41
нуля на
00:00:42
9999, что, конечно же, заставит
00:00:45
экран прокручиваться, поэтому тесты не только
00:00:48
очищают экран, но и выводят наш текст,
00:00:50
управление курсором и, наконец,
00:00:52
прокрутку экрана. Я изначально
00:00:54
написал все это на C, и это работало, но
00:00:56
прокрутка была даже ужасно медленной. если
00:00:58
вы используете перемещение памяти, а не
00:01:00
копирование памяти, поскольку копирование памяти не может обрабатывать
00:01:02
перекрывающиеся области, но если вы используете
00:01:04
memo, вы предполагаете, что это, вероятно,
00:01:05
записало сборку во время выполнения, но
00:01:07
это все равно будет очень общее
00:01:09
решение, мы можно добиться большего с помощью
00:01:10
оптимизированного для этой конкретной
00:01:12
проблемы, давайте начнем с просмотра
00:01:14
кода очистки экрана, мы видим, что он
00:01:16
вызывается здесь, но вверху
00:01:18
файла он просто объявлен как внешний,
00:01:20
так откуда он взялся, ну, мы' Мы
00:01:22
собираемся написать его на языке ассемблера
00:01:23
и использовать компоновщик для объединения C на
00:01:25
языке ассемблера. Сборка
00:01:27
начинается с двух операторов экспорта. Мы
00:01:29
собираемся экспортировать две функции из этого
00:01:30
кода, чтобы сделать их доступными для других
00:01:32
людей для ссылки в проекте. один -
00:01:34
чистый экран, а другой -
00:01:36
экран прокрутки. Наша экранная память находится в
00:01:39
a00, и это можно изменить, просто
00:01:41
изменив константу в коде на
00:01:43
случай, если вы повторно переключите свою плату. У меня есть
00:01:44
видеопамять где-то в другом месте, но в
00:01:47
этом В случае, если он работает от a00 до bfff,
00:01:50
это даст вам чуть-чуть 8 КБ
00:01:52
8 000 байт экранной памяти, теперь для
00:01:55
очистки экрана все, что нам нужно
00:01:56
сделать, это сохранить ноль во всей экранной
00:01:57
памяти, и это будет иметь эффект
00:01:59
гашения экрана,
00:02:00
чтобы сделать это, мы начинаем наш
00:02:02
указатель назначения как a00, который является верхним левым
00:02:05
углом экрана, который мы затем собираемся
00:02:07
в цикле вправо по 255 байт за раз в
00:02:10
цикле на самом деле 256, и мы сделаем это
00:02:13
пока регистр Y не переполняется
00:02:14
обратно в ноль, когда это происходит, мы делаем две
00:02:16
вещи: увеличиваем старший байт
00:02:18
указателя, а затем проверяем,
00:02:20
достиг ли старший байт bfff для каждой страницы
00:02:23
памяти, которая равна 256. байт, мы используем
00:02:26
регистр Y для разыменования базового
00:02:28
указателя и сохраняем ноль во всех этих
00:02:30
256 байтах. Как только мы сделали 256, и
00:02:33
регистр Y переполнится, мы собираемся
00:02:35
увеличить старший байт
00:02:37
самого указателя и когда мы это сделаем, мы
00:02:39
проверим, достигло ли теперь 20
00:02:41
старшего байта версии
00:02:43
указателя экрана, поэтому, когда он дойдет до c000, это
00:02:47
остановит одно любопытство ассемблера ca65,
00:02:50
который является Handy, заключается в том, что он поддерживает локальные
00:02:51
метки, вы можете поставить двоеточие, а затем
00:02:53
позже, если вы хотите вернуться к этому
00:02:55
двоеточию, вы должны перейти к двоеточию, минус, если вы
00:02:57
хотите перейти к следующему двоеточию,
00:02:59
это двоеточие Плюс, если вы хотите перейти на два
00:03:01
двоеточия вперед, вы собираетесь нужна
00:03:03
метка, этот выделенный раздел является
00:03:05
самой внутренней частью цикла, и именно
00:03:06
здесь он хранит 256 байтов нулей
00:03:09
от базового указателя, затем, как мы
00:03:11
видим, он проваливается для увеличения и
00:03:12
проверяет верхний бит 16-битного
00:03:15
указателя. чтобы увидеть, находится ли он в конце
00:03:16
экранной памяти, но когда он достигает c000,
00:03:18
что на 20 минут позже a00, тогда мы знаем, что все
00:03:22
готово, в этот момент экран
00:03:24
очищается, и это все, что нужно,
00:03:25
это намного быстрее, чем среда выполнения C
00:03:28
версию, которую я использовал ранее,
00:03:30
вы заметите, что я начал имя
00:03:32
с подчеркиванием, это из-за
00:03:34
процесса, называемого искажением имени, теперь
00:03:36
в C это намного проще, и когда у вас нет
00:03:38
аргументов, это простое изменение
00:03:40
имени функции на Проще говоря
00:03:42
подчеркивание перед ним, когда
00:03:43
компоновщик начинает искать соответствующую функцию,
00:03:45
он добавляет подчеркивание в
00:03:46
начале как часть
00:03:48
процесса искажения имени, это искажение имени,
00:03:50
которое, как я уже упоминал, становится очень
00:03:51
сложным в C plus plus, когда вы У меня
00:03:53
есть аргументы, имена классов и
00:03:55
все остальное, и это становится практически
00:03:56
нечитаемым, и вам нужен инструмент для
00:03:58
их создания, но в простой версии языка ассемблера, которую
00:04:00
мы здесь делаем, все, что нужно
00:04:02
сделать, это добавить подчеркивание, чтобы мы знали,
00:04:04
что когда мы вызываем очистку screen, он
00:04:05
действительно попытается вызвать
00:04:07
функцию ассемблера, называемую подчеркиванием,
00:04:08
очистить экран, и поэтому мы экспортируем ее
00:04:10
с этим именем, давайте
00:04:12
на мгновение вернемся к версии C, чтобы посмотреть, как она ее вызывает,
00:04:16
как вы можете видеть, мы не помещаем
00:04:18
подчеркивание здесь, мы просто называем это «очистить
00:04:19
экран», потому что компоновщик позаботится
00:04:21
об этом за нас, и аналогичным образом, когда мы
00:04:23
его вызываем, мы просто вызываем «очистить экран», поэтому,
00:04:25
когда код компилируется, он
00:04:27
добавляет заглушку с надписью «перейти к
00:04:28
вызову очистки экрана». компоновщику
00:04:31
придется выяснить, где это находится, и поэтому
00:04:32
мы собираемся сделать здесь два прохода:
00:04:34
сначала мы собираемся скомпилировать код C в
00:04:37
объектный файл, а затем мы собираемся
00:04:38
собрать сборку в объект файл,
00:04:40
то мы собираемся использовать компоновщик, чтобы
00:04:42
собрать их в один, на самом деле из-за того,
00:04:44
как работает компилятор cc65, я могу сделать
00:04:47
это в два этапа напрямую. Я просто выполняю
00:04:49
сборку ассемблерного кода в
00:04:51
файл DOT или и передаю его как если бы это было похоже на
00:04:53
исходный файл для компилятора C, он будет
00:04:56
знать, когда доберется до фазы компоновки, что
00:04:57
он должен сопоставить их и связать их
00:04:59
вместе, он исправляет этот адрес,
00:05:02
помещая реальный адрес того места, где
00:05:04
на самом деле находится чистый экран. в коде
00:05:05
и он вставляет этот адрес для замены
00:05:07
заглушки, давайте вернемся и посмотрим на
00:05:09
функцию рисования текста, которую мы представили в
00:05:11
прошлом эпизоде, прежде чем она выполняла какое-либо
00:05:13
управление курсором, теперь просто есть две
00:05:15
глобальные переменные, дорожки курсора и
00:05:16
курсор, почему, и все, что делает текстовый
00:05:18
вывод обновляется и управляет этими
00:05:20
переменными. В этом случае мы видим,
00:05:22
что если курсор y выходит за пределы нижней части
00:05:24
экрана, что мы проверяем, проверяя
00:05:26
его по строкам на экране, он
00:05:28
установит позицию Y как последнюю строку
00:05:30
экран, не перемещая его
00:05:32
по горизонтали, и снова прокрутите экран на
00:05:34
месте. Это функция, которую я
00:05:36
изначально написал на C, потому что преждевременная
00:05:38
оптимизация - это корень всего зла, но
00:05:40
когда она такая медленная, как раньше, пришло время
00:05:42
для некоторой оптимизации и моей
00:05:43
оптимизации в данном случае нужно было написать
00:05:45
это на ручном ассемблере, давайте посмотрим
00:05:47
на ассемблерный код, чтобы прокрутить экран, чтобы
00:05:49
прокрутить экран, что нам нужно сделать, это
00:05:51
начать 320 байт в
00:05:54
памяти экрана, потому что каждая строка имеет
00:05:57
ширину 320 пикселей и каждый блок
00:05:59
символов имеет высоту 8 пикселей, поэтому 320 раз
00:06:02
8 бит, разделенные на 8 бит на байт, равно
00:06:04
320. Вот сколько байтов мы начинаем с
00:06:07
нашего источника, затем копируем все на
00:06:09
одну строку вверх на 320 байт раньше, и мы пропускаем
00:06:12
вниз, и мы делаем это для каждой строки
00:06:14
пикселей, и это будет иметь эффект
00:06:16
прокрутки экрана, когда мы закончим,
00:06:18
мы очищаем нижнюю строку экрана, чтобы
00:06:20
ввести ее как новую строку, глядя на
00:06:22
код, и мы видим, что он загружает начальный
00:06:24
адрес экрана плюс 320 байтов в
00:06:26
младший байт и Screen плюс 320 байт
00:06:28
в старший байт, затем он запускает
00:06:31
пункт назначения как просто экран, потому что
00:06:32
это пункт назначения, который мы собираемся
00:06:34
скопировать во внутренний цикл, использует
00:06:36
регистр Y для копирования из источника и
00:06:39
сохранения его в пункт назначения увеличивает
00:06:40
Y, а затем всякий раз, когда это необходимо, он проверяет, переполнился ли
00:06:43
он до нуля,
00:06:45
и когда он разветвляется, а когда
00:06:47
нет, я должен сказать, что он разветвляется обратно к
00:06:49
метке, когда он переполняется до нуля,
00:06:51
он проваливается,
00:06:52
когда он падает через него будет
00:06:54
увеличиваться старший байт назначения, затем
00:06:56
он будет увеличивать старший
00:06:58
байт источника, проверьте старший байт источника, чтобы увидеть, находится
00:07:00
ли он сейчас в том состоянии, в котором он есть, это означает, что он
00:07:03
скопировал достаточно памяти, поэтому он может остановиться,
00:07:05
чтобы очистить последнюю строку текст экрана, для этого нам
00:07:08
нужно записать 320 байт нулей,
00:07:10
начиная с адреса
00:07:12
последней строки экрана,
00:07:14
потому что мы не можем проиндексировать 320 с помощью одного
00:07:16
регистра. Я разделил его на два
00:07:18
блока, которые мы собираемся сделать. копировать нули в
00:07:20
экранную память с двумя смещениями, одно из которых равно
00:07:22
единице e ноль, а следующее равно единице
00:07:25
e ноль ноль, на самом деле это предыдущее,
00:07:27
и мы собираемся сделать это для
00:07:29
каждого нулевого байта, и это заполнит последние
00:07:31
две строки на экране это своего рода
00:07:33
разматывание цикла, потому что
00:07:34
мы выполняем две операции на каждую
00:07:36
инструкцию ветвления, здесь может быть ошибка,
00:07:38
потому что я только что заметил, что когда я
00:07:39
уменьшаю Y, а затем делаю ветвление, если оно
00:07:41
не равно нулю, что означает, что я, вероятно, никогда сделайте
00:07:43
это для нулевого индекса, но пока все выглядит
00:07:45
нормально, мне придется проверить немного
00:07:47
более внимательно, давайте посмотрим,
00:07:50
что на самом деле делает код и как он
00:07:51
выглядит, поэтому
00:07:53
первое, что мы хотим сделать, это
00:07:54
вызвать монитор машинного языка
00:07:55
это адрес e000, поэтому мы вводим
00:07:58
его, затем я нажимаю G. Я получаю немного мусора,
00:08:00
прежде чем текст синхронизируется, и вот
00:08:02
список команд меню, которые находятся в
00:08:03
мониторе, из которого
00:08:04
мы собираемся создать
00:08:06
каталог на диске, чтобы я мог посмотрим, что находится на моей
00:08:07
маленькой SD-карте, и мы введем L для загрузки,
00:08:10
а затем введем Kim gfx.hex, это
00:08:12
имя файла, который мы будем наблюдать за загрузкой
00:08:14
с этими маленькими эллипсами, которые
00:08:16
сейчас распечатываются, это займет всего лишь некоторое время. несколько
00:08:17
секунд, я думаю, мы получим примерно
00:08:18
четыре строки точек, прежде чем он закончится,
00:08:22
затем я нажму K, чтобы вернуться к
00:08:23
монитору Кима, введите адрес 2000,
00:08:25
где я скомпилировал код для жизни, и
00:08:27
нажмите G, как только я это сделаю. вижу, что он
00:08:29
работает на терминале и будет
00:08:32
прокручиваться здесь, сделал все,
00:08:33
что мы хотели, очистил экран,
00:08:35
напечатал какой-то текст, и он прокручивает
00:08:37
экран по ходу дела,
00:08:39
файлы становятся загадочными и раздражающими, но
00:08:41
мы должны посмотреть на это очень быстро, просто
00:08:42
чтобы увидеть, как эти вещи собираются вместе
00:08:44
в окончательный проект,
00:08:46
чтобы скомпилировать Subs в sub.o, объектный
00:08:49
файл, мы помещаем его в файл make и
00:08:51
говорим ему собрать subs.asm с
00:08:53
выводом sub.o, а затем, когда мы перейдем к создаем
00:08:56
контейнер точек Kim Graphics, который мы передаем в
00:08:58
sub.o как один из исходных файлов, и
00:09:00
компоновщик будет знать, что он должен объединить
00:09:02
этот объектный файл с объектными
00:09:04
файлами, которые он генерирует из кода C,
00:09:05
он объединит их как последние
00:09:08
пройдите по ссылке, и все будет работать
00:09:09
правильно. Если вам понравились эти
00:09:11
краткие обзоры кода, которые я
00:09:12
делал в последнее время, пожалуйста, подпишитесь на
00:09:14
канал, чтобы я знал, что люди тем
00:09:15
временем интересуются, а
00:09:17
между тем я увидимся в следующий раз
00:09:19
здесь, в гараже Дэйва.

Описание:

Dave shows you how to combine C and ASM in the same project and same binary, while keeping them separate and avoiding inline assembly. Featuring 6502 C and ASM on the Commodore/MOS KIM-1

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "C and Assembly Language: How To!"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "C and Assembly Language: How To!" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "C and Assembly Language: How To!"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "C and Assembly Language: How To!" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "C and Assembly Language: How To!"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "C and Assembly Language: How To!"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.