Skip to main content

From C to Assembly: Blinking an LED the Hard Way

 

From C to Assembly: Blinking an LED the Hard Way

~4 hours of digging, one blinking LED, and a much better mental model of what "compiling" actually means.

The Inspiration

I've been programming since 2017 — variables, control flow, HTTP, web apps, the usual path. But I kept coming back to something Linus Torvalds said: that the compiler writes 100% of the code. I wanted to actually understand what that meant before taking it for granted.

So I went looking for the layer beneath the code I usually write: binary → hexadecimal opcodes → assembly → C. I wanted to see the whole stack, not just use the top of it.

What I Tried

I already knew my way around the Arduino IDE for uploading compiled sketches. While researching, I found out you could write raw hex machine code directly for the Arduino — but the resources I found were too dense to follow. So I stepped back one level, to assembly.

Searching further, I found a YouTube channel with an Arduino-assembly series. I copied one of their examples — a basic LED blink written entirely in AVR assembly, called from a C wrapper — and flashed it to my Uno.

That's when things started clicking. To actually understand why the code worked, I read up on:

  • What the ALU and control unit do
  • The chip's data width and address width
  • How the ATmega328P's clock cycles are used to build a real time delay, using nothing but labeled code blocks acting as a loop

Seeing a for loop built from scratch — just labels, compares, and branches — out of raw instructions was the most satisfying part of the whole exercise.

The Code

The C side just declares the assembly routines as extern "C" and calls them from setup() and loop():



The actual work happens in the .S file — setting the pin direction with SBI DDRB, 4, toggling the LED with SBI/CBI PORTB, 4, and a hand-rolled delay loop using registers R20, R30, and R31:

Takeaway

A digitalWrite(LED, HIGH) is, underneath, a single bit flipped in a port register — and a delay() is just a loop counting down through however many clock cycles you need. Once you've built both by hand, the "high-level" versions stop feeling like magic and start feeling like a well-earned shortcut.

References

  1. Assembly Programming via Arduino Uno — akuzechie's blog
  2. Arduino Assembly YouTube playlist

Further reading from my own research session: ChatGPT conversation · Perplexity search

Comments

Popular posts from this blog

PHP can run AI models - no need Python

 Objective:     Run AI models only using php. Now this is possible with  https://github.com/CodeWithKyrian/transformers-php  this library. I have tried object detection and question answering using this library. Technology:       1.  PHP 8.2 Initialization:     Guide -  https://transformers.codewithkyrian.com/getting-started 1. Initialize project by composer init cmd. 2. Install transformer library by  composer require codewithkyrian/transformers cmd. 3. Enable ffi extention in php.ini       extension = ffi      ffi.enable = true 4. Enable opcache      opcache.jit = tracing 5. Increase memory limit      memory_limit = 512M I. Object detection: ( https://transformers.codewithkyrian.com/object-detection )     Object detection can improve web application perspective . Example:  Retail applications can speed up checkout by automatically recognizing ...

IVR or SMS based navigation for smart phone not education equipped people

Problem statement:    On Thursday morning (16-10-2025) i went for walking near Perungudi in chennai. There, i was saw a truck driver he notes the address and has some navigation landmarks. But, he hesitate to follow the navigation due to every day development of chennai. He asked me if you know this location. I said , i don't know but, you may follow the map. He said I have dial pad phone no map in it. So, I was traveled with the track to reach the place used by google map. Then , I realised many Indian old people causing this problem and some poor internet place also. Solution:    If some one know where they are or say some landmark through mobile like 198 (AI). It should say their location on voice call and if they want navigation to some places it should create session with say the navigation tips. It will recall them to ensure they are going correct path. Predictable problems:    1. Voice call or sms not encrypted it may tab by middle one to give wrong ...