63 lines
1.6 KiB
Plaintext
63 lines
1.6 KiB
Plaintext
RCC : Ralang/Relocatable Code Compiler
|
|
======================================
|
|
|
|
NASM support
|
|
------------
|
|
remove comments | grep -v '^#'
|
|
remove ptr
|
|
section .text \n global main
|
|
|
|
Compiler pipeline: the picture
|
|
------------------------------
|
|
|
|
spp : Simple preprocessor
|
|
| - includes and conditional compilation
|
|
|
|
|
ralang : The language
|
|
| - imperative and simple
|
|
|
|
|
macros : architecture independent assembly-like macro-based
|
|
| - provides calling conventions and syscall definitions
|
|
|
|
|
assembly : macros are then converted into assembly
|
|
| - specific for an OS/arch
|
|
V
|
|
gas/rasm2 : assembler compatible with GNU assembler and r2 asm
|
|
|
|
|
V
|
|
binary : the executable, relocatable code
|
|
- inject it for fun and profit
|
|
|
|
|
|
The language
|
|
------------
|
|
|
|
The ralang language aims to be an imperative high-level language providing
|
|
limited flexibility with some basic rules for parsing to simplify the
|
|
interpretation of the code.
|
|
|
|
Check t/ for examples
|
|
|
|
The compiler is a state machine where every character can modify the
|
|
internal state of itself while directly producing assembly code.
|
|
|
|
A gramatical parser is nothing more or nothing less than that. The language
|
|
must only permit constructions that can be directly mapped to machine code.
|
|
|
|
write($1, .var0, .var4);
|
|
|
|
Strings are encoded in the stack at runtime, variable access is done
|
|
explicitly by giving the delta offset against the base register.
|
|
|
|
.var0 = "Hello";
|
|
|
|
Access modifiers:
|
|
|
|
$1024 = numeric value
|
|
.var0 = get contents of variable
|
|
&.var0 = get address of variable
|
|
*.var0 = get contents of place where the var points to
|
|
|
|
|
|
--pancake
|