they depend on - a host - ELF32 binaries - execution environemnt with int 80h software interrupts to access kernel functions (read from stdin, write to stdout, exit) and relying on a shell doing piping from and to the program - brk/sbrk for dynamic symbol table - one pass, only backward references - hex1: hex source to binary, abs./rel. adressing - hex2: one char labels for jump addresses .L -> label position, jmp L - hex3: 4-byte labels, storable in 2 32-bit word everything is done in a stack machine with functions labels are strictly 4 characters, e. g. '+,,,' for operator '+' - hex4: call of functions, operators, memory, array access, functions, stack handling labels are in a simple hash only backward references functions work by pushing arguments and return address onto the stack, return address is always the top of the stack => why not use call, ret? 'rot' is implemnted that way for compare operators it makes sense to jump to addresses maybe? entry point finds start by searching for a sequence of NOPs, so we can define all functions before using them in main almost portable as only the small functions really depend on the CPU instruction set, the main program look already lots like a mixture of C and LISP - hex5 has now a grammar gradually introduces constructs in intermediate languages hex4, hex5a and hex5b resulting in hex5c