[HN Gopher] Assembly Nights
       ___________________________________________________________________
        
       Assembly Nights
        
       Author : jorangreef
       Score  : 104 points
       Date   : 2022-01-02 10:36 UTC (12 hours ago)
        
 (HTM) web link (ratfactor.com)
 (TXT) w3m dump (ratfactor.com)
        
       | naruhodo wrote:
       | Lately, I've been reliving my youth of writing 6502 assembly
       | language, inspired in part by one of Ben Eater's videos[1], and
       | with the aid of Easy 6502[2].
       | 
       | I think that programming in assembly language is compelling
       | because it is "rightsized" for the human brain. You spend a lot
       | of time solving small, manageable puzzles about the best way to
       | do achieve small victories like trying to squeeze every last
       | cycle or byte out of some small section of code. And then you sit
       | back and laugh because after all that struggle you managed to
       | compute something that would take an insignificant amount of
       | effort to do in a high level language. But it works on this very
       | limited device, and that's a thrill.
       | 
       | [1] https://www.youtube.com/watch?v=yl8vPW5hydQ [2]
       | http://skilldrick.github.io/easy6502/
        
       | co_dh wrote:
       | I think you might like Color Forth, which is another rabbit hole,
       | but interesting.
        
       | Mizza wrote:
       | If hand-written assembly becomes a fashion trend of 2022 (must
       | say I'm tempted) - are there any good targets for optimization in
       | popular free software packages that anybody here can think of?
       | Filters in GIMP, effects in Audacity, etc?
        
       | praptak wrote:
       | I recently started manually writing assembly with focus AVX2 (a
       | flavor of Intel SIMD extensions). The rationale is that these are
       | complex enough that compilers do not always notice the
       | opportunity to use them, so my ultimate goal is to apply this is
       | to find a non-artificial problem where I could beat a compiler
       | :-)
       | 
       | I confirm that its one of the most satisfactory ways to add some
       | numbers using a modern computer.
        
         | stevekemp wrote:
         | My favourite way to add numbers, in assembly, was this project:
         | 
         | https://github.com/skx/math-compiler
         | 
         | I had far too much fun writing it, even though it is completely
         | pointless!
        
           | praptak wrote:
           | That sounds like formula translator, aka Fortran!
        
         | JimBlackwood wrote:
         | Would you maybe be able to share some of the learning resources
         | you've been using? I've really been wanting to get into this!
         | :)
        
           | praptak wrote:
           | I found surprisingly little material about "how to program
           | AVX/AVX2". That said here's what I used so far:
           | * Intel AVX Programming Reference [0] - comprehensive but not
           | very useful as "where do I even start"            *
           | Godbolt[1] to look at code samples produced by compilers.
           | This is good to see how the instructions work together.
           | * A random discussion that has *some* concepts behind the YMM
           | registers[2]            * Stack Overflow, for example [3]
           | 
           | [0] https://www.intel.com/content/dam/develop/external/us/en/
           | doc...
           | 
           | [1] A sample code that generates some AVX2 code:
           | https://godbolt.org/z/Kr1sojov6
           | 
           | [2] https://community.intel.com/t5/Intel-ISA-
           | Extensions/Software...
           | 
           | [3] https://stackoverflow.com/q/40623773/12166
        
       | khaledh wrote:
       | I've also recently discovered the joy of system level
       | programming. I've gone through a few iterations of writing a
       | (incomplete) kernel from scratch using different languages. I
       | started with a 32-bit kernel in C and got as far as preemptive
       | multitasking.
       | 
       | Then I decided to try Nim, I found it very ergonomic and lets you
       | write compact code that expresses the main logic without too much
       | syntax noise. But I got blocked by some issues making it work for
       | a UEFI target.
       | 
       | Then I tried Zig and got as far as parsing ACPI tables and
       | writing an AML bytecode parser. Zig is nice and I like its
       | optionals support and error handling approach. But I was put off
       | by its noisy syntax (e.g. !?*[*]u8 to represent an error union of
       | an optional pointer to a many-pointer of uint8). Also having to
       | prepare and weave allocoators throughout most of the code that
       | needs to dynamically allocate (which is most of the code) gets in
       | the way of the main logic. Even little things like string
       | concatenation or formatting becomes a chore. In the end I
       | realized that Zig is not for me.
       | 
       | So I got back to Nim and resolved the issues that were blocking
       | me. I'm now on my journey to write a complete kernel in Nim (so
       | far I have access to UEFI services and ACPI table parsing and on
       | my way to get interrups working). The code is pleasant to write
       | and read. Also the language and the stdlib documentation is great
       | (Zig's stdlib documentation is almost non-existent.)
       | 
       | Overall, I found that systems programming is very satisfying, and
       | you can depend on specs that rarely change (some are over 20 and
       | 30 years old and still work the same way today) and is quite a
       | welcome change from web dev where it depends on tech de jour.
       | 
       |  _Edit_ : Here are the github repo links:
       | 
       | - C kernel: https://github.com/khaledh/bitflow
       | 
       | - Zig "kernel": https://github.com/khaledh/axiom-zig
       | 
       | - Nim "kernel": https://github.com/khaledh/axiom
        
         | co_dh wrote:
         | github? I like the idea of using Nim to write a kernel, and is
         | curious on what the code looks like. Especially, how do you
         | avoid malloc?
        
           | khaledh wrote:
           | I wasn't ready to share it yet, but here it goes[1]. It's at
           | a very early stage, but should give you an idea of how to get
           | things up and running under Nim.
           | 
           | I didn't avoid malloc. I provided a simple bump pointer based
           | heap to get things going. Later I'll have to separate things
           | into a UEFI bootloader and a proper kernel image, each with
           | its own allocator (the bootloader will use UEFI memory
           | allocation services, and the kernel will have its own heap).
           | 
           | [1] https://github.com/khaledh/axiom
        
       | invictus_78 wrote:
       | I have one of those old netbooks and was looking for a
       | lightweight linux distro to install in it, is Alpine the best one
       | for this? Any other recommendation?
        
       | markus_zhang wrote:
       | Kinda agree with the "intel vs atnt" argument. From my very
       | limited exp in asm reading Intel is always easier.
        
         | pjmlp wrote:
         | Porting the output generator from my toy compiler into AT&T
         | syntax to only depend on GAS back when its Intel support still
         | wasn't that good was a lesson in never doing it again.
        
       | NieDzejkob wrote:
       | That's somewhat similar to what I'm doing with Miniforth [0].
       | Programming in a minimal environment is _fun_. I don 't have a
       | separate machine, so I'm booting my main laptop from a
       | thumbdrive. The difference in boot time is staggering - after
       | BIOS loads the boot sector, everything else is instant. This is
       | instrumental to my strategy for tricking myself into working on
       | the project - normally, I'm very prone to going off into a
       | research rabbit hole after taking a look at the wrong browser
       | tab. So, instead, I make sure to power off my machine in the
       | evenings. That way, booting into miniforth becomes the option
       | with less friction (:
       | 
       | Unfortunately, this does not work for writing the blog about the
       | project. Hopefully this will change soon, once I write an editor
       | and filesystem...
       | 
       | [0]: https://niedzejkob.p4.team/bootstrap/
        
       | dgivney wrote:
       | It's so nice to find something you wrote 10+ years ago still
       | being enjoyed in the wild (under the sheets no less).
       | 
       | Kudos to Dave for a great read, he's inspired me to dust off my
       | own EeePC!..
        
       | ngcc_hk wrote:
       | Great article. Good starting for a self learning project.
        
       | bambataa wrote:
       | So, firstly, I'm amazed anyone can do that in bed and then sleep
       | properly. I'd be dreaming in assembly all night.
       | 
       | When the author talked about reading the entire GNU Screen manual
       | I did think "this sounds like stressful overkill" for a personal
       | project, but I see their point about focusing on process rather
       | than goal.
       | 
       | Does it ever really matter than personal projects don't get
       | finished?
        
         | matbatt38 wrote:
         | What's wrong about dreaming about assembly? Your brain needs to
         | process all that learning
        
         | ptsneves wrote:
         | I also absolutely do not allow myself to learn new things
         | before going to sleep otherwise I will be thinking and dreaming
         | about it in a kind of sick way. This is specially harmful on
         | week days where it disrupts my sleep. Sleep is essential for my
         | well being and professional ability.
        
         | markus_zhang wrote:
         | Same boat. Exercising my brain before sleep basically means
         | I'll sleep very late because I just have to figure it out or
         | figure out that I can't figure it out in a few hours. The
         | author seems to possess some super human power to cool down
         | whenever he wants, or he is super good with assembly.
        
           | adamddev1 wrote:
           | Ya same here, if I dive into some programming task it usually
           | delays my sleep by 2 hours at least. I've had to avoid it for
           | my health.
        
             | markus_zhang wrote:
             | I'm thinking, maybe the trick is to pick an exercise that
             | can be easily decomposed into steps, each of them requires
             | very little time and energy.
             | 
             | For example, translating one assembly to another with the
             | same architecture might fit the description because most of
             | the time you are just doing "translation". Of course I'm
             | not an assembly professional so I might be underestimating
             | the difficulty here.
             | 
             | Another good example is carpentry. As long as you finish
             | step X you can leave it there. There is no need to burn
             | candles to finish all steps at once.
             | 
             | A bad example is algorithm design. Unless it's second
             | nature to you, it's really difficult to decompose it into
             | steps (because maybe they are wrong steps), and even if you
             | can, picking up from where you left off last night might
             | actually be more difficult than starting over from the
             | beginning.
        
             | markus_zhang wrote:
             | I wonder how to learn to cool down whenever you want. Going
             | to be a HUGE advantage.
        
       | eatonphil wrote:
       | I've been trying to explore programming bootloaders a bit. I've
       | got an unorganized collection of resources and a bunch of test
       | bootloader programs that are not documented.
       | 
       | I haven't figured out how to get gdb hooked so I'm just debugging
       | with a print integer routine. That's annoying.
       | 
       | And writing to and reading from the bios video service (int 10h)
       | in my text editor bootloader is not the most fun. Randomly
       | characters get overridden and it could be my code or register
       | state I haven't reset but it's pretty hard to get right and
       | understand the bios APIs.
       | 
       | I'm getting ready to give up than write anything about my
       | bootloaders since their behavior is not always deterministic in
       | more complex programs (boot4.asm is the complex text editor and
       | sometimes when hitting backspace on the last column in a line the
       | cursor _sometimes_ freaks out trying to find the end of the
       | previous line.)
       | 
       | https://github.com/eatonphil/bootloaders
        
       | djengineerllc wrote:
       | Great, now I'm going to try learning to program in NASM.
       | Definitely a great article!
        
       | wheelerof4te wrote:
       | I really like when someone has such dedication to distractionless
       | work. Reminds me of simpler times, when people used computers for
       | useful things, with a local game or two as an only medium of
       | entertainment.
       | 
       | Now we have too many distracting mediums that are only a click
       | away.
       | 
       | Internet has made many things easier, but the real cost of it is
       | yet to be determined.
        
       | 1vuio0pswjnm7 wrote:
       | "Also, though I did install Lynx, this is not a great machine for
       | modern Web surfing (except for ratfactor.com, of course). So it's
       | a pretty distraction-free device."
       | 
       | As an owner of one these ASUS EeePC netbooks I used links (a
       | different text-only browser) in VGA textmode in NetBSD for many
       | years. For the small screen size, the terminal font is easy on
       | the eyes. Lynx is one of the worst text-only browsers, IMHO. For
       | me, staying in textmode prevents distraction. However I am
       | reading from the www in textmode all the time. A large, complex,
       | Javascript-enabled, advertising-sponsored, graphical browser is
       | not necessary. No idea what "modern Web surfing" means but it
       | does not sound like it is worth the time if all it produces is
       | distraction.
        
         | fikama wrote:
         | > Lynx is one of the worst text-only browsers, IMHO.
         | 
         | What are you using then? I didn't like the "bloatedness" of the
         | modern web. So I often use browser "reader mode". But I would
         | happily try something different.
        
       ___________________________________________________________________
       (page generated 2022-01-02 23:01 UTC)