This comes up constantly: “I’m not a programmer. Can I really do reverse engineering?”
Yes. And here’s why.
Reading assembler for ECU analysis is nothing like writing software. You don’t need to invent logic. You don’t need to manage memory allocation or write algorithms. You’re reading — tracing how data moves through code that someone else wrote 15 years ago.
The analogy I use: you don’t need to be a chef to read a recipe. You need to recognize ingredients and understand the sequence.
What you actually need to understand in TriCore assembly:
There are maybe 20 instructions you’ll encounter repeatedly in ECU firmware. The rest exists, but you’ll rarely need it for calibration-focused reverse engineering.
The essential ones:
- LD.W / LD.H / LD.B — load a value from memory into a register. This is reading a map or calibration value.
- ST.W / ST.H / ST.B — store a value to memory. This is writing a calculated result.
- ADD / SUB / MUL / DIV — arithmetic. The ECU is calculating something.
- JZ / JNZ / JLT / JGT — conditional jumps. The code is making a decision (is RPM above threshold? Is coolant below limit?).
- CALL — calls another function. Follow this to understand what sub-calculation is happening.
- RET — function returns. You’ve reached the end of a logic block.
With these, you can follow 80% of what you’ll encounter in a Bosch calibration ECU.
The practical workflow:
You don’t read firmware top to bottom. You start from a known address — a calibration map you found in WinOLS — and trace backward: what reads this address? Then forward: what happens to that value after it’s loaded?
You’re following a thread, not reading a book. The assembly is the medium. The thread is the logic you’re after.
The key insight: assembly isn’t harder than the ECU’s own logic. And the ECU’s logic isn’t that complex. Torque management, injection timing, limiter checks — these are finite state machines, not quantum physics.
“Know the letters — read any book.” In Ghidra Fundamental, we spend Chapter 3 on exactly this — reading real TriCore code with actual purpose, not synthetic exercises.