Pull to refresh
16K+
15
32
Rating
6
Subscribers
Send message

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

Level of difficultyMedium
Reading time12 min
Reach and readers9.3K

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

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

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

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

Level of difficultyHard
Reading time13 min
Reach and readers16K

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

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

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

Level of difficultyMedium
Reading time10 min
Reach and readers8.9K

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

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

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

Level of difficultyMedium
Reading time11 min
Reach and readers11K

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

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

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

Level of difficultyMedium
Reading time10 min
Reach and readers15K

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

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

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

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

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

Ну, чини!

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

Level of difficultyMedium
Reading time12 min
Reach and readers10K

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

Ну, привет!

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

Level of difficultyEasy
Reading time5 min
Reach and readers39K

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

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

Information

Rating
250-th
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity