Многие учебники ОС начинаются в сборке или C ++. Мы начинаем в машинном коде.
В этом учебном пособии Raspberry Pi 4 мы напишем самостоятельный ассемблер в машинном коде. Затем мы развиваем этот компилятор (внедряя новые функции, а затем используя эти функции в исходном коде компилятора) в нечто, способное поддерживать язык высокого уровня. Наконец, на нашем языке высокого уровня, где начинаются большинство учебных пособий, мы напишем простой веб-сервер, чтобы один день провести собственную документацию Учебника.
Milestone: Machine Code Bootstrap?
; Команда для комментариев Milestone: Big-Endian Machine Code?
Milestone: помеченный Goto?
J : Относительная ветвь с бинарным L : Метка для Goto (читать ленту памяти со схемой pos4 name ) GOTO : goto label Milestone: условное Гото?
GOEQGONEGOGTGOLTGOGEGOLEMilestone: помеченные функции?
CALL : «Гото», но с связанным ветвлением Веха: излучающие струны
MOV reg charEMIT string : Macro для серии MOV reg char и CALL emit с поддержкой последовательности побега Веха: начальная сборка
RET : возврат после вызова функции MOV reg hexMOV reg decMOV reg regADD reg reg [reg/value] : установите значение регистра SUB reg reg [reg/value] : установите значение регистра LDB reg reg_mem offset : загрузить байт STB reg reg_mem offset : хранить байт ORR reg reg (reg >>/<< value)AND reg reg (reg >>/<< value)Веха: функции стека-ланг
.func [name] [num locals].call [name]Веха: push, pop и dup
.push constant [val]
.dup
.pop local [idx]
.push local [idx]
.pop param [idx]
.push param [idx]
.pop global [idx]
.push global [idx]
Веха: доступ к памяти стека
.load (..., Addr) -> (..., val) .store (..., val, addr) -> (...)Веха: арифметика
.add.subВеха: распределение кучи
malloc (..., num Bytes) -> (..., Addr)Веха: анализ и компиляция
fn main ) 
for f in ./os/*.txt; do wc -l $f; done | Rscript bar-gen.R ; feh ./loc-stats.png