Take the 2-minute tour ×

So First of all, I did Graduate from a University with a B.S. in Computer Science, and while I feel I got a multitude of programming experience.....I really missed out on the SUPER low level stuff.

I know C pretty well as well as C++, but I basically know no assembly. I don't really know what things like Stack traces are......and for that matter I don't really understand the Stack, Stack Overflow or Buffer overflow or anything like that. Basically anything on the low end spectrum (which I really need to learn).

Also I find Hacking/Cracking interesting (from an Educational point) that utilize these low level things (Like Stack Overflow).

Where would I learn about things like this? What would be a good way to start?

share|improve this question

closed as too broad by gnat, MichaelT, GlenH7, Doc Brown, Bart van Ingen Schenau Sep 30 '13 at 7:46


You know C/C++, and you don't know what's stack traces and stack overflow are... That's interesting :) –  Coder Sep 9 '11 at 16:35
"SUPER" low. You mean like silicon dopant concentrations? –  Karl Bielefeldt Sep 9 '11 at 18:39

6 Answers 6

up vote 6 down vote accepted

The other answers focus on resources to learn assembly, but I think what you need "to understand low-level stuff" is far more than just how to read mov %rdx,0x18(%rsp). You need a basic understanding of

  • the hardware architecture
    • virtual memory
    • processor pipeline
    • interrupts
    • kernel mode/user mode
  • process isolation
  • linking of object files
  • etc.

In our Comp. Sci. bachelor curriculum, we had a mandatory course called Systems Programming and Computer Architecture, which taught the above using the book Computer Systems: A Programmer's Perspective. I can absolutely recommend it.

After taking that course, I was able to fluently read and write assembler and understood a whole lot more than any assembler tutorial will tell you.

share|improve this answer

Get an Arduino and start playing with it. Programming Microcontrollers is really low (with this you can use both C and Assembly), and hell of a lot of fun. Soon, your mom will start seeing walking robots at home.

Other than that, you could try disassembly things with a disassembler and modify the code, this involves Assembly language, and then recompile (this is how cracks are made). Back in the days I enjoyed using Hackman tools.

Otherwise, what about a custom C written driver for your VGA? Or even a custom BIOS.

When you feel really confident with Assembly and really want to prove your skills, you can take a look at emulation.

share|improve this answer
One could also pick up a used smart phone and learn ARM assembly and go to work on that. –  Jetti Sep 9 '11 at 14:04
Any book/reading suggestions for learning this? –  Mercfh Sep 9 '11 at 14:10
Here are some tutorials to get you started on Disassembling‌​. Don't get scared, it's hard to find some good looking and well presented document about the topic. –  Jose Faeti Sep 9 '11 at 14:20
I guess also...Arduino feels kinda "away" From normal MC programming, I guess I could go even lower level than that, but isn't it possible to do pure Assembly through the AVR on Arduino anyways? –  Mercfh Sep 9 '11 at 15:52
Of course you can, it's a microcontroller after all. Check this and this. –  Jose Faeti Sep 9 '11 at 15:58

I think you can't go much wrong with The Art of Assembly Programming by Randall Hyde.

It appears the latest edition is from 1996 or thereabouts, so you'll probably have to do some work on getting tools working.

But apart from that I have run into this book/presentation numerous times, and it seems that it's the most recommended assembly programming text for beginners.

EDIT: regarding tools, if you install Visual C++ Express or the Windows SDK then you get Microsoft's MASM (called ml) installed. It uses Intel syntax. Install MinGW g++ and you get the GNU assembler, which uses AT&T syntax by default.

Cheers & hth.,

share|improve this answer

You could look at linux/FreeBSD drivers and low level kernel code. You could learn assembler as well, if you really wanted to go low.

share|improve this answer

If you still have a x86 Windows box or VM around (won't work with x64), you have easy access to an assembler/disassembler/hex dump called DEBUG. Just open up the command prompt and type "debug" to launch debug.exe.

It gives you access to your memory contents and can execute some EXEs. One assignment that I had to do with DEBUG is to make my video RAM display a random collection of colors.

share|improve this answer

Get this book, very solid foundation on PC (x86) architecture and assembly programming: http://www.amazon.com/Assembly-Language-x86-Processors-6th/dp/013602212X

share|improve this answer
