diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-12-20 23:28:04 +0100 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2024-12-20 23:28:04 +0100 |
commit | cb0562f9fba187a0db111a7f4532706a5140945e (patch) | |
tree | 922512c4ab4fe9450a538e5090db830e410437f1 /content/2024-12-20-xpost-juicebox-asm | |
parent | 9610877ef54536386b6ea7de29270993194161a5 (diff) | |
download | blog-main.tar.gz blog-main.zip |
Diffstat (limited to 'content/2024-12-20-xpost-juicebox-asm')
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/gen-svg.sh | 4 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/index.md | 335 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/label-jl.drawio | 127 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/label-jl.svg | 3 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/label-lj.drawio | 104 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/label-lj.svg | 3 | ||||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/x86-add.png | bin | 0 -> 162819 bytes | |||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.png | bin | 0 -> 76903 bytes | |||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.png | bin | 0 -> 41713 bytes | |||
-rw-r--r-- | content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.png | bin | 0 -> 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">↩</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="<font style="font-size: 10px;" face="monospace">code buffer</font>" 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="<font style="font-size: 10px;" face="monospace">code buffer</font>" 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="<font style="" face="monospace"><font style="font-size: 10px;">&nbsp;Label:</font><br style="font-size: 8px;"></font>" 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="<font style="font-size: 8px;" face="monospace">existing code</font>" 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="<font style="font-size: 9px;" face="monospace">fn body</font>" 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="<font style="font-size: 8px;" face="monospace">&nbsp;location</font>" 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="<font style="font-size: 8px;" face="monospace"><font color="#ff55ff" style="font-size: 8px;">asm.jz()</font><br style="font-size: 8px;"></font>" 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="<font face="monospace" style="font-size: 8px;">jz | 0x0</font>" 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="<font face="monospace" style="font-size: 8px;">jz | 0x0</font>" 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="<font style="font-size: 8px;" face="monospace">&nbsp;offsets</font>" 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="<font style="font-size: 8px;" face="monospace"><font color="#55ffff" style="font-size: 8px;">bind()</font><br style="font-size: 8px;"></font>" 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="<font face="monospace" style="font-size: 8px;">ret</font>" 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="<font face="monospace" style="font-size: 8px;">jz |&nbsp;<font color="#ff55ff">disp32</font></font>" 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="<font face="monospace" style="font-size: 8px;">jz |&nbsp;<font color="#ff55ff">disp32</font></font>" 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:
</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()
</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()
</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="<font style="font-size: 10px;" face="monospace">code buffer</font>" 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="<font style="font-size: 10px;" face="monospace">code buffer</font>" 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="<font face="monospace" style="font-size: 8px;">jnz | <font color="#ff55ff">disp32</font></font>" 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="<font style="" face="monospace"><font style="font-size: 10px;">&nbsp;Label:</font><br style="font-size: 8px;"></font>" 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="<font style="font-size: 8px;" face="monospace"><font color="#55ffff" style="font-size: 8px;">bind()</font><br style="font-size: 8px;"></font>" 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="<font style="font-size: 8px;" face="monospace">existing code</font>" 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="<font style="font-size: 9px;" face="monospace">loop body</font>" 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="<font style="font-size: 8px;" face="monospace">&nbsp;location</font>" 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="<font style="font-size: 8px;" face="monospace"><font color="#ff55ff" style="font-size: 8px;">asm.jnz()</font><br style="font-size: 8px;"></font>" 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:
</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()
</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()
</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 Binary files differnew file mode 100644 index 0000000..dd8fef7 --- /dev/null +++ b/content/2024-12-20-xpost-juicebox-asm/x86-add.png 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 Binary files differnew file mode 100644 index 0000000..b05beed --- /dev/null +++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-fmt.png 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 Binary files differnew file mode 100644 index 0000000..e24e6cd --- /dev/null +++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm-sib.png 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 Binary files differnew file mode 100644 index 0000000..3a02a3c --- /dev/null +++ b/content/2024-12-20-xpost-juicebox-asm/x86-insn-modrm.png |