I get the feeling that all of these assembly jokes are justifications to avoid learning assembly.
You can still make syscalls in assembly. Assembly isnt magic. It isn’t starting from the creation of matter and energy, it’s just very specific code.
It’s just a joke friend.
I said so in my comment, try to keep up.
A very bad one if it requires switching off a large portion of your brain to find it funny.
Assembly isn’t that hard. It’s the same imperative programming, but more verbose, more work, and more random names and patterns to remember. If you can understand “
x += 3
is the same asx = x + 3
”, you can understand how theadd
instruction works.I wouldn’t be able to write Rollercoaster Tycoon in assembly because keeping track of all that code in assembly files must be hell, but people pretending like you need to be some kind of wizard to write assembly code are exaggerating.
These days, you won’t be able to beat the compiler even if you wrote your code in assembly, maybe with the exception of bespoke SIMD algorithms. Writing assembly is something only kernel developers and microcontroller developers may need to do in their day to day life.
Reading assembly is still a valuable skill, though, especially if you come anywhere near native code. What you think you wrote and what the CPU is actually trying to do may not be the same, and a small bit of manual debugging work can help you get started resolving crashes that make no sense whatsoever. No need to remember thousands of instructions either, 99% of assembly code is just variations of copying memory, checking equality and jumping anyway. Look up the weird assembly instructions your disassembler spits out, they’re documented very well.
Assembly is hard, because you need to understand your problem on multiple levels and get absolute zero guidance by compilers.
Even C guides you a tiny bit and takes away some of the low level details, so you have more mental capacity to actually solve your problem.
Oh, and you have a standard library. Assembly seems to involve solving everything yourself. No simple function call to truncate a string or turn a char array to uppercase.
Unless you’re developing an OS or something, you’ll probably be using the C standard library and maybe a bunch of other libraries provided by most distros. Just because you’re doing assembly doesn’t mean you need to program syscalls manually.
Modern assemblers also come with plenty of macros to prevent common mistakes and provide common methods. For instance. NASM comes with things like
%strcat
to do string concatenation.I suppose the lack of compiler warnings can be a challenge, but most low-level compilers don’t exactly provide guidance for when you design your program wrong.
No doubt Assembly is harder than Java or Python, but compared to languages like C, I don’t think it’s as hard as people pretend to it to be.
Missing “;” on line 148.
I wouldn’t be able to write Rollercoaster Tycoon in assembly because keeping track of all that code in assembly files must be hell, but people pretending like you need to be some kind of wizard to write assembly code are exaggerating.
Well, they’ve got a point for the bigger machine codes. Just the barebones specification for x86 is a doorstopper IIRC.
From what I’ve heard, writing big stuff in assembly comes down to play-acting the compiler yourself on paper, essentially.
From what I’ve heard, writing big stuff in assembly comes down to play-acting the compiler yourself on paper, essentially.
I think that’s true for just about any programming languages, though the program you’re “compiling” is a human understanding of what you’re trying to accomplish. Things like
val bar = foo.let { it.widget?.frub() ?: FrubFactory::defaultFrub(it) }
don’t come naturally to the human mind, you’re already working through the logic required before you start typing.As for the x86 instruction count: you don’t need to know all of them. For instance, here’s a quick graph of all of the instructions in
systemctl
on my system:With the top 15 or maybe to 25 of these instructions, you can probably write any program you can think of, and what’s missing will probably be easily found (just search for “multiply” or “divide”). You don’t need to know
punpckldq
to write a program.What language is your pseudocode example modeled after? It vaguely reminds me of some iOs App code I helped debug (Swift?) but I never really learned the language so much as eyeballed it with educated guesses, and even with the few things I double checked it has been a few years, so I have no clue what is or isn’t legal syntax anymore.
TIL. I had tried to learn it a bit, but felt lost pretty fast. Is there a good into to the basic instructions you’re aware of?
By “play act the compiler” I mean a fairly elaborate system of written notes that significantly exceeds the size of the actual program. Like, it’s no wonder they started thinking about building machine compilers at that stage.
Having toyed with video game reverse engineering, I definitely feel like I ought to learn a bit more. I understand
mov
, pointers and registers, and I think there was someinc
andadd
in the code I read to try to figure out base pointers and pointer paths (using Cheat Engine), but I think knowing some more would serve me well there.
IMHO assembly isn’t hard. When you gain enough experience you start to see „visual patterns“ in your code. For example jumping over some lines often equals to a if/else statement or jumping back is often a loop etc. Then you are able to skim code without the necessity to read each line.
The most difficult part is to keep track of the big picture because it is so verbose. Otherwise it’s a handful or two of instructions you use 90+% of the time.
I needed it often in the past in the PLC world but it is dying out slowly. Nonetheless, when I encounter 30+ year old software I’m happy to be able to get along. And your experience transitions to other architectures like changing from one higher language to another.
Nonetheless, if I’m able to choose, I’ll take Go. Please and thank you 😊
The most difficult part is to keep track of the big picture because it is so verbose. Otherwise it’s a handful or two of instructions you use 90+% of the time.
It’s a long time since I wrote any assembly in anger, but I don’t remember this being an issue. Back then Id be writing 2D and 3D graphics demos. Reasonably complex things, but the challenge was always getting it fast enought to keep the frame rate up, not code structure.
As you say, I think you just establish patterns to decompose the problem.
Assembly code is for writing C compilers, and C compilers are for writing Lisp interpreters.
I saw a Scheme interpreter written in assembly running a C compiler written in Scheme.
deleted by creator
Only the most very basic compilers. C compilers are in C mainly.
Not the first C compiler obviously. According to this Stack Overflow post, BCPL* begat B, which begat C. Language self-hosting is pretty fascinating.
*Perhaps BCPL was originally written in assembly; I’m not certain: https://github.com/SergeGris/BCPL-compiler
Talking about bootstrap here?
Back in High School in the 80’s me and a buddy wrote a Z-80 editor assembler in TRS-DOS BASIC.
It was not rocket science.
I never did get very far with the TRS-80 Editor Assembler, but that was my first exposure to such things.
I also remember the BASIC code for the Dancing Daemon which was replete with PEEKs and POKEs, such that much of it was written in machine code.
True, it was computer science.
Look at mister fancy pants with and assembler.
How about entering straight opcode, operand with only a hex keypad and two pairs of 7 segment LEDs. You can only see one set of numbers at a time. You had to write it out on paper to be able to keep track and count positions so you don’t use your spot.
I had to do this as a project in school. Two 8088 units that we breadboarded to a UART that we used to drive a fiber optic link to communicate with each other with a basic protocol. All descrete components hand wired and coded.
It made you tie all of skills together into a full system of hardware and software.
Alright you and Joe McMillan had a great weekend we get it
Assembly used to be a required course for CS undergrads in the 90s. Is that no longer the case?
Also we had to take something called Computer Architecture, which was like an EE class designing circuits with gates and shit.
Its still a thing
Which target did you use? Having to learn even a fraction of modern x86 would be ridiculous, but SPARC or something could be good to know, just to reduce the “magic box” effect.
This was a long time ago. I’m pretty sure it was 8086.
I learned MIPS as an undergrad. Pretty neat little RISC architecture.
I learned mips as graduate. In undergrad had to build with logic gates for things like 2 digit decimal counter and my architecture classes were diagram blocks for a simple CPU. But by that time we knew how to do moderate complexity circuits in VHDL simulation, and we had to make a simple VHDL circuit run for real in FPGA.
Required course work for electrical engineers in the early 2000s.
I had to learn assembly but was one topic of many we handled in architecture. Like one question of one exam. That was one of the toughest professors we had, class was about 2001
I attended two different Bachelor’s courses, one with a very technical (2016-2018) and one with a more high level focus (2018-2023). The first did have a class where we learned how to go from logic gates to a full ALU as well as some actual EE classes, but I didn’t go far enough or memorise the list of classes to remember whether Assembly would have become a thing. We learned programming with first Processing, then C and C++.
The second had C as an elective course, and that was as technical and low-level as it ever got.
I think the university I went to phased out the EE requirements the year after me. Honestly, I think it should be required. Understanding how the computer “thinks” is such an important skill.
It’s now been 18 years since the last time an employer paid me to write assembly, but it’s only been a year or so since the last time I had to read assembly at work (in order to verify what the compiler really was doing).
Not since the 1980s on a Commodore 64.
SYS64738
I remember watching assembly demos in the early-mid 90s and thinking those guys were wizards
Nah, I don’t hate myself that much.
I learned assembly for a few weeks when I first started a new job once (didn’t even have anything to do with my job), and I always felt like my brain was tired after trying to write in assembly. Just took so much more mental concentration than writing in c for example.
In college back in 1991. Also had to do PASCAL and FORTRAN but thankfully those two were in a single course.
I also took PASCAL in the 90s, but it is considered a high level language, and writes similarly to other high lvl languages, assembly has a very different syntax
Oh, I know. I meant that we had to take courses on older languages as part of the curriculum. That was a funky little college program. The oddest experience for me was taking Python back in the day as the “new thing” then not seeing it again until it absolutely exploded ~10 years ago. That program is also why I ended up playing with Linux so early on. The professors truly seemed to have a passion for emerging technologies while not wanting anyone to forget what came before. Thankfully, no punch cards.
Assembly was easier to me than C/C++.
I was pretty into x86 asm in my teens. Nasm was my go to. Anyone else ever play with MenuetOS?
For a university assignment, I built a compiler for x86; I cheated a bit by relying on LLVM, but it gave me a better understanding of the architecture. I also developed emulators for the NES (Ricoh 2A03) and RISC-V (RV32I) as a hobby. For the latter, I implemented it in FPGA.