https://github.com/akkartik/mu/blob/main/linux/114error.subx
 1 # Print an error message and exit.
 2 
 3 == code
 4 #   instruction                     effective address                                                   register    displacement    immediate
 5 # . op          subop               mod             rm32          base        index         scale       r32
 6 # . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes
 7 
 8 # write(out, "Error: "+msg+"\n") then stop(ed, 1)
 9 error:  # ed: (addr exit-descriptor), out: fd or (addr stream byte), msg: (addr array byte)
10     # . prologue
11     55/push-ebp
12     89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
13     # write(out, "Error: ")
14     # . . push args
15     68/push  "Error: "/imm32
16     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
17     # . . call
18     e8/call  write/disp32
19     # . . discard args
20     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
21     # write(out, msg)
22     # . . push args
23     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0x10/disp8      .                 # push *(ebp+16)
24     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
25     # . . call
26     e8/call  write/disp32
27     # . . discard args
28     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
29     # write(out, "\n")
30     # . . push args
31     68/push  Newline/imm32
32     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
33     # . . call
34     e8/call  write/disp32
35     # . . discard args
36     81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
37     # stop(ed, 1)
38     # . . push args
39     68/push  1/imm32
40     ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
41     # . . call
42     e8/call  stop/disp32
43     # should never get past this point
44 $error:dead-end:
45     # . epilogue
46     89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
47     5d/pop-to-ebp
48     c3/return
49 
50 # . . vim:nowrap:textwidth=0