Vorticon wrote:Having cut my assembly teeth on the TMS9900, 8088 programming seems unnecessarily obtuse in comparison

All this talk about segments, the multiplicity of oddly named registers (on the 9900, you have R0 to R15 (16 bits each) ) etc... Sheesh!
I always found generic numbered registers confusing -- I could never keep straight which ones I was using for which. The intels the named registers at least had a role... AX, BX, CX and DX all serve different purposes so while you can use them as general purpose, the Accumulator (AX) does addition better, the base address (BX) is used for operators, the Counter (CX) is optimized for controlling loops or repetitive operations (like shifts), and the Data register (DX) is designed for handing IO ports. Clearly defined roles with clearly defined rules.
As to segments, you have to remember that the 9900 had a pathetically anemic tinkertoy 15 bit addressing scheme -- limiting the max RAM to 32k without paging and why I always laughed at the people who bitched about TI using the video controller on the 99's to address 8 bit memory... for a 16 bit processor it was already half neutered given it could address less max RAM than a 8 bit processor like the 6502 or Z80. 15 bits of address space was always a "What the?!?" when most 8 bit processors allowed the use of a 16 bit combined register to handle memory.
By comparison, the 20 bit addressing scheme of the 8088/80186 giving access to 1 megabyte of address space was a huge step up... but 20 bits CANNOT fit into 16 bit registers... and 32 bit registers were a ways off -- so they overlap a 'segment' register to an 'offset' register resulting in a 20 bit address made up of two overlapping 16 bit words. It's easy to wonder why they overlapped them today, but the reasoning becomes apparent if you think of it as the precursor to Selectors, which use those same segment registers to function.
Being able to state in one register a memory offest on a 16 byte boundary, then have values inside that based off a zero index can often be vastly superior to a flat 32 bit address space since it just simplifies calculating offsets. It's why for all the talk of 32 bit chips like the 68K and PPC being 'superior' for all their endless registers they actually had inferior performance when it came to the address space and protection mechanisms -- Something Intel came out ahead on ENTIRELY thanks to segments... or as they're called in protected mode, selectors.
Though for a lot of people the very concept is hard to wrap their head around.
GREAT example is the code segment -- by aligning code on a 16 byte boundary and pointing at it with a segment, so far as a 64k program is concerned it starts at address 0... meaning you can move it to ANY point in memory and not have to move the pointers around -- as opposed to older processors where if you compiled it to start at 0x1000h, it had to run at 0x1000h in the physical address space. You can then point the data segment at another point in memory as your stack, and place that at any physical address and still have your index register based off address zero.... Then you can leverage the extra segment and 32 bit segment:offset pairs to create a "heap" to make use of the rest of available ram -- exactly how the various turbo dialects did their memory management.
The only thing about Adobe web development products that can be considered professional grade tools are the people promoting their use.