https://github.com/akkartik/mu/blob/main/baremetal/101screen.subx
 1 # Primitives for screen control.
 2 
 3 pixel:  # screen: (addr screen), x: int, y: int, color: int
 4     # . prologue
 5     55/push-ebp
 6     89/<- %ebp 4/r32/esp
 7     # . save registers
 8     50/push-eax
 9     51/push-ecx
10     # ecx = screen
11     8b/-> *(ebp+8) 1/r32/ecx
12     81 7/subop/compare %ecx 0/imm32
13     {
14       75/jump-if-!= break/disp8
15       # bounds checks
16       8b/-> *(ebp+0xc) 0/r32/eax
17       3d/compare-eax-and 0/imm32
18       7c/jump-if-< $pixel:end/disp8
19       3d/compare-eax-and 0x400/imm32/1024
20       7d/jump-if->= $pixel:end/disp8
21       8b/-> *(ebp+0x10) 0/r32/eax
22       3d/compare-eax-and 0/imm32
23       7c/jump-if-< $pixel:end/disp8
24       3d/compare-eax-and 0x300/imm32/768
25       7d/jump-if->= $pixel:end/disp8
26       # eax = y*1024 + x
27       8b/-> *(ebp+0x10) 0/r32/eax
28       c1/shift 4/subop/left %eax 0xa/imm8
29       03/add-> *(ebp+0xc) 0/r32/eax
30       # eax += location of frame buffer
31       03/add-> *0x7f28 0/r32/eax
32       # *eax = color
33       8b/-> *(ebp+0x14) 1/r32/ecx
34       88/byte<- *eax 1/r32/CL
35       # return
36       eb $pixel:end/disp8
37     }
38     # TODO: fake screen
39 $pixel:end:
40     # . restore registers
41     59/pop-to-ecx
42     58/pop-to-eax
43     # . epilogue
44     89/<- %esp 5/r32/ebp
45     5d/pop-to-ebp
46     c3/return