[HN Gopher] Yes, the 8086 wanted to be mechanically translatable...
___________________________________________________________________
Yes, the 8086 wanted to be mechanically translatable from the 8080,
but
Author : zdw
Score : 128 points
Date : 2022-07-25 19:35 UTC (3 hours ago)
(HTM) web link (devblogs.microsoft.com)
(TXT) w3m dump (devblogs.microsoft.com)
| f311a wrote:
| After reading the title and domain name, I already knew who the
| author is.
| rjbwork wrote:
| Lol. My exact thoughts before clicking the link "Let me guess,
| this is Chen"
| AceJohnny2 wrote:
| Everybody Loves Raymond
| commonlisper wrote:
| Exactly! Raymond Chen is doing a great job at sharing
| interesting stories from a bygone era.
| criddell wrote:
| Bygone? It's a fairly regular occurrence where I search for
| some Win32 API and end up on Chen's blog. I get what you are
| saying about articles like this one though. I can't imagine
| much new work is happening with the 8086 (or 8088 or '186 or
| '286 or ...)
| GabrielTFS wrote:
| I mean even w.r.t. Windows stuff, quite a large part of
| what he talks about is variations on "here's an interesting
| old anecdote from 1995" or "You know that thing that's
| totally useless now and doesn't matter ? Here's why we
| absolutely needed it in 1989."
| rep_lodsb wrote:
| IMO the base+index encoding (in 16-bit x86) was a mistake, it
| should have simply allowed indirection through any _single_
| register (+ immediate offset), including SP.
|
| * the address calculation would be simple enough to do hardwired
| even on the original 8086, instead of using slow microcode. The
| 8086 actually took a different amount of clock cycles depending
| on the registers used for base and index, because there wasn't
| enough ROM space to duplicate the code for every combination
| without using jumps!
|
| * you could use [SP+xxxx] to access local variables (frame
| pointer omission)
|
| * would be able to emulate the 8080's LDAX/STAX and XTHL in a
| single instruction
|
| * with so few registers, you really want every one available for
| memory addressing. Especially AX which is used implicitly by
| instructions like LODSW and MUL.
| kazinator wrote:
| > "there was no room"
|
| They were saving it for 286, 386, ... MMX, AVX, SSE, ...
| hacknat wrote:
| My favorite Chen article:
|
| Why do Windows functions all begin with a pointless MOV EDI, EDI
| instruction?
|
| https://devblogs.microsoft.com/oldnewthing/20110921-00/?p=95...
| mFixman wrote:
| I don't understand the reasoning behind this. Why do you need 5
| bytes of unexecuted patch space before the program _and_ 2
| bytes of patch space at the beginning of the program?
|
| Wouldn't it be the same to have a single 5-byte effectless
| operation to patch a single long jump instead of needing space
| for two jumps?
| saagarjha wrote:
| 5 bytes of nops takes longer than 2 bytes?
| jahewson wrote:
| Longer _time_ to execute.
| layer8 wrote:
| The article explains why a MOV is used instead of two NOPs.
| Five NOPs would obviously be even worse.
| mFixman wrote:
| But isn't there a 5-byte single instruction that has no
| effect, like `NOP DWORD ptr [EAX + EAX*1 + 00H]`?
|
| I thought that multibyte NOPs were executed in a single
| instruction?
| layer8 wrote:
| I'm pretty sure it would be slower, if only by taking up
| more space in the instruction cache (in the common case
| where no hotpatch is applied).
| MBCook wrote:
| They may not have been coalesced at the time the decision
| was made.
| colejohnson66 wrote:
| But NOPs aren't even executed. They're swallowed by either
| the decoder or dispatcher.
| wvenable wrote:
| The article states that it's one cycle and slot per NOP.
| colejohnson66 wrote:
| Modern x86 processors decode multiple instructions per
| clock. By "slots", I'm assuming he means entries in the
| dispatcher or reservation stations. But NOPs don't even
| make it to there. As I said, the decoder that encounters
| it will probably swallow it and emit nothing.
|
| Besides, it sounds like premature optimization. This
| isn't the 1980s; An extra clock cycle per function call
| is not going to make or break your program.
| MBCook wrote:
| Modern.
|
| There is a very good chance this dates back to 16-bit
| Windows. Even Windows 98 supported the 486 which was not
| capable of independent execution (that's P5) or separate
| decode from execution (P5Pro there).
|
| Those processors weren't dead until Windows XP.
| avianlyric wrote:
| Because you can't atomically replace the NOPs. So there's
| nothing to prevent you from inserting your patch while a
| thread partway through consuming the NOPs, resulting in a
| portion of your patch being decoded out of order.
| omnibrain wrote:
| It's such a shame that they killed (twice now?) all the
| comments in the blog.
| mananaysiempre wrote:
| There is a more-or-less comprehensive archive[1] up to 2019
| (which should probably be scraped and hoarded). The article
| in question is there, comments included[2].
|
| Side note: Michael Kaplan's blog, which Microsoft took down
| in a remarkably shameful manner, has also been archived[3],
| while Eric Lippert reposted (most of?) his old articles on
| his personal WordPress instance[4].
|
| [1] http://bytepointer.com/resources/old_new_thing/index.htm
|
| [2] http://bytepointer.com/resources/old_new_thing/20110921_2
| 26_...
|
| [3] http://archives.miloush.net/michkap/archive/
|
| [4] https://ericlippert.com/
| omnibrain wrote:
| Larry Osterman's Blog seems to be gone too...
| mananaysiempre wrote:
| It's technically there[1], but I remember that a good
| portion of the articles from the 2000s are just ...
| silently missing. Not time periods, just sporadic one-in-
| three or -four mortality (as far as links from other
| blogs can be considered to be faithful sampling).
|
| To add insult to injury, the comments are there. The
| bloody _comments_ are just _there_ , like the we-could-
| not-be-arsed-to-properly-GDPR-ocalypse was very strictly
| localized to only _some_ of the blogs.
|
| I'm not even expecting malice, really, I'm just appalled
| at the blatant disregard for (what is effectively if not
| officially) historical record.
|
| (There are other blogs that were lost in the migration,
| just not this one. Hell, the entirety of the MSJ and a
| good portion of the MSDN Magazine are completely gone.)
|
| [1] https://docs.microsoft.com/en-
| us/archive/blogs/larryosterman...
| password4321 wrote:
| Yes, I miss my weekly-ish from Raymond's arch nemesis Yuhong
| Bao.
|
| For this specific blog post there's an HN discussion1 and
| archive.today2 (beware!?3) did grab comments while the
| Internet Archive does not load them:
|
| 1 https://news.ycombinator.com/item?id=3022224
|
| 2 http://archive.today/2015.07.08-134638/http://blogs.msdn.co
| m...
|
| 3 https://news.ycombinator.com/item?id=31945924#31946453
| m463 wrote:
| nice use of superscripts
| game-of-throws wrote:
| They also changed the URL at least once and broke all links
| to it. His posts deserve better.
| aftbit wrote:
| >These redundant encodings are used by some assemblers to
| "fingerprint" their output.
|
| Fascinating! Does anyone have links to more information about
| this? What purpose might one have for this fingerprinting?
| retrac wrote:
| If you sell a commercial compiler or assembler, and some
| company starts selling a product produced with your
| compiler/assembler, and you know you never sold them a license,
| you've got yourself someone to sue. For a less
| successful/commercial product, it could also just be for the
| joy of finding it used in the wild.
|
| Similar fingerprinting techniques were also used by assembly
| coders as proof of copyright. When reverse-engineering to a
| spec, it's not unusual for routines, even long routines, as
| well as lookup tables, etc. to end up being coded the same, or
| nearly so, as the original software. This isn't necessarily
| infringing of copyright -- for example there are only a few
| sensible ways to check if a character is uppercase in ASCII. It
| can be hard to tell reverse-engineered and re-implemented code,
| from disassembled and reshuffled code (which _is_ copyright
| infringement). If the suspect routine incorporates something
| like an idiosyncratic sequence of NOPs that serve no particular
| purpose, coincidence is a lot harder to argue.
| bell-cot wrote:
| One example (scroll down to 'Code fingerprint') -
| https://en.wikipedia.org/wiki/A86_(software)
| csense wrote:
| When I first got into assembly language programming, I used MS-
| DOS DEBUG as my assembler, since it was included on basically
| every PC in those days.
|
| I was _extremely frustrated_ because my textbook 's later
| chapters used MASM as the assembler, which at the time cost
| some ghastly amount of money (somewhere around $180 if I recall
| correctly, which was a truly staggering number of birthday and
| Christmas presents).
|
| Anyway, my point is, in 2022 everyone takes for granted that an
| assembler for any system that matters can be downloaded for
| free from the Internet -- or if it doesn't, one will soon be
| written by some enthusiast and posted on Gitlab.
|
| But back in the 1980's and well into the 1990's, assemblers
| were expensive products that companies actually got away with
| charging a lot of money for. Presumably they made a significant
| amount of revenue from those sales.
|
| So the use case that immediately springs to my mind is being
| able to prove a particular commercial binary was assembled by
| your assembler, in order to make a successful accusation of
| software piracy and extract a monetary settlement from its
| developer.
| jacquesm wrote:
| Yes, this is very much true. For the first three systems I
| owned I wrote my own assembler, just to save some money
| (which was incredibly tight in those days, as in: that was
| three months worth of food or so).
|
| Time was worth relatively little in comparison and I figured
| I will at least know the instruction set inside-out.
| rightbyte wrote:
| How did you do that?
|
| Did you bootstrap it with hand-assembled code or some
| Basic? Did you assemble the assembler with itself?
| dhosek wrote:
| When I was in high school, I hand-assembled my 6502 code.
| I'd write it longhand out on graph paper, then write down
| addresses in the leftmost column, opcodes in the middle &
| finally I'd type in all the hex from the Apple Monitor.
| It was slow, painstaking and error-prone, but it made for
| clear thinking about how the program worked before I sat
| at the computer.
| jacquesm wrote:
| It probably also really honed your ability to simulate a
| CPU in your head. That's invaluable when looking at code,
| to build up a mental model of what it really does (rather
| than what the comments say it does).
| jacquesm wrote:
| Getting it to the point where it would assemble itself
| was pretty much the goal of the whole exercise. Hand
| assembly with Leventhal's book (which I still have :) )
| to get it to work, usually one subroutine at the time.
| And then once it work things got much quicker, the bigger
| problem then was a proper editor.
|
| https://www.amazon.nl/Assembly-Language-Programming-
| Lance-Le...
|
| Memory management was a tricky part and macro expansion
| only got done after the whole thing worked (that would
| have saved a lot of time but I couldn't see the wood for
| the trees at that point).
|
| The nasty part was that instructions were variable length
| so you could get into these weird errors where your
| initial guess for a jump target was too small, which
| would then move everything else as well, which might lead
| to other jumps becoming too small. I don't have the code
| any more but I think I fixed that by making all the jumps
| long jumps initially. A bit wasteful but that way I could
| at least get it to work in one pass. Later on when I got
| better at assembly that sort of thing got fixed.
|
| The end product was endless 'data' statements that were
| poked into memory at 48K and up, right over the basic
| interpreter, which we had figured out a way to page out
| and replace from software. This later led to an annotated
| version of the basic that came with that computer (a
| version of MS Basic) and subsequently a replacement
| interpreter with a lot of built in goodies (double speed
| tape interface, a whole raft of new statements and
| functions). Good times!
|
| Shout out to my friend Henri G. who did at least half of
| that work, we had identical home computers (Dragon 32)
| and worked together a lot on this. He probably still has
| his in working order :)
| ars wrote:
| > $180 if I recall correctly, which was a truly staggering
| number of birthday and Christmas presents
|
| I had the same problems, only I was programming a Laser 128
| (an Apple II clone) that had a built in System Monitor, which
| let you directly change memory addresses, but no assembler.
|
| So I photocopied the Assembly to Machine Language chart in a
| book I got from the library, and did it manually - I learned
| quite a lot. I remember writing a layout and edge detection
| routine for a Tetris clone I tried to write (never finished
| it). Basic was too slow for those critical parts, so I called
| out to the routine, but did most of the code in Basic.
|
| I remember been utterly wowed that Linux came with a free
| compiler - I could only dream of having software like that
| back then.
| dhosek wrote:
| When OS/2 bundled a C/C++ compiler _and_ a visual interface
| builder, I was sure there had to be a catch.
| krallja wrote:
| At least the 6502 has a fairly easy to remember ISA!
| alfiedotwtf wrote:
| Holy shit thanks for the nostalgia blast... I totally forgot
| about MS-DOS debug.exe!
| Linda703 wrote:
___________________________________________________________________
(page generated 2022-07-25 23:00 UTC)