This thesis proposes an automated method for obtaining tight best-case and worst-case timing bounds on unstructured assembly code without manual annotation. A control flow graph is generated from assembly code and transformed into a timed automata model. Instruction times are modeled and the processor state is tracked with variables. Model checking is used to extract shortest and longest paths, yielding best-case and worst-case execution times. The method is demonstrated on examples for the PIC and IBM1800 microcontrollers.