Обновить
16K+
15

Пользователь

32
Рейтинг
6
Подписчики
Отправить сообщение

Положил http:// в строку, и ассемблер молча собрал 0 байт

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9K

Мой ассемблер резал исходник построчными правилами: срезал комментарий, искал двоеточие, делил по запятым. Я заменил это одним проходом с состоянием и попутно проверил, нельзя ли было обойтись заплатками.

Нельзя: вторая заплатка ломает то, что починила первая.

Куда делись байты?

Написал свой ассемблер, чтобы понять, откуда берётся ff010113. Почти половину моей программы он выдумывает

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели16K

Написал свой ассемблер, чтобы понять, откуда в дизассемблере берётся ff010113. Заодно посчитал, сколько строк моей программы процессор вообще не умеет исполнять, и проверил это на четырёх наборах команд, включая живой ESP32 на столе. На кристалле первая программа серии сломалась: она пишет в UART быстрее, чем провод успевает передавать, и в эмуляторе этого не видно.

Что сказала плата?

В заголовке моего ELF есть точка входа. Оказалось, её никто не читает

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.8K

Три статьи я собирал файл и отдавал его эмулятору, ни разу в него не заглянув. Заглянул. Внутри два разных описания одних и тех же байтов, ответ на вопрос, откуда взялся адрес 0x80000000, и поле, которое я заполнял зря.

Ну, открываем!

Моя рекурсия зависла навсегда, и это был правильный результат

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели11K

Написал рекурсию тем же приёмом, что во второй статье, и программа повисла навсегда: возвращаться ей было некуда. Чиню, завожу стек и по дороге выясняю, что регистра sp в наборе команд нет вовсе. А потом урезаю стек до 128 байт, и сборка об этом не говорит ни слова.

Ломать второй раз!

Мой код терял бы 230 байт из 231. Чтобы это увидеть, пришлось патчить QEMU

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели15K

Через четыре часа после первой статьи пришёл комментарий: в моём коде не хватает трёх инструкций, и на настоящей плате он рассыплется.

Читатель arteast был прав.

Сел воспроизводить поломку. Собрал два варианта, свой и правильный, прогнал на строке в 231 байт. Вывод побайтово одинаковый. Замедлил линию до предела. Ничего не изменилось. Написал программу, которая смотрит, бывает ли передатчик занят хоть когда-нибудь. При выводе в консоль не бывает.

Моя ошибка внутри эмулятора не проявляется вообще. Проверить себя было нечем.

Пришлось чинить эмулятор.

Ну, чини!

Двенадцать символов, двадцать один байт: как я научил голый RISC-V говорить «Привет, мир!»

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели10K

Без библиотек, без обвязок, без операционной системы под ногами. Реальный код на реальном железе — ну, почти реальном.
Пустая эмулируемая машина RISC-V, десяток строк ассемблера, и в терминале:
Сначала думал вывести «hello», как все.
Пусть будет «Привет, мир!»

Ну, привет!

История о том, как я флешку по воздуху прокинул

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели39K

Знаете, этой статьи могло и не быть. Если бы не один случай, который меня так взбесил, что пришлось искать решение.

Какое решение?

Информация

В рейтинге
276-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность