Skip to content

sigma-random/d00ks

 
 

Repository files navigation

INTRO
	d00ks is an ARM assembler and simulator.
	It currently does not convert instructions to ARM machine code, and
	runs all instructions symbolically in python.
	The simulator is not designed for speed, and currently the performance
	is only suitable for debugging.
	In the future, LLVM bindings and output to machine code will be possible.

USAGE
	Syntax for the basic debugger:
		$ ./dasm.py [-e] file.s
	
	Options:
		-e		Execute the program immediately without going into step-mode.

MODULES
	The assembler uses PLY as a lexer/parser combo.
	The simulator uses promise.py to optimize python bytecode where possible.

	cond.py
		Has one function for each conditional code in ARM, called by an instruction
		to determine whether it should execute.
	dasm.py
		A command-line based interface to the assembler and debugger.
	instruction.py
		Contains classes abstracting most ARM functionality.
		For example:
			Register/value accesses
			Label/value targets
			Addressing modes
			Bit-shifting operations
			Instructions themselves
		Each instruction is represented by a class, and when an instruction
		appears in the program code that is being run, an object of that class
		exists in the simulator. The execute() method is run on that object,
		passing the program state (registers) as arguments.
	lexer.py
		Used by PLY to define with regular expressions each token that will be
		parsed.
	memory.py
		Contains classes representing memory in the ARM system. An object of
		class Memory is able to perform load and store operations on passed
		virtual addresses (which are then translated into physical) addresses
		in the struct representing memory. It supports all ARM load and store
		operations, i.e. word, halfword, and byte.
		This file also contains classes representing compile-time memory store
		operations such as DCB and SPACE.
	parser.py
		Contains the yacc-based parser for d00ks. It is formed in a top-down
		fashion, with more abstract things at the top and the least abstract
		things at the bottom. Take a look at any instruction's entry for ideas
		on how to implement a new instruction. Tricky things can be implementing
		lists of items. Check out how attrlists for AREA directives are implemented.
	register.py
		Has a class representing the register state of a program. By proxy it also
		has a pointer to the Memory instance for the program, and the symbol table
		(which is available at runtime to the simulator).
	simulator.py
		Has a rather simplex class called Program which will run the fetch/decode/execute
		cycle for the program.

About

An ARM Assembler and Simulator/Debugger

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.1%
  • Assembly 0.9%