aboutsummaryrefslogtreecommitdiffhomepage
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/gen-svg.sh4
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/index.md335
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/label-jl.drawio127
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/label-jl.svg3
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/label-lj.drawio104
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/label-lj.svg3
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/x86-add.pngbin0 -> 162819 bytes
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.pngbin0 -> 76903 bytes
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.pngbin0 -> 41713 bytes
-rw-r--r--content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.pngbin0 -> 35025 bytes
10 files changed, 576 insertions, 0 deletions
diff --git a/content/2024-12-20-xpost-juicebox-asm/gen-svg.sh b/content/2024-12-20-xpost-juicebox-asm/gen-svg.sh
new file mode 100644
index 0000000..a2db521
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/gen-svg.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+drawio -x -f svg -t --svg-theme dark -o label-lj.svg label-lj.drawio
+drawio -x -f svg -t --svg-theme dark -o label-jl.svg label-jl.drawio
diff --git a/content/2024-12-20-xpost-juicebox-asm/index.md b/content/2024-12-20-xpost-juicebox-asm/index.md
new file mode 100644
index 0000000..d8796bd
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/index.md
@@ -0,0 +1,335 @@
++++
+title = "xpost: x64 jit assembler (juicebox-asm)"
+
+[taxonomies]
+tags = ["x86", "rust", "linux"]
++++
+
+This is a cross post to a repository implementing an `x64` _jit assembler_,
+which I used to study the x86 instruction encoding and how to write such a tool
+in rust. The code is available on github [>> juicebox-asm <<][jb].
+
+The _assembler_ only implements a small set of the x86 instruction set, but
+enough to create some interesting examples. Additionally, the repository
+provides a simple _runtime_ based on [mmap(2)][mmap] (only on linux), which is
+used to execute the dynamically assembled code and provided examples.
+
+## Assembler
+The _assembler_ implements all the supported instructions and provides a similar
+interface as when writing assembly code by hand.
+
+```rust
+let mut asm = Asm::new();
+asm.xor(rax, rax);
+asm.add(rax, rdi);
+asm.add(rax, Mem64::indirect_base_index(rdi, rsi));
+asm.ret();
+
+asm.disasm();
+// Outputs:
+// 00000000 4831C0 xor rax,rax
+// 00000003 4801F8 add rax,rdi
+// 00000006 48030437 add rax,[rdi+rsi]
+// 00000006 C3 ret
+```
+
+An interesting design-choice is given by the implementation of the assembler API
+for the various instructions. Since x86 is a _CISC_ instruction set, it allows
+same the mnemonic to be used with different types and permutations of
+operands. This can be seen in the code listing above where the _add_ instruction
+is used with both `register-register` and `register-memory` operands. It becomes
+even clearer when looking into the instruction reference manual, in the example
+of the _add_ instruction.
+
+<img src="x86-add.png">
+
+> Table taken from [Intel® 64 and IA-32 Architectures Software Developer’s
+> Manual - Volume 2 Instruction Set Reference][intel-im].
+
+Since rust does not have function overloading
+<sup id="sup-1-src"><a href="#sup-1-dst">1</a></sup>
+as in cpp, one does need to define functions with different function names to
+implement the _add_ instruction for different combinations of operands.
+```rust
+// Pseudo code.
+fn add_r64_r64(Reg64, Reg64)
+fn add_r64_m64(Reg64, Mem64)
+// ..
+```
+
+However, in this experiment, I did not go with that approach. Instead I used a
+different solution and defined generic traits for the various instructions which
+have different operand combinations. The _Add_ trait below gives an example of
+that.
+
+```rust
+pub trait Add<T, U> {
+ fn add(&mut self, op1: T, op2: U);
+}
+```
+
+This in turn allows to implement the traits for all the different combinations
+of operands that should be supported by each instruction. It gives fine control
+of what to support and provides an ergonomic API as seen in the first example
+code listing.
+
+```rust
+impl Add<Reg64, Reg64> for Asm {
+ fn add(&mut self, op1: Reg64, op2: Reg64) {
+ self.encode_rr(&[0x01], op1, op2);
+ }
+}
+
+impl Add<Reg64, Mem64> for Asm {
+ fn add(&mut self, op1: Reg64, op2: Mem64) {
+ self.encode_rm(0x03, op1, op2);
+ }
+}
+```
+
+All instructions currently implemented with their variations can be found in the
+documentation of the [Asm][jb-asm] _assembler_.
+
+## Runtime
+With the help of the provided runtime, code assembled with the _assembler_ can
+be put into executable memory and turned into a function pointer, allowing to
+call into the generated code.
+
+```rust
+extern "C" fn add(a: u32, b: u32) -> u32 {
+ a + b
+}
+
+fn main() {
+ // SystemV abi:
+ // rdi -> first argument
+ // rsi -> second argument
+ // rax -> return value
+
+ let mut asm = Asm::new();
+ asm.mov(rsi, Imm64::from(42));
+ asm.mov(rax, Imm64::from(add as usize));
+ asm.call(rax);
+ asm.ret();
+
+ let mut rt = Runtime::new();
+ let add42 = unsafe { rt.add_code::<extern "C" fn(u32) -> u32>(asm.into_code()) };
+
+ let res = add42(5);
+ assert_eq!(res, 47);
+}
+```
+> This example must be run on a system with the [SystemV][sysv] ABI.
+
+## Label
+A label is used to associate a location in the generated code with a symbolic
+name (the label), which can then be used as branch target for control-flow
+instructions as for example `jz`, `jnz` and so on.
+
+The act of associating a label with a location is called _binding_. Each label
+can only be bound **once**, else the branch target would become _ambiguous_.
+
+Binding and jumping to a label can come in two orders.
+1. A label is first bound and then jumped to (backwards-reference).
+1. A label is first jumped to and then bound (forwards-reference).
+
+In the following both cases will be discussed in a bit more detail, which
+hopefully helps when browsing the implementation. One thing to keep in mind,
+since the generated code must be relocatable, all jump instructions will be
+encoded relative to the current program counter (pc).
+
+The first case where the label is first bound and later used, is somewhat more
+natural to think about, as first defining then using something is pretty
+clear. The code listing below shows an example of a loop with a back-reference
+summing up all integer between 0 and 42.
+
+```rust,linenos
+let mut asm = Asm::new();
+let mut lp = Label::new();
+
+asm.mov(eax, Imm32::from(0)); // int ret = 0;
+asm.mov(ecx, Imm32::from(42)); // int n = 42;
+
+asm.bind(&mut lp); // lp:
+asm.add(eax, ecx); // ret += n;
+asm.dec(ecx); // --n;
+asm.test(ecx, ecx); // if (n != 0)
+asm.jnz(&mut lp); // goto lp
+
+asm.ret();
+```
+
+From the point of view of the code buffer this looks as follows. When the label
+is bound (line 7), the current offset into the code buffer is recorded as the
+labels _location_. Then when emitting the jump instruction (line 11) later, this
+location is used with the current code buffers offset to compute the
+_displacement_ (disp32) forming the relative jump.
+
+<div style="margin:auto; width:85%;">
+<img src="label-lj.svg">
+</div>
+
+The second case where the label is first used and then bound later, is not
+really more complex, but one has to reverse the steps. The code listing below
+gives an example, demonstrating forwards jumps by validating two input
+arguments to be not equal to 0 and returning of one check fails.
+
+```rust,linenos
+let mut asm = Asm::new();
+let mut ret = Label::new();
+
+// Validate inputs (sysv abi).
+asm.test(rdi, rdi); // if (rdi == 0)
+asm.jz(&mut ret); // return;
+asm.test(rsi, rsi); // if (rsi == 0)
+asm.jz(&mut ret); // return;
+
+// Here, rdi != 0 && rsi != 0.
+// nop as placeholder for some real work.
+asm.nop();
+
+asm.bind(&mut ret);
+asm.ret();
+```
+
+Again from the point of view of the code buffer this looks as follows. When the
+jump instructions are emitted (line 6, 8), the _displacement_ can not be
+computed, as the label has no defined location yet. A placeholder displacement
+of value 0 is emitted into the code buffer and the offset to the displacement
+value is recorded by the label as pending _relocation_. Once the label is bound
+to a location, all pending relocations are resolved by consuming the recorded
+offsets, computing the corresponding displacements and patching the values in
+the code buffer.
+
+<div style="margin:auto; width:85%;">
+<img src="label-jl.svg">
+</div>
+
+## Example: bf
+
+The [bf.rs][jb-bf] example implements a _jit compiler_ for the [brainfuck][bf]
+language. In this example the _bf program_ is jit compiled to one code blob as a
+whole and evaluated then after. The example only returns from the jit code if
+the bf program terminates or a runtime error is detected. For reference an
+_interpreter_ is also provided.
+
+## Example: tiny-vm
+
+The [tiny_vm.rs][jb-tiny] example defines a _tiny virtual machine (TinyVm)_ with
+a set of _registers_ and custom _instructions_. It then goes on and implements a
+_jit compiler_ for the TinyVm. In comparison to the jit compiler in the previous
+bf example, the TinyVm compiler jit compiles the program per basic-block (bb),
+each time a new bb is encountered. \
+After executing a jit compiled basic block, the code returns into the
+TinyVm. The vm then checks if the branch target has an entry in the _jit cache_,
+which maps guest addresses to compiled basic-blocks. If the cache returns a hit
+the TinyVm jumps to the generated code, if the cache returns a miss the new bb is
+compiled and inserted into the jit cache.
+
+Similar to the bf example, this example also provides an _interpreter_ as
+reference.
+
+## Appendix: x86 instruction encoding
+x86 instructions are encoded with _variable length_ and follow the format below.
+A single instruction can be as small as 1 byte up to a double-digit number of
+bytes.
+
+<img src="x86-insn-fmt.png">
+
+> Figure taken from [Intel® 64 and IA-32 Architectures Software Developer’s
+> Manual - Volume 2 Instruction Set Reference][intel-im].
+
+_Prefixes_ are typically modifiers for the instruction, where some examples are
+`LOCK` for bus locking, `REP` for instruction repetition and `REX` for
+specifying extended operand sizes and to access extended registers (like
+r8-r15).
+
+The `ModR/M` and `SIB` bytes are used to encode the register and memory operands
+of the instruction in the general case. Whether the `SIB` byte is used depends
+on the _addressing mode_.
+
+In case the instruction also requires an _address displacement_ or an _immediate
+value_, the bytes of the value directly follow the instruction bytes.
+
+Historically, the x86 ISA only had 8 general-purpose registers (ax, cx, dx, bx,
+sp, bp, si, di). This is still visible today in various fields which encode
+register operands, where one such example is the **ModRM.Reg** field. Later
+on, 8 additional general-purpose registers (r8-r15) were added and one
+additional bit was needed to encode all 16 registers, while keeping backwards
+compatibility. \
+As mentioned above, the **REX** prefix is used to access the _extended_
+registers. This prefix contains the **R, X, B** bits, which are combined with
+the various register operand fields, as shown by the figures below for the case
+of the ModRM byte and the ModRM + SIB bytes.
+
+<div style="margin:auto; width:85%;">
+<img src="x86-insn-modrm.png">
+<img src="x86-insn-modrm-sib.png">
+</div>
+
+> Figures taken from [Intel® 64 and IA-32 Architectures Software Developer’s
+> Manual - Volume 2 Instruction Set Reference][intel-im].
+
+The following code listing provides an example for two load instructions with
+different _addressing modes_ and gives a detailed breakdown of the instruction
+bytes for each instruction.
+
+```rust
+let mut asm = Asm::new();
+asm.mov(r8, Mem64::indirect_disp(r9, 0xaabb));
+asm.mov(r8, Mem64::indirect_base_index(r9, r10));
+
+asm.disasm();
+// Outputs:
+// 4D8B81BBAA0000 mov r8,[r9+0xaabb]
+// 4F8B0411 mov r8,[r9+r10]
+
+
+// Breakdown of the indirect + displacement load.
+//
+// 4D 8B 81 BBAA0000 mov r8,[r9+0xaabb]
+// ^ ^ ^ `Imm32
+// | | `ModRM: mod=10,reg=000,rm=001
+// | `Opc: mov
+// `REX: W=1,R=1,X=0,B=1
+//
+// REX.R + ModRM.reg = 1000 (r8) - dest reg
+// REX.B + ModRm.rm = 1001 (r9) - base reg
+
+
+// Breakdown of the base + index load.
+//
+// 4F 8B 04 11 mov r8,[r9+r10]
+// ^ ^ ^ `SIB: scale=00,index=010,base=001
+// | | `ModRM: mod=00,reg=000,rm=100
+// | `Opc: mov
+// `REX: W=1,R=1,X=1,B=1
+//
+// ModRM.rm = 100 -> use SIB byte
+//
+// REX.R + ModRM.reg = 1000 ( r8) - dest reg
+// REX.X + SIB.index = 1010 (r10) - index reg
+// REX.B + SIB.base = 1001 ( r9) - base reg
+```
+
+## References
+- [juicebox-asm][jb]
+- [osdev: x86 instruction encoding](https://wiki.osdev.org/X86-64_Instruction_Encoding)
+- [intel instruction set reference][intel-im]
+
+## Footnotes
+<span id="sup-1-dst">**1)**</span>
+In cpp functions with the _same_ name but _different_ arguments can be
+defined. During compilation [overload resolution][cpp-or] takes place and picks
+the "right" function to call on each call site.
+<a href="#sup-1-src">&#x21A9;</a>
+
+[jb]: https://github.com/johannst/juicebox-asm
+[jb-asm]: https://johannst.github.io/juicebox-asm/juicebox_asm/struct.Asm.html
+[jb-bf]: https://github.com/johannst/juicebox-asm/blob/main/examples/bf.rs
+[jb-tiny]: https://github.com/johannst/juicebox-asm/blob/main/examples/tiny_vm.rs
+[mmap]: https://www.man7.org/linux/man-pages/man2/mmap.2.html
+[intel-im]: https://cdrdv2.intel.com/v1/dl/getContent/671110
+[cpp-or]: https://en.cppreference.com/w/cpp/language/overload_resolution
+[sysv]: https://gitlab.com/x86-psABIs/x86-64-ABI/-/jobs/artifacts/master/raw/x86-64-ABI/abi.pdf?job=build
+[bf]: https://brainfuck.org/brainfuck.html
diff --git a/content/2024-12-20-xpost-juicebox-asm/label-jl.drawio b/content/2024-12-20-xpost-juicebox-asm/label-jl.drawio
new file mode 100644
index 0000000..09d6ce2
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/label-jl.drawio
@@ -0,0 +1,127 @@
+<mxfile host="Electron" modified="2024-12-20T16:42:04.083Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="sjgpGt26_ImvABGtZcLg" version="23.1.5" type="device">
+ <diagram name="Page-1" id="KLjrVqkgREDBOZ2QzdGu">
+ <mxGraphModel dx="264" dy="407" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="8EIy2prQJLYqqSm8kePU-1" value="" style="endArrow=none;html=1;rounded=0;exitX=0.002;exitY=0.572;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;strokeColor=#66FF66;exitPerimeter=0;sourcePerimeterSpacing=0;" parent="1" source="acs_kaRojZHrSoLgu5-l-7" target="acs_kaRojZHrSoLgu5-l-35" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="560.0400000000001" y="560.08" as="sourcePoint" />
+ <mxPoint x="579.96" y="560" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-1" value="&lt;font style=&quot;font-size: 10px;&quot; face=&quot;monospace&quot;&gt;code buffer&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=10;" parent="1" vertex="1">
+ <mxGeometry x="280" y="450" width="80" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-2" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="480" width="80" height="140" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-3" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="480" width="80" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-5" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="520" width="20" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-6" value="&lt;font style=&quot;font-size: 10px;&quot; face=&quot;monospace&quot;&gt;code buffer&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=10;" parent="1" vertex="1">
+ <mxGeometry x="560" y="450" width="80" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-8" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="480" width="80" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-9" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="520" width="20" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-15" value="&lt;font style=&quot;&quot; face=&quot;monospace&quot;&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&amp;nbsp;Label:&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=default;dashed=1;dashPattern=1 2;" parent="1" vertex="1">
+ <mxGeometry x="420" y="500" width="80" height="50" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-17" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=default;" parent="1" vertex="1">
+ <mxGeometry x="280" y="630" width="30" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-18" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#66FF66;fillColor=#66FF66;fillStyle=hatch;" parent="1" vertex="1">
+ <mxGeometry x="560" y="630" width="30" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-19" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;existing code&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;" parent="1" vertex="1">
+ <mxGeometry x="320" y="630" width="80" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-20" value="&lt;font style=&quot;font-size: 9px;&quot; face=&quot;monospace&quot;&gt;fn body&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=9;" parent="1" vertex="1">
+ <mxGeometry x="600" y="630" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-21" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&amp;nbsp;location&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;align=left;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="440" y="520" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-22" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&lt;font color=&quot;#ff55ff&quot; style=&quot;font-size: 8px;&quot;&gt;asm.jz()&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=none;dashed=1;" parent="1" vertex="1">
+ <mxGeometry x="375" y="540" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;dashed=1;strokeColor=#55FFFF;exitX=1;exitY=0.5;exitDx=0;exitDy=0;startArrow=blockThin;startFill=1;" parent="1" source="acs_kaRojZHrSoLgu5-l-21" target="acs_kaRojZHrSoLgu5-l-36" edge="1">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="380" y="569.77" as="sourcePoint" />
+ <mxPoint x="560" y="570" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="510" y="530" />
+ <mxPoint x="510" y="590" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-24" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;jz | 0x0&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="300" y="520" width="60" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-25" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="280" y="560" as="sourcePoint" />
+ <mxPoint x="300" y="560" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-27" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;jz | 0x0&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="300" y="540" width="60" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-29" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&amp;nbsp;offsets&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;align=left;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="440" y="530" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;dashed=1;strokeColor=#FF55FF;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" target="acs_kaRojZHrSoLgu5-l-29" edge="1">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="360" y="529.99" as="sourcePoint" />
+ <mxPoint x="430" y="569.99" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="370" y="530" />
+ <mxPoint x="370" y="540" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;dashed=1;strokeColor=#FF55FF;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" target="acs_kaRojZHrSoLgu5-l-29" edge="1">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="360" y="549.98" as="sourcePoint" />
+ <mxPoint x="440" y="559.99" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="370" y="550" />
+ <mxPoint x="370" y="540" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-37" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&lt;font color=&quot;#55ffff&quot; style=&quot;font-size: 8px;&quot;&gt;bind()&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=none;dashed=1;" parent="1" vertex="1">
+ <mxGeometry x="510" y="590" width="35" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-38" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#66FF66;fillStyle=hatch;" parent="1" vertex="1">
+ <mxGeometry x="560" y="560" width="80" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-39" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=1.002;entryY=0.715;entryDx=0;entryDy=0;entryPerimeter=0;strokeColor=#66FF66;" parent="1" source="acs_kaRojZHrSoLgu5-l-36" target="acs_kaRojZHrSoLgu5-l-7" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="600.0000000000001" y="590.26" as="sourcePoint" />
+ <mxPoint x="630.45" y="590" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-36" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;ret&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="560" y="580" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-7" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="480" width="80" height="140" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-33" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;jz |&amp;nbsp;&lt;font color=&quot;#ff55ff&quot;&gt;disp32&lt;/font&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="580" y="520" width="60" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="acs_kaRojZHrSoLgu5-l-35" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;jz |&amp;nbsp;&lt;font color=&quot;#ff55ff&quot;&gt;disp32&lt;/font&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="580" y="540" width="60" height="20" as="geometry" />
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/content/2024-12-20-xpost-juicebox-asm/label-jl.svg b/content/2024-12-20-xpost-juicebox-asm/label-jl.svg
new file mode 100644
index 0000000..dff0af0
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/label-jl.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="381px" height="191px" viewBox="-0.5 -0.5 381 191"><defs><pattern patternUnits="userSpaceOnUse" width="11.5" height="11.5" x="0" y="0" patternTransform="rotate(45)" id="mx-pattern-hatch-1-f0f0f0-0"><line x1="0" y1="0" x2="0" y2="11.5" stroke="#f0f0f0" stroke-width="1.5"/></pattern><pattern patternUnits="userSpaceOnUse" width="11.5" height="11.5" x="0" y="0" patternTransform="rotate(45)" id="mx-pattern-hatch-1-66ff66-0"><line x1="0" y1="0" x2="0" y2="11.5" stroke="#66ff66" stroke-width="1.5"/></pattern></defs><g><path d="M 280.16 110.08 L 300 110" fill="none" stroke="#66ff66" stroke-miterlimit="10" pointer-events="stroke"/><rect x="0" y="0" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 10px;">code buffer</font></div></div></div></foreignObject><text x="40" y="18" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="10px" text-anchor="middle">code buffer</text></switch></g><rect x="0" y="30" width="80" height="140" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="0" y="30" width="80" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="0" y="70" width="20" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="280" y="0" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 281px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 10px;">code buffer</font></div></div></div></foreignObject><text x="320" y="18" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="10px" text-anchor="middle">code buffer</text></switch></g><rect x="280" y="30" width="80" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="280" y="70" width="20" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="140" y="50" width="80" height="50" fill="none" stroke="rgb(240, 240, 240)" stroke-dasharray="1 2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 57px; margin-left: 142px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style=""><font style="font-size: 10px;"> Label:</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="142" y="65" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px"> Label:&#xa;</text></switch></g><rect x="0" y="180" width="30" height="10" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="280" y="180" width="30" height="10" fill="url(#mx-pattern-hatch-1-66ff66-0)" stroke="#66ff66" pointer-events="all"/><rect x="40" y="180" width="80" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 185px; margin-left: 42px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;">existing code</font></div></div></div></foreignObject><text x="42" y="187" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">existing code</text></switch></g><rect x="320" y="180" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 185px; margin-left: 322px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 9px;">fn body</font></div></div></div></foreignObject><text x="322" y="188" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="9px">fn body</text></switch></g><rect x="160" y="70" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 80px; margin-left: 162px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"> location</font></div></div></div></foreignObject><text x="162" y="84" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px"> location</text></switch></g><rect x="95" y="90" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 100px; margin-left: 97px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"><font style="font-size: 8px;" color="#ff55ff">asm.jz()</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="97" y="102" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">asm.jz()&#xa;</text></switch></g><path d="M 218.12 80 L 230 80 L 230 140 L 280 140" fill="none" stroke="#55ffff" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 211.12 80 L 218.12 77.67 L 218.12 82.33 Z" fill="#55ffff" stroke="#55ffff" stroke-miterlimit="10" pointer-events="all"/><rect x="20" y="70" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 80px; margin-left: 21px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">jz | 0x0</font></div></div></div></foreignObject><text x="50" y="84" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">jz | 0x0</text></switch></g><path d="M 0 110 L 20 110" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="20" y="90" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 100px; margin-left: 21px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">jz | 0x0</font></div></div></div></foreignObject><text x="50" y="104" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">jz | 0x0</text></switch></g><rect x="160" y="80" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 90px; margin-left: 162px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"> offsets</font></div></div></div></foreignObject><text x="162" y="94" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px"> offsets</text></switch></g><path d="M 80 79.99 L 90 80 L 90 90 L 151.88 90" fill="none" stroke="#ff55ff" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 158.88 90 L 151.88 92.33 L 151.88 87.67 Z" fill="#ff55ff" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="all"/><path d="M 80 99.98 L 90 100 L 90 90 L 151.88 90" fill="none" stroke="#ff55ff" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 158.88 90 L 151.88 92.33 L 151.88 87.67 Z" fill="#ff55ff" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="all"/><rect x="230" y="140" width="35" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 33px; height: 1px; padding-top: 150px; margin-left: 232px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"><font style="font-size: 8px;" color="#55ffff">bind()</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="232" y="152" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">bind()&#xa;</text></switch></g><rect x="280" y="110" width="80" height="20" fill="url(#mx-pattern-hatch-1-66ff66-0)" stroke="none" pointer-events="all"/><path d="M 310 130 L 360.16 130.1" fill="none" stroke="#66ff66" stroke-miterlimit="10" pointer-events="stroke"/><rect x="280" y="130" width="30" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 140px; margin-left: 281px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">ret</font></div></div></div></foreignObject><text x="295" y="144" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">ret</text></switch></g><rect x="280" y="30" width="80" height="140" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="300" y="70" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 80px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">jz | <font color="#ff55ff">disp32</font></font></div></div></div></foreignObject><text x="330" y="84" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">jz | disp32</text></switch></g><rect x="300" y="90" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 100px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">jz | <font color="#ff55ff">disp32</font></font></div></div></div></foreignObject><text x="330" y="104" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">jz | disp32</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2024-12-20-xpost-juicebox-asm/label-lj.drawio b/content/2024-12-20-xpost-juicebox-asm/label-lj.drawio
new file mode 100644
index 0000000..5928f56
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/label-lj.drawio
@@ -0,0 +1,104 @@
+<mxfile host="Electron" modified="2024-12-20T16:26:16.734Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="sKYAfE5xwByF-IYDa1Y9" version="23.1.5" type="device">
+ <diagram name="Page-1" id="KLjrVqkgREDBOZ2QzdGu">
+ <mxGraphModel dx="264" dy="407" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="olCq6-2ex2JMhws7SrDa-2" value="&lt;font style=&quot;font-size: 10px;&quot; face=&quot;monospace&quot;&gt;code buffer&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=10;" parent="1" vertex="1">
+ <mxGeometry x="280" y="370" width="80" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-3" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="400" width="80" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="400" width="80" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;dashed=1;strokeColor=#55FFFF;" parent="1" source="olCq6-2ex2JMhws7SrDa-5" target="Q1adNH_ehwvyFVxglBn1-21" edge="1">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="420" y="450" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-5" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="280" y="440" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-7" value="&lt;font style=&quot;font-size: 10px;&quot; face=&quot;monospace&quot;&gt;code buffer&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=10;" parent="1" vertex="1">
+ <mxGeometry x="560" y="370" width="80" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-8" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="400" width="80" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-9" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="400" width="80" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-10" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="440" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-11" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#66FF66;fillStyle=hatch;" parent="1" vertex="1">
+ <mxGeometry x="590" y="440" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-14" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="olCq6-2ex2JMhws7SrDa-5" target="olCq6-2ex2JMhws7SrDa-4" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="380" y="520" as="sourcePoint" />
+ <mxPoint x="430" y="470" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="310" y="460" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-1" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#66FF66;fillStyle=hatch;" parent="1" vertex="1">
+ <mxGeometry x="560" y="460" width="80" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="olCq6-2ex2JMhws7SrDa-12" value="&lt;font face=&quot;monospace&quot; style=&quot;font-size: 8px;&quot;&gt;jnz | &lt;font color=&quot;#ff55ff&quot;&gt;disp32&lt;/font&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;" parent="1" vertex="1">
+ <mxGeometry x="560" y="480" width="70" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-2" value="" style="endArrow=none;html=1;rounded=0;edgeStyle=orthogonalEdgeStyle;entryX=1;entryY=0;entryDx=0;entryDy=0;strokeColor=#66FF66;" parent="1" target="olCq6-2ex2JMhws7SrDa-12" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="560" y="480" as="sourcePoint" />
+ <mxPoint x="530" y="440" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="560" y="460" />
+ <mxPoint x="590" y="460" />
+ <mxPoint x="590" y="440" />
+ <mxPoint x="640" y="440" />
+ <mxPoint x="640" y="480" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-4" value="&lt;font style=&quot;&quot; face=&quot;monospace&quot;&gt;&lt;font style=&quot;font-size: 10px;&quot;&gt;&amp;nbsp;Label:&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=top;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=default;dashed=1;dashPattern=1 2;" parent="1" vertex="1">
+ <mxGeometry x="420" y="420" width="80" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-15" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&lt;font color=&quot;#55ffff&quot; style=&quot;font-size: 8px;&quot;&gt;bind()&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=none;dashed=1;" parent="1" vertex="1">
+ <mxGeometry x="325" y="450" width="35" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-16" value="" style="rounded=0;whiteSpace=wrap;html=1;fillStyle=hatch;fillColor=#F0F0F0;strokeColor=default;" parent="1" vertex="1">
+ <mxGeometry x="280" y="530" width="30" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-17" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#66FF66;fillColor=#66FF66;fillStyle=hatch;" parent="1" vertex="1">
+ <mxGeometry x="560" y="530" width="30" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-19" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;existing code&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;" parent="1" vertex="1">
+ <mxGeometry x="320" y="530" width="80" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-20" value="&lt;font style=&quot;font-size: 9px;&quot; face=&quot;monospace&quot;&gt;loop body&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=9;" parent="1" vertex="1">
+ <mxGeometry x="600" y="530" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-21" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&amp;nbsp;location&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;fontColor=default;align=left;strokeColor=none;" parent="1" vertex="1">
+ <mxGeometry x="440" y="440" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-23" value="&lt;font style=&quot;font-size: 8px;&quot; face=&quot;monospace&quot;&gt;&lt;font color=&quot;#ff55ff&quot; style=&quot;font-size: 8px;&quot;&gt;asm.jnz()&lt;/font&gt;&lt;br style=&quot;font-size: 8px;&quot;&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=default;fontSize=8;strokeColor=none;dashed=1;" parent="1" vertex="1">
+ <mxGeometry x="510" y="490" width="50" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="Q1adNH_ehwvyFVxglBn1-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=blockThin;endFill=1;dashed=1;strokeColor=#FF55FF;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="Q1adNH_ehwvyFVxglBn1-21" target="olCq6-2ex2JMhws7SrDa-12" edge="1">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="380" y="489.77" as="sourcePoint" />
+ <mxPoint x="510" y="489.77" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="510" y="450" />
+ <mxPoint x="510" y="490" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/content/2024-12-20-xpost-juicebox-asm/label-lj.svg b/content/2024-12-20-xpost-juicebox-asm/label-lj.svg
new file mode 100644
index 0000000..85dafb0
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/label-lj.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="381px" height="171px" viewBox="-0.5 -0.5 381 171"><defs><pattern patternUnits="userSpaceOnUse" width="11.5" height="11.5" x="0" y="0" patternTransform="rotate(45)" id="mx-pattern-hatch-1-f0f0f0-0"><line x1="0" y1="0" x2="0" y2="11.5" stroke="#f0f0f0" stroke-width="1.5"/></pattern><pattern patternUnits="userSpaceOnUse" width="11.5" height="11.5" x="0" y="0" patternTransform="rotate(45)" id="mx-pattern-hatch-1-66ff66-0"><line x1="0" y1="0" x2="0" y2="11.5" stroke="#66ff66" stroke-width="1.5"/></pattern></defs><g><rect x="0" y="0" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 10px;">code buffer</font></div></div></div></foreignObject><text x="40" y="18" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="10px" text-anchor="middle">code buffer</text></switch></g><rect x="0" y="30" width="80" height="120" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="0" y="30" width="80" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><path d="M 30 80 L 151.88 80" fill="none" stroke="#55ffff" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 158.88 80 L 151.88 82.33 L 151.88 77.67 Z" fill="#55ffff" stroke="#55ffff" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="70" width="30" height="20" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="280" y="0" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 281px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 10px;">code buffer</font></div></div></div></foreignObject><text x="320" y="18" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="10px" text-anchor="middle">code buffer</text></switch></g><rect x="280" y="30" width="80" height="120" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="280" y="30" width="80" height="40" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="280" y="70" width="30" height="20" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="none" pointer-events="all"/><rect x="310" y="70" width="50" height="20" fill="url(#mx-pattern-hatch-1-66ff66-0)" stroke="none" pointer-events="all"/><path d="M 0 90 L 30 90 L 30 70 L 80 70" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="280" y="90" width="80" height="20" fill="url(#mx-pattern-hatch-1-66ff66-0)" stroke="none" pointer-events="all"/><rect x="280" y="110" width="70" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 120px; margin-left: 281px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 8px;" face="monospace">jnz | <font color="#ff55ff">disp32</font></font></div></div></div></foreignObject><text x="315" y="124" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px" text-anchor="middle">jnz | disp32</text></switch></g><path d="M 280 110 L 280 90 L 310 90 L 310 70 L 360 70 L 360 110 L 350 110" fill="none" stroke="#66ff66" stroke-miterlimit="10" pointer-events="stroke"/><rect x="140" y="50" width="80" height="40" fill="none" stroke="rgb(240, 240, 240)" stroke-dasharray="1 2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 57px; margin-left: 142px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style=""><font style="font-size: 10px;"> Label:</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="142" y="65" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px"> Label:&#xa;</text></switch></g><rect x="45" y="80" width="35" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 33px; height: 1px; padding-top: 90px; margin-left: 47px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"><font style="font-size: 8px;" color="#55ffff">bind()</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="47" y="92" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">bind()&#xa;</text></switch></g><rect x="0" y="160" width="30" height="10" fill="url(#mx-pattern-hatch-1-f0f0f0-0)" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="280" y="160" width="30" height="10" fill="url(#mx-pattern-hatch-1-66ff66-0)" stroke="#66ff66" pointer-events="all"/><rect x="40" y="160" width="80" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 165px; margin-left: 42px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;">existing code</font></div></div></div></foreignObject><text x="42" y="167" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">existing code</text></switch></g><rect x="320" y="160" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 165px; margin-left: 322px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 9px;">loop body</font></div></div></div></foreignObject><text x="322" y="168" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="9px">loop body</text></switch></g><rect x="160" y="70" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 80px; margin-left: 162px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"> location</font></div></div></div></foreignObject><text x="162" y="84" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px"> location</text></switch></g><rect x="230" y="120" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 130px; margin-left: 232px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="monospace" style="font-size: 8px;"><font style="font-size: 8px;" color="#ff55ff">asm.jnz()</font><br style="font-size: 8px;" /></font></div></div></div></foreignObject><text x="232" y="132" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="8px">asm.jnz()&#xa;</text></switch></g><path d="M 210 80 L 230 80 L 230 120 L 271.88 120" fill="none" stroke="#ff55ff" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 278.88 120 L 271.88 122.33 L 271.88 117.67 Z" fill="#ff55ff" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2024-12-20-xpost-juicebox-asm/x86-add.png b/content/2024-12-20-xpost-juicebox-asm/x86-add.png
new file mode 100644
index 0000000..dd8fef7
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/x86-add.png
Binary files differ
diff --git a/content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.png b/content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.png
new file mode 100644
index 0000000..b05beed
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.png
Binary files differ
diff --git a/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.png b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.png
new file mode 100644
index 0000000..e24e6cd
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.png
Binary files differ
diff --git a/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.png b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.png
new file mode 100644
index 0000000..3a02a3c
--- /dev/null
+++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.png
Binary files differ