From c9f995ac683cb5ef3c840420071926909a47e71c Mon Sep 17 00:00:00 2001 From: = Date: Mon, 14 Jul 2025 10:07:34 -0700 Subject: [PATCH 01/87] Created dijkstra.asm and added the section headers for now; will setup appropriate variables in (ro)data ahead of time. --- archive/x/x86-64/dijkstra.asm | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 archive/x/x86-64/dijkstra.asm diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm new file mode 100644 index 000000000..853beb15d --- /dev/null +++ b/archive/x/x86-64/dijkstra.asm @@ -0,0 +1,12 @@ +section .rodata + +section .data + +section .bss + +section .text + +global _start + +_start: + From 067a78b2bffdd4b0496658c8fb97a0dc9529ba98 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 12:04:54 -0700 Subject: [PATCH 02/87] Got a little bit of work done. I am going for an array-style minheap to implement the priority queue, as every data structure is forced to be implemented bare metal, and so an array is a lot nicer to work with and requires less SYS_MMAP. --- archive/x/x86-64/dijkstra.asm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 853beb15d..169efd594 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,7 +1,16 @@ section .rodata -section .data +invalid: + .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' + .len equ $- .msg + +section .data + +minheap: + .ptr dq 0 + .size dd 0 + .max_size dd 0 section .bss section .text From a8d0784e6852ff884c31d65d274f0e9441f542cc Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 14:51:41 -0700 Subject: [PATCH 03/87] Added one function that doesn't have code yet, but does have an explanation. Also added some data up top. --- archive/x/x86-64/dijkstra.asm | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 169efd594..ed280bd7b 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -6,11 +6,15 @@ invalid: section .data + +src_dst: + .src dq 0 + .dst dq 0 minheap: .ptr dq 0 .size dd 0 - .max_size dd 0 + .max_size dd 0 ;SYS_MMAP will be based on this value. section .bss section .text @@ -18,4 +22,26 @@ section .text global _start _start: + + + + +parse_SRC_DST: +; ---------------------------------------------------------------------------- +; Function: parse_SRC_DST +; Description: +; Separated from the vertice parser for organization/readability. +; Takes ptr to stack source and destination arguments, addressed through argv[2] and argv[3] respectively. +; Addressing argv[1] will cause an error. +; Parsed through a finite state machine. +; Parameters: +; RDI - (char*) Pointer to stack location of src/dst. +; RSI - (long*) Pointer to src/dst storage in .data +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - -1 for invalid input. +; --------------------------------------------------------------------------- From d2465e852a86b5da73687f300f5975e4ef68f166 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 15:31:42 -0700 Subject: [PATCH 04/87] Added some definitions, atol (not atoi); I'm still in the initial setup for now. --- archive/x/x86-64/dijkstra.asm | 75 +++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index ed280bd7b..7dc45b439 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,41 @@ +;Constants +%DEFINE EMPTY_INPUT 0 + + +;SYSCALLS +;I/O +%DEFINE SYS_WRITE 1 +%DEFINE STDOUT 1 +;Memory +%DEFINE SYS_MMAP 9 +;PROTS (RDX) +%DEFINE PROT_READ 0x01 +%DEFINE PROT_WRITE 0x02 +;FLAGS (R10) +%DEFINE MAP_SHARED +%DEFINE MAP_ANONYMOUS + +%DEFINE SYS_MUNMAP 11 + +;Stack displacements + +%DEFINE _start.STACK_INIT 32 +%DEFINE _start.argc 8 +%DEFINE _start.argv0 16 +%DEFINE _start.argv1 24 +%DEFINE _start.argv2 32 +%DEFINE _start.argv3 40 +; RBP+ ^ +; RBP- v + + + +%DEFINE parse_SRC_DST.STACK_INIT 0 ;Placeholder + + +%DEFINE atol.STACK_INIT 8 +%DEFINE atol.returnValue 8 + section .rodata invalid: @@ -9,18 +47,41 @@ section .data src_dst: .src dq 0 - .dst dq 0 - + .dst dq 0 minheap: .ptr dq 0 .size dd 0 - .max_size dd 0 ;SYS_MMAP will be based on this value. + .max_size dd 0 ;SYS_MMAP will be based on this value; maximum array size. section .bss section .text global _start +atol: +; ---------------------------------------------------------------------------- +; Function: atol (ascii to long) +; Description: +; Converts ascii string to long value (64 bits). +; Parameters: +; RDI - (char*) Pointer to string to convert to integer. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - long value of string. +; --------------------------------------------------------------------------- + + PUSH RBP + MOV RBP, RSP + SUB RSP, atol.STACK_INIT + + + + + _start: @@ -43,5 +104,11 @@ parse_SRC_DST: ; R9 - () Unused. ; Returns: ; RAX - -1 for invalid input. -; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + + PUSH RBP, + MOV RBP, RSP + SUB RSP, parse_SRC_DST.STACK_INIT + + From c586b1b766691cca902501093b4b69c288d15259 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 18:59:29 -0700 Subject: [PATCH 05/87] Got some extra progress in, got extra data added, and am working on atol and parse_SRC_DST.O --- archive/x/x86-64/dijkstra.asm | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 7dc45b439..5eea9c6af 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -30,7 +30,8 @@ -%DEFINE parse_SRC_DST.STACK_INIT 0 ;Placeholder +%DEFINE parse_SRC_DST.STACK_INIT 8 +%DEFINE parse_SRC_DST.atol 0 %DEFINE atol.STACK_INIT 8 @@ -109,6 +110,45 @@ parse_SRC_DST: PUSH RBP, MOV RBP, RSP SUB RSP, parse_SRC_DST.STACK_INIT + MOV QWORD [RBP - parse_SRC_DST.atol], 0 + ;Check if SRC/DST is empty or not. + MOV RAX, [RDI] + MOV AL, BYTE [RAX] ;Pull first piece of data in string + CMP RAX, EMPTY_INPUT + JE .error + + MOV RCX, 0 + .validate: + MOV DL, BYTE [RAX+RCX] + JMP [.jmpTable + RDX*8] + .jmpTable: + ; --------------------------------------------------------------------------- + ; Valid bytes: ['0'-'9'], 0 + ; --------------------------------------------------------------------------- + dq .zero + times 48 dq .error + times 10 dq .num + times 69 dq .error + + + .cont: + + + .zero: + CMP RCX, 0 + JE .error ;We really shouldn't have empty inputs or reach this state at RCX == 0 at all. + JNE .cont + .num: + INC RCX + JMP .validate + + .error: + MOV RAX, -1 + ADD RSP, parse_SRC_DST.STACK_INIT + MOV RSP, RBP + POP RBP + + RET From 2e4d4f1c65d6a89c352524569308c5c1707dec7c Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 20:00:16 -0700 Subject: [PATCH 06/87] I think atol is done now? I think parse_SRC_DST is also done as well. Now I just need to implement them. --- archive/x/x86-64/dijkstra.asm | 69 +++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 5eea9c6af..5f5be35ec 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,6 @@ +;Exit codes +%DEFINE INVALID_ARGC -1 + ;Constants %DEFINE EMPTY_INPUT 0 @@ -16,6 +19,8 @@ %DEFINE MAP_ANONYMOUS %DEFINE SYS_MUNMAP 11 +;Thread +%DEFINE SYS_EXIT 60 ;Stack displacements @@ -30,12 +35,14 @@ -%DEFINE parse_SRC_DST.STACK_INIT 8 -%DEFINE parse_SRC_DST.atol 0 +%DEFINE parse_SRC_DST.STACK_INIT 16 +%DEFINE parse_SRC_DST.argv_loc 8 +%DEFINE parse_SRC_DST.strlen 16 +%DEFINE parse_SRC_DST.atol 24 %DEFINE atol.STACK_INIT 8 -%DEFINE atol.returnValue 8 +%DEFINE atol.ret 8 section .rodata @@ -57,8 +64,6 @@ section .bss section .text -global _start - atol: ; ---------------------------------------------------------------------------- ; Function: atol (ascii to long) @@ -66,7 +71,7 @@ atol: ; Converts ascii string to long value (64 bits). ; Parameters: ; RDI - (char*) Pointer to string to convert to integer. -; RSI - () Unused. +; RSI - (long) Strlen. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. @@ -78,13 +83,50 @@ atol: PUSH RBP MOV RBP, RSP SUB RSP, atol.STACK_INIT + MOV QWORD [RBP - atol.ret] + MOV RBX, 10 ;Multiplier + MOV RCX, 0 + MOV R8B, BYTE [RDI+RCX] + .operation: + MOV RAX, QWORD [RBP - atol.ret] + MUL RBX + INC RCX + SUB R8B, '0' + ADD RAX, R8 + MOV QWORD [RBP - atol.ret], RAX + CMP RCX, RSI ;Compare counter to Strlen + JNE .operation - - + MOV RAX, QWORD [RBP - atol.ret] + ADD RSP, atol.STACK_INIT + MOV RSP, RBP + POP RBP + RET +global _start _start: + PUSH RBP + MOV RBP, RSP + SUB RSP, _start.STACK_INIT + MOV RAX, [RBP + _start.argc] + CMP RAX, 4 ;Program name + vertices + SRC + DST + JNE .error + + + + + .error: + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, invalid.msg + MOV RDX, invalid.len + SYSCALL + + MOV RAX, SYS_EXIT + MOV RDI, INVALID_ARGC + SYSCALL @@ -110,6 +152,8 @@ parse_SRC_DST: PUSH RBP, MOV RBP, RSP SUB RSP, parse_SRC_DST.STACK_INIT + MOV QWORD [RBP - parse_SRC_DST.argv_loc], RDI + MOV QWORD [RBP - parse_SRC_DST.strlen], 0 MOV QWORD [RBP - parse_SRC_DST.atol], 0 ;Check if SRC/DST is empty or not. MOV RAX, [RDI] @@ -129,10 +173,12 @@ parse_SRC_DST: times 48 dq .error times 10 dq .num times 69 dq .error - - .cont: - + MOV RDI, QWORD [RBP - parse_SRC_DST.argv_loc] + MOV QWORD [RBP - parse_SRC_DST.strlen], RCX + MOV RSI, RCX + CALL atol + MOV QWORD [RBP - parse_SRC_DST.atol], RAX .zero: CMP RCX, 0 @@ -147,7 +193,6 @@ parse_SRC_DST: ADD RSP, parse_SRC_DST.STACK_INIT MOV RSP, RBP POP RBP - RET From 9e3bcd96ba48441e554f5c80aea8fe279042f4c5 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 21:26:11 -0700 Subject: [PATCH 07/87] Did a bunch of work and finished the src/dst parser and some extra code in _start. Will need to debug once things get running. --- archive/x/x86-64/dijkstra.asm | 62 ++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 5f5be35ec..5eabd167d 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,5 +1,10 @@ ;Exit codes +%DEFINE EXIT_OK 0 %DEFINE INVALID_ARGC -1 +%DEFINE INVALID_SRC -2 +%DEFINE INVALID_SRC -3 +%DEFINE INVALID_NUM_NEG -4 +%DEFINE INVALID_CHAR -5 ;Constants %DEFINE EMPTY_INPUT 0 @@ -57,9 +62,12 @@ src_dst: .src dq 0 .dst dq 0 minheap: + ;Minheap will be used to implement priority queue. .ptr dq 0 .size dd 0 .max_size dd 0 ;SYS_MMAP will be based on this value; maximum array size. + +commas dq 0 section .bss section .text @@ -112,12 +120,63 @@ _start: MOV RAX, [RBP + _start.argc] CMP RAX, 4 ;Program name + vertices + SRC + DST + MOV RDI, INVALID_ARGC JNE .error + ;SRC Parse + MOV RDI, QWORD [RBP + _start.argv2] + LEA RSI, [src_dst.src] + CALL parse_SRC_DST + CMP RAX, -1 + MOV RDI, INVALID_SRC + JBE .error + ;DST Parse + MOV RDI, QWORD [RBP + _start.argv3] + LEA RSI, [src_dst.dst] + CALL parse_SRC_DST + CMP RAX, -1 + MOV RDI, INVALID_DST + JBE .error + ;Count commas + MOV RCX, 0 + MOV RSI, [RBP+_start.argv1] + MOV RSI, [RSI] + comma_loop: + MOV DL, [RSP+RCX] + INC RCX + .commaJMP: + ; --------------------------------------------------------------------------- + ; Valid bytes: ['0'-'9'], 0, ',' + ; --------------------------------------------------------------------------- + dq .zero + times 43 dq .error + dq .comma ; Handle comma + dq .neg ; Jump to error. + times 2 dq .error + times 10 dq .comma ; '0'-'9' + times 69 dq .error + .comma: + INC [commas] + JMP comma_loop + .error: + MOV RAX, INVALID_NUM_NEG + MOV RBX, INVALID_CHAR + CMP DL, '-' + CMOVE RDI, RAX + CMOVNE RDI, RBX + JMP _start.error + .zero: + + + MOV RAX, SYS_EXIT + MOV RDI, EXIT_OK + SYSCALL .error: + MOV R15, RDI + MOV RAX, SYS_WRITE MOV RDI, STDOUT MOV RSI, invalid.msg @@ -125,9 +184,10 @@ _start: SYSCALL MOV RAX, SYS_EXIT - MOV RDI, INVALID_ARGC + MOV RDI, R15 SYSCALL +parse_vertices: parse_SRC_DST: From b4acec58a8e84ad12da5fe1885acabc0e8a47d6b Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Jul 2025 23:54:52 -0700 Subject: [PATCH 08/87] Finished ezsqrt? I'm just getting things in place before I start fixing, debugging, optimizing, etc. --- archive/x/x86-64/dijkstra.asm | 89 +++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 15 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 5eabd167d..e3772f690 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -5,6 +5,7 @@ %DEFINE INVALID_SRC -3 %DEFINE INVALID_NUM_NEG -4 %DEFINE INVALID_CHAR -5 +%DEFINE INVALID_NUM_VERTS -6 ;Constants %DEFINE EMPTY_INPUT 0 @@ -67,11 +68,49 @@ minheap: .size dd 0 .max_size dd 0 ;SYS_MMAP will be based on this value; maximum array size. +vertice_array: + .ptr dq 0 + .size dq 0 + .vertices dq 0 + commas dq 0 section .bss section .text +ezsqrt: +; ---------------------------------------------------------------------------- +; Function: Easy Square Root +; Description: +; Checks if number is perfect square, and also moves the sqrt to a specified pointer. +; Parameters: +; RDI - (long) Input value to sqrt. +; RSI - (long*) Location to move sqrt to. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - -1 (Input not square). +; --------------------------------------------------------------------------- + PUSH RBP + MOV RBP, RSP + + MOV RDX, -1 + MOV RCX, 1 + .sqrt_loop: + MOV RAX, RCX + MUL RCX + CMP RAX, RDI + CMOVA RAX, RDX + INC RCX + JB .sqrt_loop + MOV [RSI], RCX + + MOV RSP, RBP + POP RBP + RET + atol: ; ---------------------------------------------------------------------------- ; Function: atol (ascii to long) @@ -111,6 +150,9 @@ atol: MOV RSP, RBP POP RBP RET + + + global _start _start: @@ -121,7 +163,7 @@ _start: MOV RAX, [RBP + _start.argc] CMP RAX, 4 ;Program name + vertices + SRC + DST MOV RDI, INVALID_ARGC - JNE .error + JNE error ;SRC Parse MOV RDI, QWORD [RBP + _start.argv2] @@ -129,7 +171,7 @@ _start: CALL parse_SRC_DST CMP RAX, -1 MOV RDI, INVALID_SRC - JBE .error + JBE error ;DST Parse MOV RDI, QWORD [RBP + _start.argv3] @@ -137,14 +179,14 @@ _start: CALL parse_SRC_DST CMP RAX, -1 MOV RDI, INVALID_DST - JBE .error + JBE error ;Count commas MOV RCX, 0 MOV RSI, [RBP+_start.argv1] MOV RSI, [RSI] comma_loop: - MOV DL, [RSP+RCX] + MOV DL, [RSP+RCX*8] INC RCX .commaJMP: ; --------------------------------------------------------------------------- @@ -168,24 +210,41 @@ _start: CMOVNE RDI, RBX JMP _start.error .zero: - + CMP RCX, 0 + MOV RDI, INVALID_NUM_VERTS + JE error + INC [commas] ;To get the actual count, as there's one less comma than the amount of connections. + MOV RAX, [commas] + MOV [vertice_array.size], RAX + ;Continued from zero + ;Mapping memory for the array [vertex][distances]. + MOV RAX, SYS_MMAP + MOV RDI, [vertice_array.size] + MOV RSI, PROT_READ | PROT_WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + MOV [vertice_array.ptr], RAX + + MOV RAX, SYS_EXIT MOV RDI, EXIT_OK SYSCALL - .error: - MOV R15, RDI +error: + MOV R15, RDI - MOV RAX, SYS_WRITE - MOV RDI, STDOUT - MOV RSI, invalid.msg - MOV RDX, invalid.len - SYSCALL + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, invalid.msg + MOV RDX, invalid.len + SYSCALL - MOV RAX, SYS_EXIT - MOV RDI, R15 - SYSCALL + MOV RAX, SYS_EXIT + MOV RDI, R15 + SYSCALL parse_vertices: From cecc60f3e8c9cf7181b7d13ea0e362fc9133c244 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 17 Jul 2025 00:57:33 -0700 Subject: [PATCH 09/87] Going to mmap the minheap 100%, instead of holding it in the .data section. Would be better if more than one were ever needed. --- archive/x/x86-64/dijkstra.asm | 73 ++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e3772f690..f72962490 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -6,6 +6,7 @@ %DEFINE INVALID_NUM_NEG -4 %DEFINE INVALID_CHAR -5 %DEFINE INVALID_NUM_VERTS -6 +%DEFINE INVALID_NOT_SQUARE -7 ;Constants %DEFINE EMPTY_INPUT 0 @@ -38,7 +39,7 @@ %DEFINE _start.argv3 40 ; RBP+ ^ ; RBP- v - +%DEFINE _start.minheap 8 %DEFINE parse_SRC_DST.STACK_INIT 16 @@ -62,11 +63,20 @@ section .data src_dst: .src dq 0 .dst dq 0 -minheap: +struc minheap: ;Minheap will be used to implement priority queue. .ptr dq 0 .size dd 0 - .max_size dd 0 ;SYS_MMAP will be based on this value; maximum array size. + .max_size dd 0 + + .vft dq minheap_vft +endstruc + +minheap_vft: + .right dq right + .left dq left + .parent dq parent + .min dq min vertice_array: .ptr dq 0 @@ -77,6 +87,50 @@ commas dq 0 section .bss section .text +; ---------------------------------------------------------------------------- +; Functions: Get right, get left, get parent node. +; Description: +; Finds the requested nodes based on the index of the array. +; Parameters: +; RDI - (long) Index. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - right/left/parent index. +; --------------------------------------------------------------------------- +right: + SHL RDI, 1 + ADD RDI, 2 + RET +left: + SHL RDI, 1 + ADD RDI, 1 + RET +parent: + DEC RDI + SHR RDI, 1 + RET + + +min: +; ---------------------------------------------------------------------------- +; Function: Minimum node of heap. +; Description: +; Pulls minimum node from given minheap. +; Parameters: +; RDI - (minheap*) Ptr to minheap. +; RSI - (long*) Location to move sqrt to. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - Minimum of minheap. +; --------------------------------------------------------------------------- + MOV RAX, [RDI ezsqrt: ; ---------------------------------------------------------------------------- @@ -102,14 +156,16 @@ ezsqrt: MOV RAX, RCX MUL RCX CMP RAX, RDI - CMOVA RAX, RDX INC RCX + CMOVA RAX, RDX JB .sqrt_loop + MOV [RSI], RCX MOV RSP, RBP POP RBP RET + atol: ; ---------------------------------------------------------------------------- @@ -159,6 +215,7 @@ _start: PUSH RBP MOV RBP, RSP SUB RSP, _start.STACK_INIT + MOV [RBP+_start.minheap], 0 MOV RAX, [RBP + _start.argc] CMP RAX, 4 ;Program name + vertices + SRC + DST @@ -227,13 +284,19 @@ _start: SYSCALL MOV [vertice_array.ptr], RAX - + MOV RDI, [vertice_array.size] + LEA RSI, [vertive_array.vertices] + CALL ezsqrt + CMP RAX, -1 + MOV RDI, INVALID_NOT_SQUARE + JE error MOV RAX, SYS_EXIT MOV RDI, EXIT_OK SYSCALL error: + ;Bad inputs JMP here. MOV R15, RDI MOV RAX, SYS_WRITE From 599701e0dac194a90fd23f765541e0ea2ffa5497 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 17 Jul 2025 02:04:58 -0700 Subject: [PATCH 10/87] Finishing up before I go to bed tonight. Added error handling to the # vertices (if src/dst > #vertices). --- archive/x/x86-64/dijkstra.asm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index f72962490..0bc469475 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -289,7 +289,18 @@ _start: CALL ezsqrt CMP RAX, -1 MOV RDI, INVALID_NOT_SQUARE - JE error + JE error + + MOV RAX, [src_dst.src] + MOV RBX, [vertice_array.vertices] + CMP RAX, RBX + MOV RDI, INVALID_SRC + JA error + MOV RAX, [src_dst.dst] + CMP RAX, RBX + MOV RDI, INVALID_DST + JA ERROR + MOV RAX, SYS_EXIT MOV RDI, EXIT_OK From 7f85419c00e9371ae71e58d3b4986a9318485a11 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 17 Jul 2025 22:08:19 -0700 Subject: [PATCH 11/87] I'm going to go with the mmapped "object" minheap rather than sticking it in .data; would allow for more than one to be created. --- archive/x/x86-64/dijkstra.asm | 71 ++++++++++++++--------------------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 0bc469475..bf95b5fa0 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -52,6 +52,13 @@ %DEFINE atol.ret 8 section .rodata +minheap_vtable: + dq minheap::right + dq minheap::left + dq minheap::swap + dq minheap::parent + dq minheap::min + dq minheap::construct invalid: .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' @@ -65,19 +72,13 @@ src_dst: .dst dq 0 struc minheap: ;Minheap will be used to implement priority queue. - .ptr dq 0 - .size dd 0 - .max_size dd 0 - + .vptr resq 1 + .ptr resq 1 + .size resd 1 + .max_size resd 1 .vft dq minheap_vft endstruc -minheap_vft: - .right dq right - .left dq left - .parent dq parent - .min dq min - vertice_array: .ptr dq 0 .size dq 0 @@ -87,50 +88,34 @@ commas dq 0 section .bss section .text +minheap::construct: ; ---------------------------------------------------------------------------- -; Functions: Get right, get left, get parent node. +; Function: Minheap constructor ; Description: -; Finds the requested nodes based on the index of the array. +; Constructs the minheap. ; Parameters: -; RDI - (long) Index. +; RDI - (long) Maximum capacity of the inner array of the Minheap (allocated as RDI*8). ; RSI - () Unused. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - right/left/parent index. +; RAX - (Minheap*) Ptr to new Minheap object. ; --------------------------------------------------------------------------- -right: - SHL RDI, 1 - ADD RDI, 2 - RET -left: - SHL RDI, 1 - ADD RDI, 1 - RET -parent: - DEC RDI - SHR RDI, 1 - RET - + PUSH RBP + MOV RBP, RSP + + MOV RAX, SYS_MMAP + MOV RDI, minheap_size + MOV RSI, PROT_READ | PROT|WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + + -min: -; ---------------------------------------------------------------------------- -; Function: Minimum node of heap. -; Description: -; Pulls minimum node from given minheap. -; Parameters: -; RDI - (minheap*) Ptr to minheap. -; RSI - (long*) Location to move sqrt to. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - Minimum of minheap. -; --------------------------------------------------------------------------- - MOV RAX, [RDI ezsqrt: ; ---------------------------------------------------------------------------- From 22c375d879b7287a3e9322f68672e3063dc61f5a Mon Sep 17 00:00:00 2001 From: = Date: Thu, 17 Jul 2025 23:28:33 -0700 Subject: [PATCH 12/87] Got some work done on minheap. This program will definitely need debugging and reorganization when I finish the structure. --- archive/x/x86-64/dijkstra.asm | 113 +++++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 17 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index bf95b5fa0..978e01816 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -10,7 +10,7 @@ ;Constants %DEFINE EMPTY_INPUT 0 - +%DEFINE SHIFT_X8 ;SYSCALLS ;I/O @@ -52,13 +52,13 @@ %DEFINE atol.ret 8 section .rodata -minheap_vtable: - dq minheap::right - dq minheap::left - dq minheap::swap - dq minheap::parent - dq minheap::min - dq minheap::construct +minheap_vTable: + dq minheap@right + dq minheap@left + dq minheap@swap ;I'm going to use a lock xchg for this. + dq minheap@parent + dq minheap@min + dq minheap@construct invalid: .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' @@ -72,11 +72,10 @@ src_dst: .dst dq 0 struc minheap: ;Minheap will be used to implement priority queue. - .vptr resq 1 + .vTable resq 1 .ptr resq 1 .size resd 1 .max_size resd 1 - .vft dq minheap_vft endstruc vertice_array: @@ -88,7 +87,57 @@ commas dq 0 section .bss section .text -minheap::construct: +;Minheap code area (This will be a nightmare). +; ---------------------------------------------------------------------------- +; Function: Right, left, parent vertex. +; Description: +; Grabs the index of the right, left, or parent index, based on the given index in RDI. +; Parameters: +; RDI - (long) Index. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Right/left/parent index. +; --------------------------------------------------------------------------- +minheap@right: + MOV RAX, RDI + SHL RAX, 1 + ADD RAX, 2 +minheap@left: + MOV RAX, RDI + SHL RAX, 1 + ADD RAX, 1 +minheap@parent: + MOV RAX, RDI + SUB RAX, 1 + SHR RAX, 1 + RET +minheap@swap: + +minheap@min: +; ---------------------------------------------------------------------------- +; Function: Minheap minimum element (root). +; Description: +; Constructs the minheap. +; Parameters: +; RDI - (Minheap*) Ptr to minheap to pull from [0] of the array pointer. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Minimum element (root) of the minheap tree. +; --------------------------------------------------------------------------- + MOV RAX, [RDI + minheap.ptr] + MOV RAX, [RAX] ;Load address in .ptr + MOV RAX, [RAX] ;Load [0] in ptr + RET + +minheap@constructor: ; ---------------------------------------------------------------------------- ; Function: Minheap constructor ; Description: @@ -105,6 +154,7 @@ minheap::construct: ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP + PUSH RDI MOV RAX, SYS_MMAP MOV RDI, minheap_size @@ -114,6 +164,29 @@ minheap::construct: MOV R8, 0 SYSCALL + POP RDI + + PUSH RAX + LEA RSI, minheap_vTable + MOV [RAX + minheap.vTable], RSI + ;Allocate an array for the minheap elements. + MOV RAX, SYS_MMAP + SHL RDI, SHIFT_X8 ;RDI * 8 bytes + MOV RSI, PROT_READ | PROT_WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + + POP RDI + MOV [RDI + minheap.ptr], RAX + + MOV RAX, RDI ;MOV the minheap ptr back into RAX + MOV RSP, RBP + POP RBP + RET + + @@ -130,7 +203,7 @@ ezsqrt: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - -1 (Input not square). +; RAX - (long) -1 (Input not square). ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -165,7 +238,7 @@ atol: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - long value of string. +; RAX - (long) Long value of string. ; --------------------------------------------------------------------------- PUSH RBP @@ -262,20 +335,21 @@ _start: ;Mapping memory for the array [vertex][distances]. MOV RAX, SYS_MMAP MOV RDI, [vertice_array.size] + SHL RDI, SHIFT_X8 MOV RSI, PROT_READ | PROT_WRITE MOV RDX, MAP_SHARED | MAP_ANONYMOUS MOV R10, -1 MOV R8, 0 SYSCALL MOV [vertice_array.ptr], RAX - + ;Check if input is square MOV RDI, [vertice_array.size] LEA RSI, [vertive_array.vertices] CALL ezsqrt CMP RAX, -1 MOV RDI, INVALID_NOT_SQUARE JE error - + ;Check if SRC/DST > vertices MOV RAX, [src_dst.src] MOV RBX, [vertice_array.vertices] CMP RAX, RBX @@ -284,7 +358,12 @@ _start: MOV RAX, [src_dst.dst] CMP RAX, RBX MOV RDI, INVALID_DST - JA ERROR + JA error + + + MOV RDI, [vertice_array.vertices] + CALL minheap@constructor + MOV [RBP+_start.minheap], RAX MOV RAX, SYS_EXIT @@ -324,7 +403,7 @@ parse_SRC_DST: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - -1 for invalid input. +; RAX - (long) -1 for invalid input. ; --------------------------------------------------------------------------- PUSH RBP, From 92d12c5d33d72cc09042e055fb53c176ac7d3d78 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 17 Jul 2025 23:41:48 -0700 Subject: [PATCH 13/87] I think minheap is done for now? --- archive/x/x86-64/dijkstra.asm | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 978e01816..3cb24184c 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -55,7 +55,7 @@ section .rodata minheap_vTable: dq minheap@right dq minheap@left - dq minheap@swap ;I'm going to use a lock xchg for this. + dq minheap@swap dq minheap@parent dq minheap@min dq minheap@construct @@ -116,6 +116,25 @@ minheap@parent: SHR RAX, 1 RET minheap@swap: +; ---------------------------------------------------------------------------- +; Function: Minheap minimum element (root). +; Description: +; Constructs the minheap. +; Parameters: +; RDI - (Minheap*) This. +; RSI - (long) Index one. +; RDX - (long) Index two. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None; RAX clobbered. +; --------------------------------------------------------------------------- + MOV RAX, [RDI + minheap.ptr + RSI*8] + MOV R10, [RDI + minheap.ptr + RDX*8] + MOV [RDI + minheap.ptr + RDX*8], RAX + MOV [RDI + minheap.ptr + RSI*8], R10 + RET minheap@min: ; ---------------------------------------------------------------------------- @@ -123,7 +142,7 @@ minheap@min: ; Description: ; Constructs the minheap. ; Parameters: -; RDI - (Minheap*) Ptr to minheap to pull from [0] of the array pointer. +; RDI - (Minheap*) Ptr to minheap to pull from [0] of the array pointer. This ptr. ; RSI - () Unused. ; RDX - () Unused. ; R10 - () Unused. From 4ced58cae6b0c345f84f173e0b12ce10ea7381d6 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 18 Jul 2025 01:47:44 -0700 Subject: [PATCH 14/87] I'm going to hop off for the night so I don't get a headache over this. I'm going to need to use a function for addressing the heap unless I want a mess in this function. --- archive/x/x86-64/dijkstra.asm | 50 ++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 3cb24184c..415192582 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -47,6 +47,10 @@ %DEFINE parse_SRC_DST.strlen 16 %DEFINE parse_SRC_DST.atol 24 +%DEFINE minheap@insert.STACK_INIT 16 +%DEFINE minheap@insert.This 8 +%DEFINE minheap@insert.index 16 + %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 @@ -58,6 +62,9 @@ minheap_vTable: dq minheap@swap dq minheap@parent dq minheap@min + dq minheap@insert ; These three will be the most complex to implement. + dq minheap@delete ; These three will be the most complex to implement. + dq minheap@heapify ; These three will be the most complex to implement. dq minheap@construct invalid: @@ -205,8 +212,42 @@ minheap@constructor: POP RBP RET - - +minheap@insert: +; ---------------------------------------------------------------------------- +; Function: Easy Square Root +; Description: +; Checks if number is perfect square, and also moves the sqrt to a specified pointer. +; Parameters: +; RDI - (Minheap*) This. +; RSI - (long) Value to insert. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; --------------------------------------------------------------------------- + PUSH RBP + MOV RBP, RSP + SUB RSP, minheap@insert.STACK_INIT + MOV [RBP - minheap@insert.This], RDI + MOV [RBP - minheap@insert.index], 0 + + + MOV RAX, [RDI + minheap.ptr] + MOV RDX, [RDI + minheap.size] + MOV [RAX + RDX*8], RSI + MOV [RBP - minheap@insert.index], RDX + + .loop: + MOV R10, 1 ; Truth bit for while conditional + MOV R8, 0 ; Temporary Register for atomic conditions within the while loop. + MOV R9, 1 ; Temporary true bit, since CMOV doesn't allow immediate operands. + MOV R11, 0 ; ^ but false bit + CMP RDX, 0 + CMOVBE R8, R11 + AND R10, R8 + ezsqrt: @@ -292,7 +333,7 @@ _start: PUSH RBP MOV RBP, RSP SUB RSP, _start.STACK_INIT - MOV [RBP+_start.minheap], 0 + MOV [RBP - _start.minheap], 0 MOV RAX, [RBP + _start.argc] CMP RAX, 4 ;Program name + vertices + SRC + DST @@ -471,5 +512,6 @@ parse_SRC_DST: POP RBP RET - +dijkstra: + From fde003e8aa981be6acb6826d8a156125a1118b80 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 18 Jul 2025 08:55:23 -0700 Subject: [PATCH 15/87] Got a bit of work done this morning. Going to take a break from writing this as to not fry my brain over x86. --- archive/x/x86-64/dijkstra.asm | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 415192582..e4a4eb245 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -47,9 +47,10 @@ %DEFINE parse_SRC_DST.strlen 16 %DEFINE parse_SRC_DST.atol 24 -%DEFINE minheap@insert.STACK_INIT 16 +%DEFINE minheap@insert.STACK_INIT 24 %DEFINE minheap@insert.This 8 %DEFINE minheap@insert.index 16 +%DEFINE minheap@insert.operatedIndex 24 %DEFINE atol.STACK_INIT 8 @@ -226,18 +227,23 @@ minheap@insert: ; R9 - () Unused. ; Returns: ; RAX - () None. +; Clobbers - R11, ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, minheap@insert.STACK_INIT MOV [RBP - minheap@insert.This], RDI MOV [RBP - minheap@insert.index], 0 - + MOV [RBP - minheap@insert.operatedIndex], 0 MOV RAX, [RDI + minheap.ptr] MOV RDX, [RDI + minheap.size] MOV [RAX + RDX*8], RSI MOV [RBP - minheap@insert.index], RDX + MOV R10, RDX + DEC R10 + SHR R10, 1 + MOV [RBP - minheap@insert.operatedIndex], R10 .loop: MOV R10, 1 ; Truth bit for while conditional @@ -247,6 +253,8 @@ minheap@insert: CMP RDX, 0 CMOVBE R8, R11 AND R10, R8 + MOV R8, + @@ -310,14 +318,14 @@ atol: MOV RCX, 0 MOV R8B, BYTE [RDI+RCX] .operation: - MOV RAX, QWORD [RBP - atol.ret] - MUL RBX - INC RCX - SUB R8B, '0' - ADD RAX, R8 - MOV QWORD [RBP - atol.ret], RAX - CMP RCX, RSI ;Compare counter to Strlen - JNE .operation + MOV RAX, QWORD [RBP - atol.ret] + MUL RBX + INC RCX + SUB R8B, '0' + ADD RAX, R8 + MOV QWORD [RBP - atol.ret], RAX + CMP RCX, RSI ;Compare counter to Strlen + JNE .operation MOV RAX, QWORD [RBP - atol.ret] ADD RSP, atol.STACK_INIT From e860444c21817a4b64459b3fe5d7c24970dc7d36 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 12:36:34 -0700 Subject: [PATCH 16/87] Finished the structure of insert in minheap? Still got work to do... --- archive/x/x86-64/dijkstra.asm | 50 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e4a4eb245..2e8dcc3b5 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -227,7 +227,7 @@ minheap@insert: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - R11, +; Clobbers - R11, R12, R13, R15 ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -240,20 +240,42 @@ minheap@insert: MOV RDX, [RDI + minheap.size] MOV [RAX + RDX*8], RSI MOV [RBP - minheap@insert.index], RDX - MOV R10, RDX - DEC R10 - SHR R10, 1 - MOV [RBP - minheap@insert.operatedIndex], R10 - .loop: - MOV R10, 1 ; Truth bit for while conditional - MOV R8, 0 ; Temporary Register for atomic conditions within the while loop. - MOV R9, 1 ; Temporary true bit, since CMOV doesn't allow immediate operands. - MOV R11, 0 ; ^ but false bit - CMP RDX, 0 - CMOVBE R8, R11 - AND R10, R8 - MOV R8, + ;This whole code here is pretty gross. This is just for while loop conditionals. + MOV R10, RDX + DEC R10 + SHR R10, 1 + MOV [RBP - minheap@insert.operatedIndex], R10 + MOV R15, 1 ; Final condition + MOV R11, [RBP - minheap@insert.This] + MOV R12, [RBP - minheap@insert.operatedIndex] + MOV R11, [RBP - minheap.ptr] + MOV R12, [R11 - R12*8] + MOV R13, [RBP - minheap@insert.index] + MOV R13, [R11 - R13*8] + MOV R11, 0 + CMP R12, R13 + SETA R11B + AND R15,R11 + MOV R12, [RBP - minheap@insert.index] + MOV R11, 0 + CMP R12, R11 + SETA R11B + AND R15, R11 + CMP R15, 0 + JNA .loop_end + + ;Non-conditional code in the while loop: + MOV R11, [RBP - minheap@insert.index] + DEC R11 + SHR R11, 1 + MOV R11, [RBP - minheap@insert.index] + JMP .loop + + .loop_end: + + + From 7932a1c2421e977fb5b17bdfd05b8ca1b2bfdce3 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 16:54:45 -0700 Subject: [PATCH 17/87] Got more work done on delete. I should have committed earlier. Will finish minheap@delete for now. --- archive/x/x86-64/dijkstra.asm | 89 +++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2e8dcc3b5..175ce301e 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -10,7 +10,8 @@ ;Constants %DEFINE EMPTY_INPUT 0 -%DEFINE SHIFT_X8 +%DEFINE SHIFT_X8 3 +%DEFINE SHIFT_X2 1 ;SYSCALLS ;I/O @@ -52,6 +53,9 @@ %DEFINE minheap@insert.index 16 %DEFINE minheap@insert.operatedIndex 24 +%DEFINE minheap@delete.STACK_INIT 8 +%DEFINE minheap@delete.This + %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 @@ -114,10 +118,12 @@ minheap@right: MOV RAX, RDI SHL RAX, 1 ADD RAX, 2 + RET minheap@left: MOV RAX, RDI SHL RAX, 1 ADD RAX, 1 + RET minheap@parent: MOV RAX, RDI SUB RAX, 1 @@ -163,7 +169,6 @@ minheap@min: MOV RAX, [RAX] ;Load address in .ptr MOV RAX, [RAX] ;Load [0] in ptr RET - minheap@constructor: ; ---------------------------------------------------------------------------- ; Function: Minheap constructor @@ -220,7 +225,7 @@ minheap@insert: ; Checks if number is perfect square, and also moves the sqrt to a specified pointer. ; Parameters: ; RDI - (Minheap*) This. -; RSI - (long) Value to insert. +; RSI - (long) Value to delete. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. @@ -273,9 +278,84 @@ minheap@insert: JMP .loop .loop_end: - + ADD RSP, minheap@insert.STACK_INIT + MOV RSP, RBP + POP RBP + RET +minheap@delete: +; ---------------------------------------------------------------------------- +; Function: Minheap delete +; Description: +; Deletes a vertex from the minheap. Eek. RDI will hold the pointer for most of the function as I don't wish to juggle a pointer. +; Parameters: +; RDI - (Minheap*) This. +; RSI - (long) Value to delete. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - R15, +; ---------------------------------------------------------------------------- + PUSH RBP + MOV RBP, RSP + SUB RSP, minheap@delete.STACK_INIT + MOV [RBP - minheap@delete.This], RDI + + MOV RAX, -1 ;Index + MOV RDX, [RDI] + MOV RDX, [RDX + minheap.size] + MOV RCX, 0 ;Loop ctr + .for_loop: + MOV R10, [RDI + minheap.ptr] + MOV R10, [R10 + RCX*8] + INC RCX + JNE R10, RSI + JB .for_loop + CMP RCX, RDX + JB .for_loop + MOV RAX, RCX + CMP RAX, -1 + JE .end + + MOV RAX, [RDI] + MOV RAX, [RDI + minheap.ptr] + MOV RDX, RSI ;MOV index from RSI into RDX + MOV R10, [RDI + minheap.size] + DEC R10 + MOV R10, [RDI + R10*8] ; Get last element. + MOV QWORD [RAX + RDX], R10 + MOV R15, [RDI + minheap.size] + MOV R14, RSI + ;Heapify + .heapify: + ; R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index. + MOV RDI, R14 + CALL minheap@left + MOV R12, RAX + CALL minheap@right + MOV R13, RAX + SHL R12, SHIFT_X2 + ADD R12, 1 + SHL R13, SHIFT_X2 + ADD R13, 2 + MOV R11, R14 + + + + .heapify_break: + + + + + .end + MOV RSP, RBP + POP RBP + RET + @@ -294,6 +374,7 @@ ezsqrt: ; R9 - () Unused. ; Returns: ; RAX - (long) -1 (Input not square). +; Clobbers - RCX ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP From ba6fdf107544ae4cf3e86f323b952197dfe4b385 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 18:11:07 -0700 Subject: [PATCH 18/87] Finished minheap@delete. I might not need to add heapify? Maybe. --- archive/x/x86-64/dijkstra.asm | 62 ++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 175ce301e..6c7b4b791 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,11 @@ +;MACROS +%MACRO initilizeRBXRCXMinheap 0 + MOV RBX, [RBP - minheap@delete.This] ; For left child of heap. + MOV RCX, [RBP - minheap@delete.This] ; For smallest child of heap. + MOV RBX, [RBX + minheap.ptr] + MOV RCX, [RCX + minheap.ptr] +%ENDMACRO + ;Exit codes %DEFINE EXIT_OK 0 %DEFINE INVALID_ARGC -1 @@ -53,8 +61,9 @@ %DEFINE minheap@insert.index 16 %DEFINE minheap@insert.operatedIndex 24 -%DEFINE minheap@delete.STACK_INIT 8 -%DEFINE minheap@delete.This +%DEFINE minheap@delete.STACK_INIT 16 +%DEFINE minheap@delete.This 8 +%DEFINE minheap@delete.index 16 %DEFINE atol.STACK_INIT 8 @@ -297,12 +306,13 @@ minheap@delete: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - R15, +; Clobbers - RBX, RCX, R11, R12, R13, R14, R15. ; ---------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, minheap@delete.STACK_INIT MOV [RBP - minheap@delete.This], RDI + MOV [RBP - minheap@delete.index], 0 MOV RAX, -1 ;Index MOV RDX, [RDI] @@ -319,8 +329,8 @@ minheap@delete: MOV RAX, RCX CMP RAX, -1 JE .end + MOV [RBP - minheap@delete.index], RAX ; Save Index - MOV RAX, [RDI] MOV RAX, [RDI + minheap.ptr] MOV RDX, RSI ;MOV index from RSI into RDX MOV R10, [RDI + minheap.size] @@ -328,11 +338,10 @@ minheap@delete: MOV R10, [RDI + R10*8] ; Get last element. MOV QWORD [RAX + RDX], R10 MOV R15, [RDI + minheap.size] - MOV R14, RSI + MOV R14, [RBP - minheap@delete.index] ;Heapify .heapify: - ; R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index. - MOV RDI, R14 + ; R10 = Conditional, R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index, R15 = Minheap size. CALL minheap@left MOV R12, RAX CALL minheap@right @@ -343,20 +352,41 @@ minheap@delete: ADD R13, 2 MOV R11, R14 - - - - .heapify_break: - - - - + initilizeRBXRCXMinheap + MOV RBX, [RBX + minheap.ptr] + MOV RCX, [RCX + minheap.ptr] + MOV RBX, [RBX + R12*8] + MOV RCX, [RCX + R11*8] + CMP R12, R15 + JA .end + CMP RBX, RCX + JA .end + MOV R11, R12 + initilizeRBXRCXMinheap + MOV RBX, [RBX + R13*8] + MOV RCX, [RCX + R11*8] + CMP R13, R15 + JA .end + CMP RBX, RCX + JA .end + MOV R11, R13 + CMP R11, R14 + JNE .end + MOV RSI, R14 + MOV RDX, R11 + MOV RDI, [RBP - minheap@delete.This] + MOV R8, [RBP - minheap@delete.This] + MOV R8, [R8 + minheap.vTable] + CALL [R8+minheap@swap] + MOV R14, R11 + MOV [RBP - minheap@delete.index], R14 .end + ADD RSP, minheap@delete.STACK_INIT MOV RSP, RBP POP RBP RET - +minheap@heapify: From ba9820bf36b72852743a9f43b10173f8afd34b6a Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 19:15:47 -0700 Subject: [PATCH 19/87] I think the structure of minheap is done now. It's time to parse the input, work on Dijkstra's algorithm finally, in later commits, and then fix syntax errors, debug, simplify, and then I'll be done. This is already longer in terms of code than my sleep sort; wow! --- archive/x/x86-64/dijkstra.asm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 6c7b4b791..b0cbc4806 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -229,12 +229,12 @@ minheap@constructor: minheap@insert: ; ---------------------------------------------------------------------------- -; Function: Easy Square Root +; Function: Minheap insert. ; Description: -; Checks if number is perfect square, and also moves the sqrt to a specified pointer. +; Inserts value into min heap. ; Parameters: ; RDI - (Minheap*) This. -; RSI - (long) Value to delete. +; RSI - (long) Value to insert. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. @@ -252,7 +252,7 @@ minheap@insert: MOV RAX, [RDI + minheap.ptr] MOV RDX, [RDI + minheap.size] - MOV [RAX + RDX*8], RSI + MOV [RAX + RDX*8], RSI ; Inserts value. I seriously cannot believe I forgot I wrote this; that's assembly... MOV [RBP - minheap@insert.index], RDX .loop: ;This whole code here is pretty gross. This is just for while loop conditionals. @@ -287,6 +287,7 @@ minheap@insert: JMP .loop .loop_end: + ADD RSP, minheap@insert.STACK_INIT MOV RSP, RBP POP RBP From 297d3378783335e623e04bd35345706fef10b05b Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 20:57:35 -0700 Subject: [PATCH 20/87] I forgot to add the parallel element to the distances on the priority queue. This is going to be a nightmare. --- archive/x/x86-64/dijkstra.asm | 95 +++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 9 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index b0cbc4806..f3cf6a06b 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -40,7 +40,7 @@ ;Stack displacements -%DEFINE _start.STACK_INIT 32 +%DEFINE _start.STACK_INIT 16 %DEFINE _start.argc 8 %DEFINE _start.argv0 16 %DEFINE _start.argv1 24 @@ -49,6 +49,7 @@ ; RBP+ ^ ; RBP- v %DEFINE _start.minheap 8 +%DEFINE _start.ret 16 %DEFINE parse_SRC_DST.STACK_INIT 16 @@ -95,6 +96,7 @@ struc minheap: ;Minheap will be used to implement priority queue. .vTable resq 1 .ptr resq 1 + .vertPtr resq 1 .size resd 1 .max_size resd 1 endstruc @@ -103,6 +105,7 @@ vertice_array: .ptr dq 0 .size dq 0 .vertices dq 0 + .dists dq 0 commas dq 0 section .bss @@ -153,17 +156,23 @@ minheap@swap: ; Returns: ; RAX - () None; RAX clobbered. ; --------------------------------------------------------------------------- - MOV RAX, [RDI + minheap.ptr + RSI*8] + ;Swap Distances + MOV RAX, [RDI + minheap.vertPtr + RSI*8] + MOV R10, [RDI + minheap.vertPtr + RDX*8] + MOV [RDI + minheap.vertPtr + RDX*8], RAX + MOV [RDI + minheap.vertPtr + RSI*8], R10 + ;Swap vertices + MOV RAX, [RDI + minheap.vertPtr + RSI*8] MOV R10, [RDI + minheap.ptr + RDX*8] - MOV [RDI + minheap.ptr + RDX*8], RAX - MOV [RDI + minheap.ptr + RSI*8], R10 + MOV [RDI + minheap.vertPtr + RDX*8], RAX + MOV [RDI + minheap.vertPtr + RSI*8], R10 RET minheap@min: ; ---------------------------------------------------------------------------- -; Function: Minheap minimum element (root). +; Function: Minheap minimum element (root). (poll). ; Description: -; Constructs the minheap. +; Gets minimum element of minheap and removes (poll), then returns minimum element. ; Parameters: ; RDI - (Minheap*) Ptr to minheap to pull from [0] of the array pointer. This ptr. ; RSI - () Unused. @@ -174,9 +183,13 @@ minheap@min: ; Returns: ; RAX - (long) Minimum element (root) of the minheap tree. ; --------------------------------------------------------------------------- - MOV RAX, [RDI + minheap.ptr] - MOV RAX, [RAX] ;Load address in .ptr + MOV RAX, [RDI + minheap.vertPtr] + MOV RAX, [RAX] ;Load address in .vertPtr MOV RAX, [RAX] ;Load [0] in ptr + PUSH RAX + MOV RSI, RAX + CALL minheap@delete + POP RAX RET minheap@constructor: ; ---------------------------------------------------------------------------- @@ -221,7 +234,20 @@ minheap@constructor: POP RDI MOV [RDI + minheap.ptr], RAX + PUSH RAX + LEA RSI, minheap_vTable + MOV [RAX + minheap.vTable], RSI + ;Allocate an array for the minheap elements. + MOV RAX, SYS_MMAP + SHL RDI, SHIFT_X8 ;RDI * 8 bytes + MOV RSI, PROT_READ | PROT_WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + POP RDI + MOV [RDI + minheap.vertPtr], RAX MOV RAX, RDI ;MOV the minheap ptr back into RAX MOV RSP, RBP POP RBP @@ -476,6 +502,7 @@ _start: MOV RBP, RSP SUB RSP, _start.STACK_INIT MOV [RBP - _start.minheap], 0 + MOV [RBP - _start.ret], 0 MOV RAX, [RBP + _start.argc] CMP RAX, 4 ;Program name + vertices + SRC + DST @@ -542,8 +569,18 @@ _start: MOV RDX, MAP_SHARED | MAP_ANONYMOUS MOV R10, -1 MOV R8, 0 - SYSCALL + SYSCALL MOV [vertice_array.ptr], RAX + ;Mapping memory for distances + MOV RAX, SYS_MMAP + MOV RDI, [vertice_array.vertices] + SHL RDI, SHIFT_X8 + MOV RSI, PROT_READ | PROT_WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + MOV [vertice_array.dists], RAX ;Check if input is square MOV RDI, [vertice_array.size] LEA RSI, [vertive_array.vertices] @@ -655,5 +692,45 @@ parse_SRC_DST: RET dijkstra: +; ---------------------------------------------------------------------------- +; Function: dijkstra +; Description: +; Utilizes Dijkstra's algorithm to find the shortest path to a vertex. +; Parameters: +; RDI - (char*) Pointer to stack location of src/dst. +; RSI - (long*) Pointer to src/dst storage in .data +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Distance. +; --------------------------------------------------------------------------- + PUSH RBP, + MOV RBP, RSP + SUB [RBP - dijkstra.STACK_INIT] + MOV [RBP - dijkstra.distance] + ;Initialize distance array + MOV RCX, 0 + MOV RBX, 0 + MOV RAX, [vertice_array.ptr] + MOV RDX, [vertice_array.ptr] + PREFETCH0 RDX ; Operating on memory a lot so I'd like to try and cache this. + .RCX_loop: + MOV RDX, [vertice_array.ptr + RCX*8] + .RBX_loop: + MOV [RDX+RBX*8], -1 + INC RBX + CMP RBX, [vertice_array.vertices] + JB .RBX_loop + ADD RCX, [vertice_array.vertices] + CMP RCX, [vertice_array.size] + JB .RCX_loop + MOV RAX, + + + + + From 6394f8583614a93f9b4c6f88c789e1e017aecc7a Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 21:37:28 -0700 Subject: [PATCH 21/87] I might have to restart on the priority queue, simply because I forgot to include the vertex element intself, rather than only the distances. --- archive/x/x86-64/dijkstra.asm | 45 ++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index f3cf6a06b..971ced085 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -6,6 +6,29 @@ MOV RCX, [RCX + minheap.ptr] %ENDMACRO +%MACRO POPREGS 0 +POP R9 +POP R8 +POP R10 +POP RSI +POP RDI +POP RDX +POP RCX +POP RBX +POP RAX +%ENDMACRO +%MACRO PUSHREGS 0 +PUSH RAX +PUSH RBX +PUSH RCX +PUSH RDX +PUSH RDI +PUSH RSI +PUSH R10 +PUSH R8 +PUSH R9 +%ENDMACRO + ;Exit codes %DEFINE EXIT_OK 0 %DEFINE INVALID_ARGC -1 @@ -235,8 +258,6 @@ minheap@constructor: POP RDI MOV [RDI + minheap.ptr], RAX PUSH RAX - LEA RSI, minheap_vTable - MOV [RAX + minheap.vTable], RSI ;Allocate an array for the minheap elements. MOV RAX, SYS_MMAP SHL RDI, SHIFT_X8 ;RDI * 8 bytes @@ -245,7 +266,6 @@ minheap@constructor: MOV R10, -1 MOV R8, 0 SYSCALL - POP RDI MOV [RDI + minheap.vertPtr], RAX MOV RAX, RDI ;MOV the minheap ptr back into RAX @@ -261,13 +281,13 @@ minheap@insert: ; Parameters: ; RDI - (Minheap*) This. ; RSI - (long) Value to insert. -; RDX - () Unused. +; RDX - (long) Corresponding vertex value. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - R11, R12, R13, R15 +; Clobbers - RBX, R11, R12, R13, R14, R15 ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -275,11 +295,12 @@ minheap@insert: MOV [RBP - minheap@insert.This], RDI MOV [RBP - minheap@insert.index], 0 MOV [RBP - minheap@insert.operatedIndex], 0 - + MOV R8, [RDI + minheap.size] MOV RAX, [RDI + minheap.ptr] - MOV RDX, [RDI + minheap.size] - MOV [RAX + RDX*8], RSI ; Inserts value. I seriously cannot believe I forgot I wrote this; that's assembly... - MOV [RBP - minheap@insert.index], RDX + MOV [RAX + R8*8], RSI + MOV RAX, [RDI + minheap.vertPtr] + MOV [RAX + R8*8], RDX + MOV [RBP - minheap@insert.index], R8 .loop: ;This whole code here is pretty gross. This is just for while loop conditionals. MOV R10, RDX @@ -293,6 +314,7 @@ minheap@insert: MOV R12, [R11 - R12*8] MOV R13, [RBP - minheap@insert.index] MOV R13, [R11 - R13*8] + MOV R14, [R11 MOV R11, 0 CMP R12, R13 SETA R11B @@ -306,6 +328,11 @@ minheap@insert: JNA .loop_end ;Non-conditional code in the while loop: + MOV RDI, [RBP - minheap@insert.This] + MOV RSI, [RBP - minheap@insert.index] + MOV RDX, [RBP - minheap@insert.operatedIndex] + MOV RBX, [RDI + minheap.vTable] + CALL [RBX + minheap@swap] MOV R11, [RBP - minheap@insert.index] DEC R11 SHR R11, 1 From e395acc50c5840fcb5456640d5338d88693ab20a Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 21:50:49 -0700 Subject: [PATCH 22/87] This might not actually be so bad off in terms of the corresponding vertex elements. But this still needs extensive debugging. The plan is to debug as it runs, and then fix components until they are functional. --- archive/x/x86-64/dijkstra.asm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 971ced085..2eb30fe54 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -373,7 +373,7 @@ minheap@delete: MOV RDX, [RDX + minheap.size] MOV RCX, 0 ;Loop ctr .for_loop: - MOV R10, [RDI + minheap.ptr] + MOV R10, [RDI + minheap.vertPtr] MOV R10, [R10 + RCX*8] INC RCX JNE R10, RSI @@ -385,6 +385,12 @@ minheap@delete: JE .end MOV [RBP - minheap@delete.index], RAX ; Save Index + MOV RAX, [RDI + minheap.vertPtr] + MOV RDX, RSI ;MOV index from RSI into RDX + MOV R10, [RDI + minheap.size] + DEC R10 + MOV R10, [RDI + R10*8] ; Get last element. + MOV QWORD [RAX + RDX], R10 MOV RAX, [RDI + minheap.ptr] MOV RDX, RSI ;MOV index from RSI into RDX MOV R10, [RDI + minheap.size] @@ -407,8 +413,6 @@ minheap@delete: MOV R11, R14 initilizeRBXRCXMinheap - MOV RBX, [RBX + minheap.ptr] - MOV RCX, [RCX + minheap.ptr] MOV RBX, [RBX + R12*8] MOV RCX, [RCX + R11*8] CMP R12, R15 From a3efd8014affd6f66bf9432de3193660608fb7ba Mon Sep 17 00:00:00 2001 From: = Date: Mon, 21 Jul 2025 23:50:54 -0700 Subject: [PATCH 23/87] Getting progress on the main algorithm. --- archive/x/x86-64/dijkstra.asm | 128 +++++++++++++++++++++++++++------- 1 file changed, 104 insertions(+), 24 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2eb30fe54..984574f1a 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,7 +1,7 @@ ;MACROS %MACRO initilizeRBXRCXMinheap 0 - MOV RBX, [RBP - minheap@delete.This] ; For left child of heap. - MOV RCX, [RBP - minheap@delete.This] ; For smallest child of heap. + MOV RBX, [RBP - VT_MINHEAP_DELETE.This] ; For left child of heap. + MOV RCX, [RBP - VT_MINHEAP_DELETE.This] ; For smallest child of heap. MOV RBX, [RBX + minheap.ptr] MOV RCX, [RCX + minheap.ptr] %ENDMACRO @@ -93,6 +93,11 @@ PUSH R9 %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 +%DEFINE dijkstra.STACK_INIT 24 +%DEFINE dijkstra.distance 8 +%DEFINE dijkstra.current 16 +%DEFINE dijkstra.heap 24 + section .rodata minheap_vTable: dq minheap@right @@ -104,6 +109,17 @@ minheap_vTable: dq minheap@delete ; These three will be the most complex to implement. dq minheap@heapify ; These three will be the most complex to implement. dq minheap@construct + dq minheap@isEmpty +%DEFINE VT_MINHEAP_RIGHT equ 0*8 +%DEFINE VT_MINHEAP_LEFT equ 1*8 +%DEFINE VT_MINHEAP_SWAP equ 2*8 +%DEFINE VT_MINHEAP_PARENT equ 3*8 +%DEFINE VT_MINHEAP_MIN equ 4*8 +%DEFINE VT_MINHEAP_INSERT equ 5*8 +%DEFINE VT_MINHEAP_DELETE equ 6*8 +%DEFINE VT_MINHEAP_HEAPIFY equ 7*8 +%DEFINE VT_MINHEAP_CONSTRUCT equ 8*8 +%DEFINE VT_MINHEAP_ISEMPTY equ 9*8 invalid: .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' @@ -129,6 +145,7 @@ vertice_array: .size dq 0 .vertices dq 0 .dists dq 0 + .seen dq 0 commas dq 0 section .bss @@ -211,10 +228,10 @@ minheap@min: MOV RAX, [RAX] ;Load [0] in ptr PUSH RAX MOV RSI, RAX - CALL minheap@delete + CALL VT_MINHEAP_DELETE POP RAX RET -minheap@constructor: +minheap@construct: ; ---------------------------------------------------------------------------- ; Function: Minheap constructor ; Description: @@ -331,8 +348,8 @@ minheap@insert: MOV RDI, [RBP - minheap@insert.This] MOV RSI, [RBP - minheap@insert.index] MOV RDX, [RBP - minheap@insert.operatedIndex] - MOV RBX, [RDI + minheap.vTable] - CALL [RBX + minheap@swap] + MOV RBX, [RDI + minheap@insert] + CALL [RBX + VT_MINHEAP_SWAP] MOV R11, [RBP - minheap@insert.index] DEC R11 SHR R11, 1 @@ -341,7 +358,7 @@ minheap@insert: .loop_end: - ADD RSP, minheap@insert.STACK_INIT + ADD RSP, VT_MINHEAP_INSERT.STACK_INIT MOV RSP, RBP POP RBP RET @@ -383,7 +400,7 @@ minheap@delete: MOV RAX, RCX CMP RAX, -1 JE .end - MOV [RBP - minheap@delete.index], RAX ; Save Index + MOV [RBP - VT_MINHEAP_DELETE.index], RAX ; Save Index MOV RAX, [RDI + minheap.vertPtr] MOV RDX, RSI ;MOV index from RSI into RDX @@ -398,13 +415,13 @@ minheap@delete: MOV R10, [RDI + R10*8] ; Get last element. MOV QWORD [RAX + RDX], R10 MOV R15, [RDI + minheap.size] - MOV R14, [RBP - minheap@delete.index] + MOV R14, [RBP - VT_MINHEAP_DELETE.index] ;Heapify .heapify: ; R10 = Conditional, R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index, R15 = Minheap size. - CALL minheap@left + CALL VT_MINHEAP_LEFT MOV R12, RAX - CALL minheap@right + CALL VT_MINHEAP_RIGHT MOV R13, RAX SHL R12, SHIFT_X2 ADD R12, 1 @@ -432,18 +449,40 @@ minheap@delete: JNE .end MOV RSI, R14 MOV RDX, R11 - MOV RDI, [RBP - minheap@delete.This] - MOV R8, [RBP - minheap@delete.This] + MOV RDI, [RBP - VT_MINHEAP_DELETE.This] + MOV R8, [RBP - VT_MINHEAP_DELETE.This] MOV R8, [R8 + minheap.vTable] - CALL [R8+minheap@swap] + CALL [R8+VT_MINHEAP_SWAP] MOV R14, R11 - MOV [RBP - minheap@delete.index], R14 + MOV [RBP - VT_MINHEAP_DELETE.index], R14 .end - ADD RSP, minheap@delete.STACK_INIT + ADD RSP, VT_MINHEAP_DELETE.STACK_INIT MOV RSP, RBP POP RBP RET - + +minheap@isEmpty: +; ---------------------------------------------------------------------------- +; Function: Minheap empty checker +; Description: +; Checks if the minheap is empty. +; Parameters: +; RDI - (Minheap*) This. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (bool) True/false. +; Clobbers - None. +; ---------------------------------------------------------------------------- + MOV RAX, [RDI + minheap.size] + CMP RAX, 0 + SETA RAX + RET + + minheap@heapify: @@ -632,7 +671,7 @@ _start: MOV RDI, [vertice_array.vertices] - CALL minheap@constructor + CALL VT_MINHEAP_CONSTRUCTor MOV [RBP+_start.minheap], RAX @@ -728,19 +767,22 @@ dijkstra: ; Description: ; Utilizes Dijkstra's algorithm to find the shortest path to a vertex. ; Parameters: -; RDI - (char*) Pointer to stack location of src/dst. -; RSI - (long*) Pointer to src/dst storage in .data -; RDX - () Unused. +; RDI - (Minheap*) Ptr to minheap. +; RSI - (long) SRC. +; RDX - (long) DST. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - (long) Distance. +; Clobbers - R11, R12 ; --------------------------------------------------------------------------- PUSH RBP, MOV RBP, RSP - SUB [RBP - dijkstra.STACK_INIT] - MOV [RBP - dijkstra.distance] + SUB RBP, dijkstra.STACK_INIT + MOV [RBP - dijkstra.distance], -1 ; If -1, then return an error. + MOV [RBP - dijkstra.current], -1 ; Placeholder + MOV [RBP - dijkstra.heap], RDI ;Initialize distance array MOV RCX, 0 MOV RBX, 0 @@ -757,8 +799,46 @@ dijkstra: ADD RCX, [vertice_array.vertices] CMP RCX, [vertice_array.size] JB .RCX_loop - MOV RAX, + MOV RAX, [vertice_array.size] + PUSHREGS + MOV RAX, SYS_MMAP + MOV RDI, [vertice_array.size] + MOV RSI, PROT_READ | PROT_WRITE + MOV RDX, MAP_SHARED | MAP_ANONYMOUS + MOV R10, -1 + MOV R8, 0 + SYSCALL + MOV [vertice_array.seen], RAX + POPREGS + + MOV R10, [vertice_array.seen] + MOV [R10 + SRC*8], 1 ; SRC is SEEN. + MOV R11, [RDI] + MOV R11, [R11 + minheap.vTable] + MOV RDX, RSI + MOV RSI, 0 + CALL [R11 + VT_MINHEAP_INSERT] + MOV RAX, [vertice_array.dists] + MOV [RAX + RSI*8], 0 + MOV RCX, 0 + .vertice_manipulate_loop: + MOV RAX, [vertice_array.vTable] + CALL [RAX + VT_MINHEAP_ISEMPTY] + CMP RAX, 0 + JE .return + MOV RAX, [vertice_array.vTable] + MOV RDI,[RBP - dijkstra.heap] + + + + .return: + ADD RSP, dijkstra.STACK_INIT + MOV RSP, RBP + POP RBP + RET + + From 0afb6fb2888240de5d8bd639c4fbd9d674452690 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Jul 2025 01:16:55 -0700 Subject: [PATCH 24/87] More work on Dijkstra. This is going to take a few days more just for the code alone. Getting tired... --- archive/x/x86-64/dijkstra.asm | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 984574f1a..be7867b38 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -228,7 +228,8 @@ minheap@min: MOV RAX, [RAX] ;Load [0] in ptr PUSH RAX MOV RSI, RAX - CALL VT_MINHEAP_DELETE + MOV RAX, [RDI + minheap.vTable] + CALL [RAX + VT_MINHEAP_DELETE] POP RAX RET minheap@construct: @@ -358,7 +359,7 @@ minheap@insert: .loop_end: - ADD RSP, VT_MINHEAP_INSERT.STACK_INIT + ADD RSP, minheap@insert.STACK_INIT MOV RSP, RBP POP RBP RET @@ -400,7 +401,7 @@ minheap@delete: MOV RAX, RCX CMP RAX, -1 JE .end - MOV [RBP - VT_MINHEAP_DELETE.index], RAX ; Save Index + MOV [RBP - minheap@delete.index], RAX ; Save Index MOV RAX, [RDI + minheap.vertPtr] MOV RDX, RSI ;MOV index from RSI into RDX @@ -415,7 +416,7 @@ minheap@delete: MOV R10, [RDI + R10*8] ; Get last element. MOV QWORD [RAX + RDX], R10 MOV R15, [RDI + minheap.size] - MOV R14, [RBP - VT_MINHEAP_DELETE.index] + MOV R14, [RBP - minheap@delete.index] ;Heapify .heapify: ; R10 = Conditional, R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index, R15 = Minheap size. @@ -449,14 +450,14 @@ minheap@delete: JNE .end MOV RSI, R14 MOV RDX, R11 - MOV RDI, [RBP - VT_MINHEAP_DELETE.This] - MOV R8, [RBP - VT_MINHEAP_DELETE.This] + MOV RDI, [RBP - minheap@delete.This] + MOV R8, [RBP - minheap@delete.This] MOV R8, [R8 + minheap.vTable] CALL [R8+VT_MINHEAP_SWAP] MOV R14, R11 - MOV [RBP - VT_MINHEAP_DELETE.index], R14 - .end - ADD RSP, VT_MINHEAP_DELETE.STACK_INIT + MOV [RBP - minheap@delete.index], R14 + .end: + ADD RSP, minheap@delete.STACK_INIT MOV RSP, RBP POP RBP RET @@ -822,13 +823,17 @@ dijkstra: MOV [RAX + RSI*8], 0 MOV RCX, 0 .vertice_manipulate_loop: + MOV RDI, [RBP - dijkstra.heap] MOV RAX, [vertice_array.vTable] CALL [RAX + VT_MINHEAP_ISEMPTY] CMP RAX, 0 JE .return MOV RAX, [vertice_array.vTable] MOV RDI,[RBP - dijkstra.heap] - + CALL [RAX + VT_MINHEAP_MIN] + MOV [RBP - dijkstra.current], RAX + CMP [vertice_array.seen], 0 + JNE .vertice_manipulate_loop From b4e41527a3327c6d706c5bf08f619fca35b197b5 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Jul 2025 01:26:53 -0700 Subject: [PATCH 25/87] I'm done coding for tonight. That's another few hundred lines. Dijkstra will be finished; it seems ripe. --- archive/x/x86-64/dijkstra.asm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index be7867b38..3e4ade6b1 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -834,7 +834,9 @@ dijkstra: MOV [RBP - dijkstra.current], RAX CMP [vertice_array.seen], 0 JNE .vertice_manipulate_loop - + MOV RAX, [RBP - dijkstra.current] + MOV [vertice_array.seen + RAX*8], 1 + .return: From 0d32a8c35ec67b3e4c1d7287c566e49174ce788d Mon Sep 17 00:00:00 2001 From: = Date: Sat, 26 Jul 2025 05:41:20 -0700 Subject: [PATCH 26/87] Getting back to work on this; I needed a break. For my own sanity; the actual number parser (not validater) will be written now. --- archive/x/x86-64/dijkstra.asm | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 3e4ade6b1..1564208ac 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -845,7 +845,22 @@ dijkstra: POP RBP RET - +get_Neighbors +; ---------------------------------------------------------------------------- +; Function: Get Neighbors +; Description: +; Finds the neighbors of a given vertive and then adds them to the queue. +; Parameters: +; RDI - (Minheap*) Ptr to minheap. +; RSI - (long[]*) Seen. +; RDX - (long) DST. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Distance. +; Clobbers - R11, R12 +; --------------------------------------------------------------------------- From 01f35828743d19ef0dbb492479c01d2ca42f3ee7 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 1 Oct 2025 14:05:06 -0700 Subject: [PATCH 27/87] Working on parse_vertices. Should not be too difficult to start off with. Planning to start working on main method again once this is finished. --- archive/x/x86-64/dijkstra.asm | 75 ++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 1564208ac..ba66b3e3b 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -75,7 +75,13 @@ PUSH R9 %DEFINE _start.ret 16 -%DEFINE parse_SRC_DST.STACK_INIT 16 +%DEFINE parse_vertices.STACK_INIT 32 +%DEFINE parse_vertices.argv_loc 8 +%DEFINE parse_vertices.vert_loc 16 +%DEFINE parse_vertices.strlen 24 +%DEFINE parse_vertices.vert_ptr 32 + +%DEFINE parse_SRC_DST.STACK_INIT 24 %DEFINE parse_SRC_DST.argv_loc 8 %DEFINE parse_SRC_DST.strlen 16 %DEFINE parse_SRC_DST.atol 24 @@ -98,6 +104,10 @@ PUSH R9 %DEFINE dijkstra.current 16 %DEFINE dijkstra.heap 24 +%DEFINE parse_vertices.STACK_INIT 16 +%DEFINE parse_vertices.Argv1 8 +%DEFINE parse_vertices.strlen 16 + section .rodata minheap_vTable: dq minheap@right @@ -672,7 +682,7 @@ _start: MOV RDI, [vertice_array.vertices] - CALL VT_MINHEAP_CONSTRUCTor + CALL VT_MINHEAP_CONSTRUCTOR MOV [RBP+_start.minheap], RAX @@ -695,6 +705,60 @@ error: SYSCALL parse_vertices: +; ---------------------------------------------------------------------------- +; Function: parse_vertices +; Description: +; Implemented through finite state machine. +; Parses through argv[1], numbers comma delimited. +; Parameters: +; RDI - (char**) Pointer to stack location of argv[1]. +; RSI - (long*) Pointer to vertice storage in .data +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) -1 for invalid input. +; --------------------------------------------------------------------------- + PUSH RBP + MOV RBP, RSP + SUB RSP, parse_vertices.STACK_INIT + MOV QWORD [RBP - parse_vertices.argv_loc], RDI + MOV QWORD [RBP - parse_vertices.argv_loc], RSI + MOV QWORD [RBP - parse_vertices.strlen], 0 + MOV QWORD [RBP - parse_vertices.vert_ptr], 0 + + + MOV RAX, [RDI] + MOV AL, BYTE [RAX] ;Pull first piece of data in string + CMP RAX, EMPTY_INPUT + JE .error + + MOV RCX, 0 + .validate: + MOV DL, BYTE [RAX+RCX] + JMP [.jmpTable + RDX*8] + .jmpTable: + ; --------------------------------------------------------------------------- + ; Valid bytes: ['0'-'9'], 0, ',', ' ' + ; --------------------------------------------------------------------------- + dq .zero + times 31 dq .error + dq .space + times 11 .error + dq .comma + times 3 dq .error + times 10 dq .num + times 69 dq .error + + + .error: + MOV RAX, -1 + ADD RSP, parse_SRC_DST.STACK_INIT + MOV RSP, RBP + POP RBP + RET + parse_SRC_DST: @@ -706,7 +770,7 @@ parse_SRC_DST: ; Addressing argv[1] will cause an error. ; Parsed through a finite state machine. ; Parameters: -; RDI - (char*) Pointer to stack location of src/dst. +; RDI - (char**) Pointer to stack location of src/dst. ; RSI - (long*) Pointer to src/dst storage in .data ; RDX - () Unused. ; R10 - () Unused. @@ -715,7 +779,6 @@ parse_SRC_DST: ; Returns: ; RAX - (long) -1 for invalid input. ; --------------------------------------------------------------------------- - PUSH RBP, MOV RBP, RSP SUB RSP, parse_SRC_DST.STACK_INIT @@ -845,11 +908,11 @@ dijkstra: POP RBP RET -get_Neighbors +get_Neighbors: ; ---------------------------------------------------------------------------- ; Function: Get Neighbors ; Description: -; Finds the neighbors of a given vertive and then adds them to the queue. +; Finds the neighbors of a given vertice and then adds them to the queue. ; Parameters: ; RDI - (Minheap*) Ptr to minheap. ; RSI - (long[]*) Seen. From 4498399617b4f965f76c09052b51f4ff82155e01 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 1 Oct 2025 15:05:12 -0700 Subject: [PATCH 28/87] Working on jump table for parse_vertices. --- archive/x/x86-64/dijkstra.asm | 50 +++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index ba66b3e3b..60640b24a 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -44,6 +44,8 @@ PUSH R9 %DEFINE SHIFT_X8 3 %DEFINE SHIFT_X2 1 +%DEFINE EIGHT_BYTES 8 + ;SYSCALLS ;I/O %DEFINE SYS_WRITE 1 @@ -75,11 +77,13 @@ PUSH R9 %DEFINE _start.ret 16 -%DEFINE parse_vertices.STACK_INIT 32 +%DEFINE parse_vertices.STACK_INIT 48 %DEFINE parse_vertices.argv_loc 8 %DEFINE parse_vertices.vert_loc 16 %DEFINE parse_vertices.strlen 24 %DEFINE parse_vertices.vert_ptr 32 +%DEFINE parse_vertices.num_ptr 40 +%DEFINE parse_vertices.prevstate 48 %DEFINE parse_SRC_DST.STACK_INIT 24 %DEFINE parse_SRC_DST.argv_loc 8 @@ -153,10 +157,11 @@ endstruc vertice_array: .ptr dq 0 .size dq 0 - .vertices dq 0 + .edges dq 0 .dists dq 0 .seen dq 0 - + +num_edges dq 0 commas dq 0 section .bss @@ -654,7 +659,7 @@ _start: MOV [vertice_array.ptr], RAX ;Mapping memory for distances MOV RAX, SYS_MMAP - MOV RDI, [vertice_array.vertices] + MOV RDI, [vertice_array.edges] SHL RDI, SHIFT_X8 MOV RSI, PROT_READ | PROT_WRITE MOV RDX, MAP_SHARED | MAP_ANONYMOUS @@ -664,14 +669,14 @@ _start: MOV [vertice_array.dists], RAX ;Check if input is square MOV RDI, [vertice_array.size] - LEA RSI, [vertive_array.vertices] + LEA RSI, [vertice_array.edges] CALL ezsqrt CMP RAX, -1 MOV RDI, INVALID_NOT_SQUARE JE error ;Check if SRC/DST > vertices MOV RAX, [src_dst.src] - MOV RBX, [vertice_array.vertices] + MOV RBX, [vertice_array.edges] CMP RAX, RBX MOV RDI, INVALID_SRC JA error @@ -681,7 +686,7 @@ _start: JA error - MOV RDI, [vertice_array.vertices] + MOV RDI, [vertice_array.edges] CALL VT_MINHEAP_CONSTRUCTOR MOV [RBP+_start.minheap], RAX @@ -719,14 +724,21 @@ parse_vertices: ; R9 - () Unused. ; Returns: ; RAX - (long) -1 for invalid input. -; --------------------------------------------------------------------------- +; --------------------------------------------------------------------------- + ;Previous States + %DEFINE Parse.STATE.NUM 001b + %DEFINE Parse.STATE.COMMA 010b + %DEFINE Parse.STATE.SPACE 100b + PUSH RBP MOV RBP, RSP SUB RSP, parse_vertices.STACK_INIT MOV QWORD [RBP - parse_vertices.argv_loc], RDI - MOV QWORD [RBP - parse_vertices.argv_loc], RSI + MOV QWORD [RBP - parse_vertices.vert_loc], RSI MOV QWORD [RBP - parse_vertices.strlen], 0 MOV QWORD [RBP - parse_vertices.vert_ptr], 0 + MOV QWORD [RBP - parse_vertices.num_ptr], RDI + MOV QWORD [RBP - parse_vertices.prevstate], RDI MOV RAX, [RDI] @@ -751,6 +763,22 @@ parse_vertices: times 10 dq .num times 69 dq .error + .num: + CMP [RBP - parse_vertices.prevstate], Parse.STATE.COMMA + JE .error + INC [RBP - parse_vertices.strlen] + INC RCX + MOV [RBP - parse_vertices.prevstate], Parse.STATE.NUM + JMP .validate + .comma: + MOV RDI, [RBP - parse_vertices.num_ptr] + MOV RSI, [RBP - parse_vertices.strlen] + CALL atol + MOV RDI, [RBP - parse_vertices.vert_loc] + MOV RSI, [RBP - parse_vertices.vert_ptr] + MOV [RDI+RSI], RAX + ADD RSI, EIGHT_BYTES + MOV [RBP - parse_vertices.vert_ptr], RSI .error: MOV RAX, -1 @@ -858,9 +886,9 @@ dijkstra: .RBX_loop: MOV [RDX+RBX*8], -1 INC RBX - CMP RBX, [vertice_array.vertices] + CMP RBX, [vertice_array.edges] JB .RBX_loop - ADD RCX, [vertice_array.vertices] + ADD RCX, [vertice_array.edges] CMP RCX, [vertice_array.size] JB .RCX_loop MOV RAX, [vertice_array.size] From 9609276437b9fa27d74568831f929c1bb2fc46f3 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 1 Oct 2025 16:18:09 -0700 Subject: [PATCH 29/87] Finished with vertice_parser for now. I want to start finishing the ACTUAL program now. --- archive/x/x86-64/dijkstra.asm | 54 +++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 60640b24a..1c289ae3f 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -38,6 +38,7 @@ PUSH R9 %DEFINE INVALID_CHAR -5 %DEFINE INVALID_NUM_VERTS -6 %DEFINE INVALID_NOT_SQUARE -7 +%DEFINE INVALID_INVALID_STATE -8 ;Constants %DEFINE EMPTY_INPUT 0 @@ -726,6 +727,7 @@ parse_vertices: ; RAX - (long) -1 for invalid input. ; --------------------------------------------------------------------------- ;Previous States + %DEFINE Parse.STATE.START 000b %DEFINE Parse.STATE.NUM 001b %DEFINE Parse.STATE.COMMA 010b %DEFINE Parse.STATE.SPACE 100b @@ -751,9 +753,9 @@ parse_vertices: MOV DL, BYTE [RAX+RCX] JMP [.jmpTable + RDX*8] .jmpTable: - ; --------------------------------------------------------------------------- - ; Valid bytes: ['0'-'9'], 0, ',', ' ' - ; --------------------------------------------------------------------------- + ; --------------------------------------------------------------------------- + ; Valid bytes: ['0'-'9'], 0, ',', ' ' + ; --------------------------------------------------------------------------- dq .zero times 31 dq .error dq .space @@ -766,11 +768,17 @@ parse_vertices: .num: CMP [RBP - parse_vertices.prevstate], Parse.STATE.COMMA JE .error + INC [RBP - parse_vertices.strlen] INC RCX MOV [RBP - parse_vertices.prevstate], Parse.STATE.NUM JMP .validate .comma: + CMP [RBP - parse_vertices.prevstate], Parse.STATE.NUM + JNE .error + CMP [RBP - parse_vertices.prevstate], Parse.STATE.SPACE + JNE .error + MOV RDI, [RBP - parse_vertices.num_ptr] MOV RSI, [RBP - parse_vertices.strlen] CALL atol @@ -779,6 +787,29 @@ parse_vertices: MOV [RDI+RSI], RAX ADD RSI, EIGHT_BYTES MOV [RBP - parse_vertices.vert_ptr], RSI + MOV [RBP - parse_vertices.prevstate], Parse.STATE.COMMA + + MOV [RBP - parse_vertices.strlen], 0 + INC RCX + JMP.validate + .space: + CMP [RBP - parse_vertices.prevstate], Parse.STATE.NUM + JE .error + + INC RCX + MOV RDI, [RBP - parse_vertices.argv_loc] + LEA R11, [RDI+RCX] + MOV [RBP - parse_vertices.num_ptr], R11 + JMP .validate + .zero: + CMP [RBP - parse_vertices.prevstate], Parse.STATE.COMMA + JNE .error + CMP [RBP - parse_vertices.prevstate], Parse.STATE.SPACE + JNE .error + + CMP RCX, 0 + JE .error + JMP .cont .error: MOV RAX, -1 @@ -786,6 +817,11 @@ parse_vertices: MOV RSP, RBP POP RBP RET + .cont: + ADD RSP, parse_SRC_DST.STACK_INIT + MOV RSP, RBP + POP RBP + RET @@ -798,7 +834,7 @@ parse_SRC_DST: ; Addressing argv[1] will cause an error. ; Parsed through a finite state machine. ; Parameters: -; RDI - (char**) Pointer to stack location of src/dst. +; RDI - (char**) Pointer to stack location of src/dst. ; RSI - (long*) Pointer to src/dst storage in .data ; RDX - () Unused. ; R10 - () Unused. @@ -812,7 +848,7 @@ parse_SRC_DST: SUB RSP, parse_SRC_DST.STACK_INIT MOV QWORD [RBP - parse_SRC_DST.argv_loc], RDI MOV QWORD [RBP - parse_SRC_DST.strlen], 0 - MOV QWORD [RBP - parse_SRC_DST.atol], 0 + MOV QWORD [RBP - parse_SRC_DST.atol], RSI ;src/dst ptr ;Check if SRC/DST is empty or not. MOV RAX, [RDI] MOV AL, BYTE [RAX] ;Pull first piece of data in string @@ -836,7 +872,13 @@ parse_SRC_DST: MOV QWORD [RBP - parse_SRC_DST.strlen], RCX MOV RSI, RCX CALL atol - MOV QWORD [RBP - parse_SRC_DST.atol], RAX + MOV RSI, QWORD [RBP - parse_SRC_DST.atol] + MOV [RSI], RAX + + ADD RSP, parse_SRC_DST.STACK_INIT + MOV RSP, RBP + POP RBP + RET .zero: CMP RCX, 0 From db94b0bebe9288706f1aee16f7416342386dcbaf Mon Sep 17 00:00:00 2001 From: = Date: Wed, 1 Oct 2025 19:53:01 -0700 Subject: [PATCH 30/87] Redoing Dijkstra function. --- archive/x/x86-64/dijkstra.asm | 134 ++++++++++++++-------------------- 1 file changed, 55 insertions(+), 79 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 1c289ae3f..afea91b53 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -47,6 +47,8 @@ PUSH R9 %DEFINE EIGHT_BYTES 8 +%DEFINE INT_MAX 4294967295 + ;SYSCALLS ;I/O %DEFINE SYS_WRITE 1 @@ -104,10 +106,12 @@ PUSH R9 %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 -%DEFINE dijkstra.STACK_INIT 24 +%DEFINE dijkstra.STACK_INIT 40 %DEFINE dijkstra.distance 8 %DEFINE dijkstra.current 16 %DEFINE dijkstra.heap 24 +%DEFINE dijkstra.SRC 32 +%DEFINE dijkstra.DST 40 %DEFINE parse_vertices.STACK_INIT 16 %DEFINE parse_vertices.Argv1 8 @@ -268,11 +272,12 @@ minheap@construct: PUSH RDI MOV RAX, SYS_MMAP - MOV RDI, minheap_size - MOV RSI, PROT_READ | PROT|WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RDI, 0 + MOV RSI, minheap_size + MOV RDX, PROT_READ | PROT|WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, -1 + MOV R9, 0 SYSCALL POP RDI @@ -282,11 +287,13 @@ minheap@construct: MOV [RAX + minheap.vTable], RSI ;Allocate an array for the minheap elements. MOV RAX, SYS_MMAP - SHL RDI, SHIFT_X8 ;RDI * 8 bytes - MOV RSI, PROT_READ | PROT_WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RSI, RDI + MOV RDI, 0 + SHL RSI, SHIFT_X8 ;RSI * 8 bytes + MOV RDX, PROT_READ | PROT_WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, -1 + MOV R9, 0 SYSCALL POP RDI @@ -294,11 +301,12 @@ minheap@construct: PUSH RAX ;Allocate an array for the minheap elements. MOV RAX, SYS_MMAP - SHL RDI, SHIFT_X8 ;RDI * 8 bytes - MOV RSI, PROT_READ | PROT_WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RSI, RDI + SHL RSI, SHIFT_X8 ;RDI * 8 bytes + MOV RDX, PROT_READ | PROT_WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, -1 + MOV R9, 0 SYSCALL POP RDI MOV [RDI + minheap.vertPtr], RAX @@ -650,22 +658,23 @@ _start: ;Continued from zero ;Mapping memory for the array [vertex][distances]. MOV RAX, SYS_MMAP - MOV RDI, [vertice_array.size] - SHL RDI, SHIFT_X8 - MOV RSI, PROT_READ | PROT_WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RDI, 0 + MOV RSI, [vertice_array.size] + SHL RSI, SHIFT_X8 + MOV RDX, PROT_READ | PROT_WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, -1 + MOV R9, 0 SYSCALL MOV [vertice_array.ptr], RAX ;Mapping memory for distances MOV RAX, SYS_MMAP - MOV RDI, [vertice_array.edges] - SHL RDI, SHIFT_X8 - MOV RSI, PROT_READ | PROT_WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RSI, [vertice_array.edges] + SHL RSI, SHIFT_X8 + MOV RDX, PROT_READ | PROT_WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, -1 + MOV R9, 0 SYSCALL MOV [vertice_array.dists], RAX ;Check if input is square @@ -915,63 +924,30 @@ dijkstra: MOV RBP, RSP SUB RBP, dijkstra.STACK_INIT MOV [RBP - dijkstra.distance], -1 ; If -1, then return an error. - MOV [RBP - dijkstra.current], -1 ; Placeholder + MOV [RBP - dijkstra.current], -1 ; Placeholder. Use current to access get neighbors. MOV [RBP - dijkstra.heap], RDI - ;Initialize distance array - MOV RCX, 0 - MOV RBX, 0 - MOV RAX, [vertice_array.ptr] - MOV RDX, [vertice_array.ptr] - PREFETCH0 RDX ; Operating on memory a lot so I'd like to try and cache this. - .RCX_loop: - MOV RDX, [vertice_array.ptr + RCX*8] - .RBX_loop: - MOV [RDX+RBX*8], -1 - INC RBX - CMP RBX, [vertice_array.edges] - JB .RBX_loop - ADD RCX, [vertice_array.edges] - CMP RCX, [vertice_array.size] - JB .RCX_loop - MOV RAX, [vertice_array.size] - PUSHREGS + MOV [RBP - dijkstra.SRC], RSI + MOV [RBP - dijkstra.DST], RDX + ;Initialize distance array MOV RAX, SYS_MMAP - MOV RDI, [vertice_array.size] - MOV RSI, PROT_READ | PROT_WRITE - MOV RDX, MAP_SHARED | MAP_ANONYMOUS - MOV R10, -1 - MOV R8, 0 + MOV RDI, 0 + MOV RSI, [vertice_array.size] + MOV RDX PROT_READ | PROT_WRITE + MOV R10 MAP_ANONYMOUS | MAP_SHARED + MOV R8, -1 + MOV R9, 0 SYSCALL MOV [vertice_array.seen], RAX - POPREGS - - MOV R10, [vertice_array.seen] - MOV [R10 + SRC*8], 1 ; SRC is SEEN. - MOV R11, [RDI] - MOV R11, [R11 + minheap.vTable] - MOV RDX, RSI - MOV RSI, 0 - CALL [R11 + VT_MINHEAP_INSERT] - MOV RAX, [vertice_array.dists] - MOV [RAX + RSI*8], 0 MOV RCX, 0 - .vertice_manipulate_loop: - MOV RDI, [RBP - dijkstra.heap] - MOV RAX, [vertice_array.vTable] - CALL [RAX + VT_MINHEAP_ISEMPTY] - CMP RAX, 0 - JE .return - MOV RAX, [vertice_array.vTable] - MOV RDI,[RBP - dijkstra.heap] - CALL [RAX + VT_MINHEAP_MIN] - MOV [RBP - dijkstra.current], RAX - CMP [vertice_array.seen], 0 - JNE .vertice_manipulate_loop - MOV RAX, [RBP - dijkstra.current] - MOV [vertice_array.seen + RAX*8], 1 - + .dist_loop: + MOV RBX, [vertice_array.seen] + MOV [RBX+RCX*8], INT_MAX + CMP [vertice_array.size], RCX + JB .dist_loop + + .return: ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP @@ -986,7 +962,7 @@ get_Neighbors: ; Parameters: ; RDI - (Minheap*) Ptr to minheap. ; RSI - (long[]*) Seen. -; RDX - (long) DST. +; RDX - (long) SRC edge. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. From 0a4f1e5eafbbde7830080dc73afcf1ecc26dee87 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 1 Oct 2025 21:02:12 -0700 Subject: [PATCH 31/87] Finished a good amount of work for now. Need to fix get_neighbors and document the minheap operations better (and fix them where needed). --- archive/x/x86-64/dijkstra.asm | 52 +++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index afea91b53..65aad58ed 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -669,7 +669,7 @@ _start: MOV [vertice_array.ptr], RAX ;Mapping memory for distances MOV RAX, SYS_MMAP - MOV RSI, [vertice_array.edges] + MOV RSI, [vertice_array.num_vertices] SHL RSI, SHIFT_X8 MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS @@ -679,14 +679,14 @@ _start: MOV [vertice_array.dists], RAX ;Check if input is square MOV RDI, [vertice_array.size] - LEA RSI, [vertice_array.edges] + LEA RSI, [vertice_array.num_vertices] CALL ezsqrt CMP RAX, -1 MOV RDI, INVALID_NOT_SQUARE JE error ;Check if SRC/DST > vertices MOV RAX, [src_dst.src] - MOV RBX, [vertice_array.edges] + MOV RBX, [vertice_array.num_vertices] CMP RAX, RBX MOV RDI, INVALID_SRC JA error @@ -696,7 +696,7 @@ _start: JA error - MOV RDI, [vertice_array.edges] + MOV RDI, [vertice_array.num_vertices] CALL VT_MINHEAP_CONSTRUCTOR MOV [RBP+_start.minheap], RAX @@ -944,8 +944,14 @@ dijkstra: MOV [RBX+RCX*8], INT_MAX CMP [vertice_array.size], RCX JB .dist_loop - - + MOV [RBX+RCX], 0 + ;Get neighbors + + MOV RDI, [RBP - dijkstra.heap] + MOV RSI, [vertice_array.seen] + MOV RDX, [RBP - dijkstra.SRC] + MOV R10, + CALL get_Neighbors .return: @@ -958,18 +964,42 @@ get_Neighbors: ; ---------------------------------------------------------------------------- ; Function: Get Neighbors ; Description: -; Finds the neighbors of a given vertice and then adds them to the queue. +; Finds the neighbors of a given vertice and then adds them to the queue. +; I don't think a stack frame is needed here. ; Parameters: ; RDI - (Minheap*) Ptr to minheap. ; RSI - (long[]*) Seen. -; RDX - (long) SRC edge. -; R10 - () Unused. +; RDX - (long) SRC vertex. +; R10 - (long) # of neighbors. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - (long) Distance. -; Clobbers - R11, R12 -; --------------------------------------------------------------------------- +; Clobbers - RCX +; --------------------------------------------------------------------------- +MOV RAX, RDX +MOV RBX, [vertice_array.size] +MUL RBX +MOV RDX, [vertice_array.seen] +MOV R8, [vertice_array.ptr] +ADD RDX, RAX +MOV RCX, 0 + .neighbor_loop: + CMP [vertice_array.seen+RCX*8], 0 + JNE .skip_iteration + MOV [vertice_array.seen+RCX*8], 1 + MOV R9, [vertice_array.seen+RCX*8] + MOV RSI, + INC RCX + CMP RCX, [vertice_array. + + .skip_iteration: + INC RCX + CMP RCX, [vertice_array.num_vertices] + JB .neighbor_loop + .get_end: + + From 94cb79c5a500ae987daaeb084e30462f6b78ba21 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 4 Oct 2025 00:14:40 -0700 Subject: [PATCH 32/87] Okay, I certainly don't need the seen array. This helps a lot and will make things go smoother forward. I need to finish get_neighbors, and then finish Dijkstra using that progress. --- archive/x/x86-64/dijkstra.asm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 65aad58ed..dbdca5900 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -164,7 +164,6 @@ vertice_array: .size dq 0 .edges dq 0 .dists dq 0 - .seen dq 0 num_edges dq 0 commas dq 0 @@ -937,10 +936,9 @@ dijkstra: MOV R8, -1 MOV R9, 0 SYSCALL - MOV [vertice_array.seen], RAX MOV RCX, 0 .dist_loop: - MOV RBX, [vertice_array.seen] + MOV RBX, [vertice_array.dists] MOV [RBX+RCX*8], INT_MAX CMP [vertice_array.size], RCX JB .dist_loop @@ -968,7 +966,7 @@ get_Neighbors: ; I don't think a stack frame is needed here. ; Parameters: ; RDI - (Minheap*) Ptr to minheap. -; RSI - (long[]*) Seen. +; RSI - (long[]*) dists. ; RDX - (long) SRC vertex. ; R10 - (long) # of neighbors. ; R8 - () Unused. @@ -998,7 +996,7 @@ MOV RCX, 0 CMP RCX, [vertice_array.num_vertices] JB .neighbor_loop .get_end: - + From 8877579e3bc7a17803e6f2f8c1d37d048bb5427f Mon Sep 17 00:00:00 2001 From: = Date: Sat, 4 Oct 2025 22:04:04 -0700 Subject: [PATCH 33/87] Committing and pushing so I can work on my laptop. --- archive/x/x86-64/dijkstra.asm | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index dbdca5900..38a6533f7 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -977,25 +977,12 @@ get_Neighbors: ; --------------------------------------------------------------------------- MOV RAX, RDX MOV RBX, [vertice_array.size] -MUL RBX -MOV RDX, [vertice_array.seen] +MOV RDX, [vertice_array.dists] MOV R8, [vertice_array.ptr] ADD RDX, RAX MOV RCX, 0 .neighbor_loop: - CMP [vertice_array.seen+RCX*8], 0 - JNE .skip_iteration - MOV [vertice_array.seen+RCX*8], 1 - MOV R9, [vertice_array.seen+RCX*8] - MOV RSI, - INC RCX - CMP RCX, [vertice_array. - .skip_iteration: - INC RCX - CMP RCX, [vertice_array.num_vertices] - JB .neighbor_loop - .get_end: From edabbc52f75e7568927dd08ad151a615fc21f17f Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 01:01:46 -0700 Subject: [PATCH 34/87] Made some small fixes for later debugging convenience. I'm just going to try and finish this now; I've waited too long. --- archive/x/x86-64/dijkstra.asm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 38a6533f7..50a278d17 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -936,19 +936,27 @@ dijkstra: MOV R8, -1 MOV R9, 0 SYSCALL + MOV [vertice_array.dists], RAX MOV RCX, 0 .dist_loop: MOV RBX, [vertice_array.dists] MOV [RBX+RCX*8], INT_MAX CMP [vertice_array.size], RCX JB .dist_loop - MOV [RBX+RCX], 0 + MOV RCX, [RBP - dijkstra.SRC] + MOV [RBX+RCX*8], 0 + ;Moving virtual table addresss into R11 + MOV R11, [RBP - dijkstra.heap] + MOV R11, [R11 + minheap.vTable] + MOV R11, [R11] + + ;Get neighbors MOV RDI, [RBP - dijkstra.heap] - MOV RSI, [vertice_array.seen] + MOV RSI, [vertice_array.dists] MOV RDX, [RBP - dijkstra.SRC] - MOV R10, + MOV R10, [vertice_array.size] CALL get_Neighbors @@ -981,7 +989,11 @@ MOV RDX, [vertice_array.dists] MOV R8, [vertice_array.ptr] ADD RDX, RAX MOV RCX, 0 +MOV R11, [minheap.vtable] ;I want to hold the vtable in a register I won't write to often as I'm not looking to juggle this pointer. .neighbor_loop: + + + From 38a7922693bd77d5f3cae810ad86edaec12d8bd7 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 03:36:49 -0700 Subject: [PATCH 35/87] Going to finish the Dijkstra itself. Will use a lazy array as there's no decrease_priority method in minheap. I'm sure this can be finished soon. --- archive/x/x86-64/dijkstra.asm | 37 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 50a278d17..9a7e8559a 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -106,12 +106,13 @@ PUSH R9 %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 -%DEFINE dijkstra.STACK_INIT 40 +%DEFINE dijkstra.STACK_INIT 48 %DEFINE dijkstra.distance 8 %DEFINE dijkstra.current 16 %DEFINE dijkstra.heap 24 %DEFINE dijkstra.SRC 32 %DEFINE dijkstra.DST 40 +%DEFINE dijkstra.lazyArray 48 %DEFINE parse_vertices.STACK_INIT 16 %DEFINE parse_vertices.Argv1 8 @@ -908,6 +909,7 @@ dijkstra: ; Function: dijkstra ; Description: ; Utilizes Dijkstra's algorithm to find the shortest path to a vertex. +; Uses a lazy array in the algorithm due to the absence of a decrease_priority method. ; Parameters: ; RDI - (Minheap*) Ptr to minheap. ; RSI - (long) SRC. @@ -945,19 +947,22 @@ dijkstra: JB .dist_loop MOV RCX, [RBP - dijkstra.SRC] MOV [RBX+RCX*8], 0 - ;Moving virtual table addresss into R11 + ;Moving virtual table addresss into R11. I want to keep this in a dedicated register so I'm not re-pulling it in whenever I need it. MOV R11, [RBP - dijkstra.heap] MOV R11, [R11 + minheap.vTable] MOV R11, [R11] - - ;Get neighbors - MOV RDI, [RBP - dijkstra.heap] - MOV RSI, [vertice_array.dists] + MOV RSI, 0 ; Hardcoded, zero distance from source vertex. MOV RDX, [RBP - dijkstra.SRC] - MOV R10, [vertice_array.size] - CALL get_Neighbors + CALL [R11 + VT_MINHEAP_INSERT] + + ;Get neighbors + MOV RCX, 0 + .main_loop: + CALL [R11 + VT_MINHEAP_MIN] + MOV [RBP - dijkstra.current], RAX + .return: @@ -966,7 +971,7 @@ dijkstra: POP RBP RET -get_Neighbors: +;get_Neighbors: This MIGHT not be needed ; ---------------------------------------------------------------------------- ; Function: Get Neighbors ; Description: @@ -983,13 +988,13 @@ get_Neighbors: ; RAX - (long) Distance. ; Clobbers - RCX ; --------------------------------------------------------------------------- -MOV RAX, RDX -MOV RBX, [vertice_array.size] -MOV RDX, [vertice_array.dists] -MOV R8, [vertice_array.ptr] -ADD RDX, RAX -MOV RCX, 0 -MOV R11, [minheap.vtable] ;I want to hold the vtable in a register I won't write to often as I'm not looking to juggle this pointer. +;MOV RAX, RDX +;MOV RBX, [vertice_array.size] +;MOV RDX, [vertice_array.dists] +;MOV R8, [vertice_array.ptr] +;ADD RDX, RAX +;MOV RCX, 0 +;MOV R11, [minheap.vtable] ;I want to hold the vtable in a register I won't write to often as I'm not looking to juggle this pointer. .neighbor_loop: From de5225b67d14be74b4f7dd961a7f94e0dd05e028 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 06:36:36 -0700 Subject: [PATCH 36/87] Restarting this. I shouldn't have taken that long of a break. --- archive/x/x86-64/dijkstra.asm | 1010 --------------------------------- 1 file changed, 1010 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9a7e8559a..e69de29bb 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,1010 +0,0 @@ -;MACROS -%MACRO initilizeRBXRCXMinheap 0 - MOV RBX, [RBP - VT_MINHEAP_DELETE.This] ; For left child of heap. - MOV RCX, [RBP - VT_MINHEAP_DELETE.This] ; For smallest child of heap. - MOV RBX, [RBX + minheap.ptr] - MOV RCX, [RCX + minheap.ptr] -%ENDMACRO - -%MACRO POPREGS 0 -POP R9 -POP R8 -POP R10 -POP RSI -POP RDI -POP RDX -POP RCX -POP RBX -POP RAX -%ENDMACRO -%MACRO PUSHREGS 0 -PUSH RAX -PUSH RBX -PUSH RCX -PUSH RDX -PUSH RDI -PUSH RSI -PUSH R10 -PUSH R8 -PUSH R9 -%ENDMACRO - -;Exit codes -%DEFINE EXIT_OK 0 -%DEFINE INVALID_ARGC -1 -%DEFINE INVALID_SRC -2 -%DEFINE INVALID_SRC -3 -%DEFINE INVALID_NUM_NEG -4 -%DEFINE INVALID_CHAR -5 -%DEFINE INVALID_NUM_VERTS -6 -%DEFINE INVALID_NOT_SQUARE -7 -%DEFINE INVALID_INVALID_STATE -8 - -;Constants -%DEFINE EMPTY_INPUT 0 -%DEFINE SHIFT_X8 3 -%DEFINE SHIFT_X2 1 - -%DEFINE EIGHT_BYTES 8 - -%DEFINE INT_MAX 4294967295 - -;SYSCALLS -;I/O -%DEFINE SYS_WRITE 1 -%DEFINE STDOUT 1 -;Memory -%DEFINE SYS_MMAP 9 -;PROTS (RDX) -%DEFINE PROT_READ 0x01 -%DEFINE PROT_WRITE 0x02 -;FLAGS (R10) -%DEFINE MAP_SHARED -%DEFINE MAP_ANONYMOUS - -%DEFINE SYS_MUNMAP 11 -;Thread -%DEFINE SYS_EXIT 60 - -;Stack displacements - -%DEFINE _start.STACK_INIT 16 -%DEFINE _start.argc 8 -%DEFINE _start.argv0 16 -%DEFINE _start.argv1 24 -%DEFINE _start.argv2 32 -%DEFINE _start.argv3 40 -; RBP+ ^ -; RBP- v -%DEFINE _start.minheap 8 -%DEFINE _start.ret 16 - - -%DEFINE parse_vertices.STACK_INIT 48 -%DEFINE parse_vertices.argv_loc 8 -%DEFINE parse_vertices.vert_loc 16 -%DEFINE parse_vertices.strlen 24 -%DEFINE parse_vertices.vert_ptr 32 -%DEFINE parse_vertices.num_ptr 40 -%DEFINE parse_vertices.prevstate 48 - -%DEFINE parse_SRC_DST.STACK_INIT 24 -%DEFINE parse_SRC_DST.argv_loc 8 -%DEFINE parse_SRC_DST.strlen 16 -%DEFINE parse_SRC_DST.atol 24 - -%DEFINE minheap@insert.STACK_INIT 24 -%DEFINE minheap@insert.This 8 -%DEFINE minheap@insert.index 16 -%DEFINE minheap@insert.operatedIndex 24 - -%DEFINE minheap@delete.STACK_INIT 16 -%DEFINE minheap@delete.This 8 -%DEFINE minheap@delete.index 16 - - -%DEFINE atol.STACK_INIT 8 -%DEFINE atol.ret 8 - -%DEFINE dijkstra.STACK_INIT 48 -%DEFINE dijkstra.distance 8 -%DEFINE dijkstra.current 16 -%DEFINE dijkstra.heap 24 -%DEFINE dijkstra.SRC 32 -%DEFINE dijkstra.DST 40 -%DEFINE dijkstra.lazyArray 48 - -%DEFINE parse_vertices.STACK_INIT 16 -%DEFINE parse_vertices.Argv1 8 -%DEFINE parse_vertices.strlen 16 - -section .rodata -minheap_vTable: - dq minheap@right - dq minheap@left - dq minheap@swap - dq minheap@parent - dq minheap@min - dq minheap@insert ; These three will be the most complex to implement. - dq minheap@delete ; These three will be the most complex to implement. - dq minheap@heapify ; These three will be the most complex to implement. - dq minheap@construct - dq minheap@isEmpty -%DEFINE VT_MINHEAP_RIGHT equ 0*8 -%DEFINE VT_MINHEAP_LEFT equ 1*8 -%DEFINE VT_MINHEAP_SWAP equ 2*8 -%DEFINE VT_MINHEAP_PARENT equ 3*8 -%DEFINE VT_MINHEAP_MIN equ 4*8 -%DEFINE VT_MINHEAP_INSERT equ 5*8 -%DEFINE VT_MINHEAP_DELETE equ 6*8 -%DEFINE VT_MINHEAP_HEAPIFY equ 7*8 -%DEFINE VT_MINHEAP_CONSTRUCT equ 8*8 -%DEFINE VT_MINHEAP_ISEMPTY equ 9*8 - -invalid: - .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' - .len equ $- .msg - - -section .data - -src_dst: - .src dq 0 - .dst dq 0 -struc minheap: - ;Minheap will be used to implement priority queue. - .vTable resq 1 - .ptr resq 1 - .vertPtr resq 1 - .size resd 1 - .max_size resd 1 -endstruc - -vertice_array: - .ptr dq 0 - .size dq 0 - .edges dq 0 - .dists dq 0 - -num_edges dq 0 -commas dq 0 -section .bss - -section .text -;Minheap code area (This will be a nightmare). -; ---------------------------------------------------------------------------- -; Function: Right, left, parent vertex. -; Description: -; Grabs the index of the right, left, or parent index, based on the given index in RDI. -; Parameters: -; RDI - (long) Index. -; RSI - () Unused. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) Right/left/parent index. -; --------------------------------------------------------------------------- -minheap@right: - MOV RAX, RDI - SHL RAX, 1 - ADD RAX, 2 - RET -minheap@left: - MOV RAX, RDI - SHL RAX, 1 - ADD RAX, 1 - RET -minheap@parent: - MOV RAX, RDI - SUB RAX, 1 - SHR RAX, 1 - RET -minheap@swap: -; ---------------------------------------------------------------------------- -; Function: Minheap minimum element (root). -; Description: -; Constructs the minheap. -; Parameters: -; RDI - (Minheap*) This. -; RSI - (long) Index one. -; RDX - (long) Index two. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - () None; RAX clobbered. -; --------------------------------------------------------------------------- - ;Swap Distances - MOV RAX, [RDI + minheap.vertPtr + RSI*8] - MOV R10, [RDI + minheap.vertPtr + RDX*8] - MOV [RDI + minheap.vertPtr + RDX*8], RAX - MOV [RDI + minheap.vertPtr + RSI*8], R10 - ;Swap vertices - MOV RAX, [RDI + minheap.vertPtr + RSI*8] - MOV R10, [RDI + minheap.ptr + RDX*8] - MOV [RDI + minheap.vertPtr + RDX*8], RAX - MOV [RDI + minheap.vertPtr + RSI*8], R10 - RET - -minheap@min: -; ---------------------------------------------------------------------------- -; Function: Minheap minimum element (root). (poll). -; Description: -; Gets minimum element of minheap and removes (poll), then returns minimum element. -; Parameters: -; RDI - (Minheap*) Ptr to minheap to pull from [0] of the array pointer. This ptr. -; RSI - () Unused. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) Minimum element (root) of the minheap tree. -; --------------------------------------------------------------------------- - MOV RAX, [RDI + minheap.vertPtr] - MOV RAX, [RAX] ;Load address in .vertPtr - MOV RAX, [RAX] ;Load [0] in ptr - PUSH RAX - MOV RSI, RAX - MOV RAX, [RDI + minheap.vTable] - CALL [RAX + VT_MINHEAP_DELETE] - POP RAX - RET -minheap@construct: -; ---------------------------------------------------------------------------- -; Function: Minheap constructor -; Description: -; Constructs the minheap. -; Parameters: -; RDI - (long) Maximum capacity of the inner array of the Minheap (allocated as RDI*8). -; RSI - () Unused. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (Minheap*) Ptr to new Minheap object. -; --------------------------------------------------------------------------- - PUSH RBP - MOV RBP, RSP - PUSH RDI - - MOV RAX, SYS_MMAP - MOV RDI, 0 - MOV RSI, minheap_size - MOV RDX, PROT_READ | PROT|WRITE - MOV R10, MAP_SHARED | MAP_ANONYMOUS - MOV R8, -1 - MOV R9, 0 - SYSCALL - - POP RDI - - PUSH RAX - LEA RSI, minheap_vTable - MOV [RAX + minheap.vTable], RSI - ;Allocate an array for the minheap elements. - MOV RAX, SYS_MMAP - MOV RSI, RDI - MOV RDI, 0 - SHL RSI, SHIFT_X8 ;RSI * 8 bytes - MOV RDX, PROT_READ | PROT_WRITE - MOV R10, MAP_SHARED | MAP_ANONYMOUS - MOV R8, -1 - MOV R9, 0 - SYSCALL - - POP RDI - MOV [RDI + minheap.ptr], RAX - PUSH RAX - ;Allocate an array for the minheap elements. - MOV RAX, SYS_MMAP - MOV RSI, RDI - SHL RSI, SHIFT_X8 ;RDI * 8 bytes - MOV RDX, PROT_READ | PROT_WRITE - MOV R10, MAP_SHARED | MAP_ANONYMOUS - MOV R8, -1 - MOV R9, 0 - SYSCALL - POP RDI - MOV [RDI + minheap.vertPtr], RAX - MOV RAX, RDI ;MOV the minheap ptr back into RAX - MOV RSP, RBP - POP RBP - RET - -minheap@insert: -; ---------------------------------------------------------------------------- -; Function: Minheap insert. -; Description: -; Inserts value into min heap. -; Parameters: -; RDI - (Minheap*) This. -; RSI - (long) Value to insert. -; RDX - (long) Corresponding vertex value. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - () None. -; Clobbers - RBX, R11, R12, R13, R14, R15 -; --------------------------------------------------------------------------- - PUSH RBP - MOV RBP, RSP - SUB RSP, minheap@insert.STACK_INIT - MOV [RBP - minheap@insert.This], RDI - MOV [RBP - minheap@insert.index], 0 - MOV [RBP - minheap@insert.operatedIndex], 0 - MOV R8, [RDI + minheap.size] - MOV RAX, [RDI + minheap.ptr] - MOV [RAX + R8*8], RSI - MOV RAX, [RDI + minheap.vertPtr] - MOV [RAX + R8*8], RDX - MOV [RBP - minheap@insert.index], R8 - .loop: - ;This whole code here is pretty gross. This is just for while loop conditionals. - MOV R10, RDX - DEC R10 - SHR R10, 1 - MOV [RBP - minheap@insert.operatedIndex], R10 - MOV R15, 1 ; Final condition - MOV R11, [RBP - minheap@insert.This] - MOV R12, [RBP - minheap@insert.operatedIndex] - MOV R11, [RBP - minheap.ptr] - MOV R12, [R11 - R12*8] - MOV R13, [RBP - minheap@insert.index] - MOV R13, [R11 - R13*8] - MOV R14, [R11 - MOV R11, 0 - CMP R12, R13 - SETA R11B - AND R15,R11 - MOV R12, [RBP - minheap@insert.index] - MOV R11, 0 - CMP R12, R11 - SETA R11B - AND R15, R11 - CMP R15, 0 - JNA .loop_end - - ;Non-conditional code in the while loop: - MOV RDI, [RBP - minheap@insert.This] - MOV RSI, [RBP - minheap@insert.index] - MOV RDX, [RBP - minheap@insert.operatedIndex] - MOV RBX, [RDI + minheap@insert] - CALL [RBX + VT_MINHEAP_SWAP] - MOV R11, [RBP - minheap@insert.index] - DEC R11 - SHR R11, 1 - MOV R11, [RBP - minheap@insert.index] - JMP .loop - - .loop_end: - - ADD RSP, minheap@insert.STACK_INIT - MOV RSP, RBP - POP RBP - RET - -minheap@delete: -; ---------------------------------------------------------------------------- -; Function: Minheap delete -; Description: -; Deletes a vertex from the minheap. Eek. RDI will hold the pointer for most of the function as I don't wish to juggle a pointer. -; Parameters: -; RDI - (Minheap*) This. -; RSI - (long) Value to delete. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - () None. -; Clobbers - RBX, RCX, R11, R12, R13, R14, R15. -; ---------------------------------------------------------------------------- - PUSH RBP - MOV RBP, RSP - SUB RSP, minheap@delete.STACK_INIT - MOV [RBP - minheap@delete.This], RDI - MOV [RBP - minheap@delete.index], 0 - - MOV RAX, -1 ;Index - MOV RDX, [RDI] - MOV RDX, [RDX + minheap.size] - MOV RCX, 0 ;Loop ctr - .for_loop: - MOV R10, [RDI + minheap.vertPtr] - MOV R10, [R10 + RCX*8] - INC RCX - JNE R10, RSI - JB .for_loop - CMP RCX, RDX - JB .for_loop - MOV RAX, RCX - CMP RAX, -1 - JE .end - MOV [RBP - minheap@delete.index], RAX ; Save Index - - MOV RAX, [RDI + minheap.vertPtr] - MOV RDX, RSI ;MOV index from RSI into RDX - MOV R10, [RDI + minheap.size] - DEC R10 - MOV R10, [RDI + R10*8] ; Get last element. - MOV QWORD [RAX + RDX], R10 - MOV RAX, [RDI + minheap.ptr] - MOV RDX, RSI ;MOV index from RSI into RDX - MOV R10, [RDI + minheap.size] - DEC R10 - MOV R10, [RDI + R10*8] ; Get last element. - MOV QWORD [RAX + RDX], R10 - MOV R15, [RDI + minheap.size] - MOV R14, [RBP - minheap@delete.index] - ;Heapify - .heapify: - ; R10 = Conditional, R11 = Smallest, R12 = Left Child, R13 = Right Child, R14 = Index, R15 = Minheap size. - CALL VT_MINHEAP_LEFT - MOV R12, RAX - CALL VT_MINHEAP_RIGHT - MOV R13, RAX - SHL R12, SHIFT_X2 - ADD R12, 1 - SHL R13, SHIFT_X2 - ADD R13, 2 - MOV R11, R14 - - initilizeRBXRCXMinheap - MOV RBX, [RBX + R12*8] - MOV RCX, [RCX + R11*8] - CMP R12, R15 - JA .end - CMP RBX, RCX - JA .end - MOV R11, R12 - initilizeRBXRCXMinheap - MOV RBX, [RBX + R13*8] - MOV RCX, [RCX + R11*8] - CMP R13, R15 - JA .end - CMP RBX, RCX - JA .end - MOV R11, R13 - CMP R11, R14 - JNE .end - MOV RSI, R14 - MOV RDX, R11 - MOV RDI, [RBP - minheap@delete.This] - MOV R8, [RBP - minheap@delete.This] - MOV R8, [R8 + minheap.vTable] - CALL [R8+VT_MINHEAP_SWAP] - MOV R14, R11 - MOV [RBP - minheap@delete.index], R14 - .end: - ADD RSP, minheap@delete.STACK_INIT - MOV RSP, RBP - POP RBP - RET - -minheap@isEmpty: -; ---------------------------------------------------------------------------- -; Function: Minheap empty checker -; Description: -; Checks if the minheap is empty. -; Parameters: -; RDI - (Minheap*) This. -; RSI - () Unused. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (bool) True/false. -; Clobbers - None. -; ---------------------------------------------------------------------------- - MOV RAX, [RDI + minheap.size] - CMP RAX, 0 - SETA RAX - RET - - -minheap@heapify: - - - -ezsqrt: -; ---------------------------------------------------------------------------- -; Function: Easy Square Root -; Description: -; Checks if number is perfect square, and also moves the sqrt to a specified pointer. -; Parameters: -; RDI - (long) Input value to sqrt. -; RSI - (long*) Location to move sqrt to. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) -1 (Input not square). -; Clobbers - RCX -; --------------------------------------------------------------------------- - PUSH RBP - MOV RBP, RSP - - MOV RDX, -1 - MOV RCX, 1 - .sqrt_loop: - MOV RAX, RCX - MUL RCX - CMP RAX, RDI - INC RCX - CMOVA RAX, RDX - JB .sqrt_loop - - MOV [RSI], RCX - - MOV RSP, RBP - POP RBP - RET - - -atol: -; ---------------------------------------------------------------------------- -; Function: atol (ascii to long) -; Description: -; Converts ascii string to long value (64 bits). -; Parameters: -; RDI - (char*) Pointer to string to convert to integer. -; RSI - (long) Strlen. -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) Long value of string. -; --------------------------------------------------------------------------- - - PUSH RBP - MOV RBP, RSP - SUB RSP, atol.STACK_INIT - MOV QWORD [RBP - atol.ret] - - MOV RBX, 10 ;Multiplier - MOV RCX, 0 - MOV R8B, BYTE [RDI+RCX] - .operation: - MOV RAX, QWORD [RBP - atol.ret] - MUL RBX - INC RCX - SUB R8B, '0' - ADD RAX, R8 - MOV QWORD [RBP - atol.ret], RAX - CMP RCX, RSI ;Compare counter to Strlen - JNE .operation - - MOV RAX, QWORD [RBP - atol.ret] - ADD RSP, atol.STACK_INIT - MOV RSP, RBP - POP RBP - RET - - - -global _start - -_start: - PUSH RBP - MOV RBP, RSP - SUB RSP, _start.STACK_INIT - MOV [RBP - _start.minheap], 0 - MOV [RBP - _start.ret], 0 - - MOV RAX, [RBP + _start.argc] - CMP RAX, 4 ;Program name + vertices + SRC + DST - MOV RDI, INVALID_ARGC - JNE error - - ;SRC Parse - MOV RDI, QWORD [RBP + _start.argv2] - LEA RSI, [src_dst.src] - CALL parse_SRC_DST - CMP RAX, -1 - MOV RDI, INVALID_SRC - JBE error - - ;DST Parse - MOV RDI, QWORD [RBP + _start.argv3] - LEA RSI, [src_dst.dst] - CALL parse_SRC_DST - CMP RAX, -1 - MOV RDI, INVALID_DST - JBE error - - ;Count commas - MOV RCX, 0 - MOV RSI, [RBP+_start.argv1] - MOV RSI, [RSI] - comma_loop: - MOV DL, [RSP+RCX*8] - INC RCX - .commaJMP: - ; --------------------------------------------------------------------------- - ; Valid bytes: ['0'-'9'], 0, ',' - ; --------------------------------------------------------------------------- - dq .zero - times 43 dq .error - dq .comma ; Handle comma - dq .neg ; Jump to error. - times 2 dq .error - times 10 dq .comma ; '0'-'9' - times 69 dq .error - .comma: - INC [commas] - JMP comma_loop - .error: - MOV RAX, INVALID_NUM_NEG - MOV RBX, INVALID_CHAR - CMP DL, '-' - CMOVE RDI, RAX - CMOVNE RDI, RBX - JMP _start.error - .zero: - CMP RCX, 0 - MOV RDI, INVALID_NUM_VERTS - JE error - INC [commas] ;To get the actual count, as there's one less comma than the amount of connections. - MOV RAX, [commas] - MOV [vertice_array.size], RAX - ;Continued from zero - ;Mapping memory for the array [vertex][distances]. - MOV RAX, SYS_MMAP - MOV RDI, 0 - MOV RSI, [vertice_array.size] - SHL RSI, SHIFT_X8 - MOV RDX, PROT_READ | PROT_WRITE - MOV R10, MAP_SHARED | MAP_ANONYMOUS - MOV R8, -1 - MOV R9, 0 - SYSCALL - MOV [vertice_array.ptr], RAX - ;Mapping memory for distances - MOV RAX, SYS_MMAP - MOV RSI, [vertice_array.num_vertices] - SHL RSI, SHIFT_X8 - MOV RDX, PROT_READ | PROT_WRITE - MOV R10, MAP_SHARED | MAP_ANONYMOUS - MOV R8, -1 - MOV R9, 0 - SYSCALL - MOV [vertice_array.dists], RAX - ;Check if input is square - MOV RDI, [vertice_array.size] - LEA RSI, [vertice_array.num_vertices] - CALL ezsqrt - CMP RAX, -1 - MOV RDI, INVALID_NOT_SQUARE - JE error - ;Check if SRC/DST > vertices - MOV RAX, [src_dst.src] - MOV RBX, [vertice_array.num_vertices] - CMP RAX, RBX - MOV RDI, INVALID_SRC - JA error - MOV RAX, [src_dst.dst] - CMP RAX, RBX - MOV RDI, INVALID_DST - JA error - - - MOV RDI, [vertice_array.num_vertices] - CALL VT_MINHEAP_CONSTRUCTOR - MOV [RBP+_start.minheap], RAX - - - MOV RAX, SYS_EXIT - MOV RDI, EXIT_OK - SYSCALL - -error: - ;Bad inputs JMP here. - MOV R15, RDI - - MOV RAX, SYS_WRITE - MOV RDI, STDOUT - MOV RSI, invalid.msg - MOV RDX, invalid.len - SYSCALL - - MOV RAX, SYS_EXIT - MOV RDI, R15 - SYSCALL - -parse_vertices: -; ---------------------------------------------------------------------------- -; Function: parse_vertices -; Description: -; Implemented through finite state machine. -; Parses through argv[1], numbers comma delimited. -; Parameters: -; RDI - (char**) Pointer to stack location of argv[1]. -; RSI - (long*) Pointer to vertice storage in .data -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) -1 for invalid input. -; --------------------------------------------------------------------------- - ;Previous States - %DEFINE Parse.STATE.START 000b - %DEFINE Parse.STATE.NUM 001b - %DEFINE Parse.STATE.COMMA 010b - %DEFINE Parse.STATE.SPACE 100b - - PUSH RBP - MOV RBP, RSP - SUB RSP, parse_vertices.STACK_INIT - MOV QWORD [RBP - parse_vertices.argv_loc], RDI - MOV QWORD [RBP - parse_vertices.vert_loc], RSI - MOV QWORD [RBP - parse_vertices.strlen], 0 - MOV QWORD [RBP - parse_vertices.vert_ptr], 0 - MOV QWORD [RBP - parse_vertices.num_ptr], RDI - MOV QWORD [RBP - parse_vertices.prevstate], RDI - - - MOV RAX, [RDI] - MOV AL, BYTE [RAX] ;Pull first piece of data in string - CMP RAX, EMPTY_INPUT - JE .error - - MOV RCX, 0 - .validate: - MOV DL, BYTE [RAX+RCX] - JMP [.jmpTable + RDX*8] - .jmpTable: - ; --------------------------------------------------------------------------- - ; Valid bytes: ['0'-'9'], 0, ',', ' ' - ; --------------------------------------------------------------------------- - dq .zero - times 31 dq .error - dq .space - times 11 .error - dq .comma - times 3 dq .error - times 10 dq .num - times 69 dq .error - - .num: - CMP [RBP - parse_vertices.prevstate], Parse.STATE.COMMA - JE .error - - INC [RBP - parse_vertices.strlen] - INC RCX - MOV [RBP - parse_vertices.prevstate], Parse.STATE.NUM - JMP .validate - .comma: - CMP [RBP - parse_vertices.prevstate], Parse.STATE.NUM - JNE .error - CMP [RBP - parse_vertices.prevstate], Parse.STATE.SPACE - JNE .error - - MOV RDI, [RBP - parse_vertices.num_ptr] - MOV RSI, [RBP - parse_vertices.strlen] - CALL atol - MOV RDI, [RBP - parse_vertices.vert_loc] - MOV RSI, [RBP - parse_vertices.vert_ptr] - MOV [RDI+RSI], RAX - ADD RSI, EIGHT_BYTES - MOV [RBP - parse_vertices.vert_ptr], RSI - MOV [RBP - parse_vertices.prevstate], Parse.STATE.COMMA - - MOV [RBP - parse_vertices.strlen], 0 - INC RCX - JMP.validate - .space: - CMP [RBP - parse_vertices.prevstate], Parse.STATE.NUM - JE .error - - INC RCX - MOV RDI, [RBP - parse_vertices.argv_loc] - LEA R11, [RDI+RCX] - MOV [RBP - parse_vertices.num_ptr], R11 - JMP .validate - .zero: - CMP [RBP - parse_vertices.prevstate], Parse.STATE.COMMA - JNE .error - CMP [RBP - parse_vertices.prevstate], Parse.STATE.SPACE - JNE .error - - CMP RCX, 0 - JE .error - JMP .cont - - .error: - MOV RAX, -1 - ADD RSP, parse_SRC_DST.STACK_INIT - MOV RSP, RBP - POP RBP - RET - .cont: - ADD RSP, parse_SRC_DST.STACK_INIT - MOV RSP, RBP - POP RBP - RET - - - -parse_SRC_DST: -; ---------------------------------------------------------------------------- -; Function: parse_SRC_DST -; Description: -; Separated from the vertice parser for organization/readability. -; Takes ptr to stack source and destination arguments, addressed through argv[2] and argv[3] respectively. -; Addressing argv[1] will cause an error. -; Parsed through a finite state machine. -; Parameters: -; RDI - (char**) Pointer to stack location of src/dst. -; RSI - (long*) Pointer to src/dst storage in .data -; RDX - () Unused. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) -1 for invalid input. -; --------------------------------------------------------------------------- - PUSH RBP, - MOV RBP, RSP - SUB RSP, parse_SRC_DST.STACK_INIT - MOV QWORD [RBP - parse_SRC_DST.argv_loc], RDI - MOV QWORD [RBP - parse_SRC_DST.strlen], 0 - MOV QWORD [RBP - parse_SRC_DST.atol], RSI ;src/dst ptr - ;Check if SRC/DST is empty or not. - MOV RAX, [RDI] - MOV AL, BYTE [RAX] ;Pull first piece of data in string - CMP RAX, EMPTY_INPUT - JE .error - - MOV RCX, 0 - .validate: - MOV DL, BYTE [RAX+RCX] - JMP [.jmpTable + RDX*8] - .jmpTable: - ; --------------------------------------------------------------------------- - ; Valid bytes: ['0'-'9'], 0 - ; --------------------------------------------------------------------------- - dq .zero - times 48 dq .error - times 10 dq .num - times 69 dq .error - .cont: - MOV RDI, QWORD [RBP - parse_SRC_DST.argv_loc] - MOV QWORD [RBP - parse_SRC_DST.strlen], RCX - MOV RSI, RCX - CALL atol - MOV RSI, QWORD [RBP - parse_SRC_DST.atol] - MOV [RSI], RAX - - ADD RSP, parse_SRC_DST.STACK_INIT - MOV RSP, RBP - POP RBP - RET - - .zero: - CMP RCX, 0 - JE .error ;We really shouldn't have empty inputs or reach this state at RCX == 0 at all. - JNE .cont - .num: - INC RCX - JMP .validate - - .error: - MOV RAX, -1 - ADD RSP, parse_SRC_DST.STACK_INIT - MOV RSP, RBP - POP RBP - RET - -dijkstra: -; ---------------------------------------------------------------------------- -; Function: dijkstra -; Description: -; Utilizes Dijkstra's algorithm to find the shortest path to a vertex. -; Uses a lazy array in the algorithm due to the absence of a decrease_priority method. -; Parameters: -; RDI - (Minheap*) Ptr to minheap. -; RSI - (long) SRC. -; RDX - (long) DST. -; R10 - () Unused. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) Distance. -; Clobbers - R11, R12 -; --------------------------------------------------------------------------- - PUSH RBP, - MOV RBP, RSP - SUB RBP, dijkstra.STACK_INIT - MOV [RBP - dijkstra.distance], -1 ; If -1, then return an error. - MOV [RBP - dijkstra.current], -1 ; Placeholder. Use current to access get neighbors. - MOV [RBP - dijkstra.heap], RDI - MOV [RBP - dijkstra.SRC], RSI - MOV [RBP - dijkstra.DST], RDX - ;Initialize distance array - MOV RAX, SYS_MMAP - MOV RDI, 0 - MOV RSI, [vertice_array.size] - MOV RDX PROT_READ | PROT_WRITE - MOV R10 MAP_ANONYMOUS | MAP_SHARED - MOV R8, -1 - MOV R9, 0 - SYSCALL - MOV [vertice_array.dists], RAX - MOV RCX, 0 - .dist_loop: - MOV RBX, [vertice_array.dists] - MOV [RBX+RCX*8], INT_MAX - CMP [vertice_array.size], RCX - JB .dist_loop - MOV RCX, [RBP - dijkstra.SRC] - MOV [RBX+RCX*8], 0 - ;Moving virtual table addresss into R11. I want to keep this in a dedicated register so I'm not re-pulling it in whenever I need it. - MOV R11, [RBP - dijkstra.heap] - MOV R11, [R11 + minheap.vTable] - MOV R11, [R11] - - MOV RDI, [RBP - dijkstra.heap] - MOV RSI, 0 ; Hardcoded, zero distance from source vertex. - MOV RDX, [RBP - dijkstra.SRC] - CALL [R11 + VT_MINHEAP_INSERT] - - ;Get neighbors - MOV RCX, 0 - .main_loop: - CALL [R11 + VT_MINHEAP_MIN] - MOV [RBP - dijkstra.current], RAX - - - - .return: - ADD RSP, dijkstra.STACK_INIT - MOV RSP, RBP - POP RBP - RET - -;get_Neighbors: This MIGHT not be needed -; ---------------------------------------------------------------------------- -; Function: Get Neighbors -; Description: -; Finds the neighbors of a given vertice and then adds them to the queue. -; I don't think a stack frame is needed here. -; Parameters: -; RDI - (Minheap*) Ptr to minheap. -; RSI - (long[]*) dists. -; RDX - (long) SRC vertex. -; R10 - (long) # of neighbors. -; R8 - () Unused. -; R9 - () Unused. -; Returns: -; RAX - (long) Distance. -; Clobbers - RCX -; --------------------------------------------------------------------------- -;MOV RAX, RDX -;MOV RBX, [vertice_array.size] -;MOV RDX, [vertice_array.dists] -;MOV R8, [vertice_array.ptr] -;ADD RDX, RAX -;MOV RCX, 0 -;MOV R11, [minheap.vtable] ;I want to hold the vtable in a register I won't write to often as I'm not looking to juggle this pointer. - .neighbor_loop: - - - - - - - - - - - - From 352f24945e07c0a1ab00131e1a1e2b4f2432f6a4 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 06:59:11 -0700 Subject: [PATCH 37/87] Working on initial structure. None of what happened last time will happen again, that was ridiculous. --- archive/x/x86-64/dijkstra.asm | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e69de29bb..12a90075a 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -0,0 +1,44 @@ +section .rodata + +section .data + +struc priority_queue: + .virtualTable + .nodes + .nodePriorities + .size + .maxSize +endstruc + +struc VT_priority_queue: + .insert resq 1 + .min resq 1 + .isEmpty resq 1 + .pop resq 1 + .decreasePriority resq 1 +endstruc + +section .bss + +section .text + +global _start + +_start: + + +dijkstra: + + +priority_queue@insert: + +priority_queue@min: + +priority_queue@isEmpty: + +priority_queue@pop: + +priority_queue@decreasePriority: + + + From 7438cc825b9955d6f5c5d20757e75ddf2e9a9c02 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 17:02:39 -0700 Subject: [PATCH 38/87] Finished getting the functions down I wanted. Next time I should really put down all of the functions/methods associated with the data structures I'll be using. Not having everything down ahead of time caused a lot of confusion. --- archive/x/x86-64/dijkstra.asm | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 12a90075a..e1bc4be33 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -3,11 +3,11 @@ section .rodata section .data struc priority_queue: - .virtualTable - .nodes - .nodePriorities - .size - .maxSize + .virtualTable resq 1 + .nodes resq 1 + .nodePriorities resq 1 + .size resq 1 + .maxSize resq 1 endstruc struc VT_priority_queue: @@ -27,6 +27,10 @@ global _start _start: +parseSRCDST: + +parseVertices: + dijkstra: @@ -40,5 +44,9 @@ priority_queue@pop: priority_queue@decreasePriority: +ezsqrt: + +atoi: + From 564ec2ce0af6148ecbc8445e8c6ad527729fe591 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 12 Oct 2025 17:12:01 -0700 Subject: [PATCH 39/87] Took and reworked some of the functions from the original (ezsqrt, atol -> atoi). --- archive/x/x86-64/dijkstra.asm | 84 ++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e1bc4be33..9e89b0350 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,16 @@ +%DEFINE atol.STACK_INIT 8 +%DEFINE atol.ret 8 + + + + + + + + + + + section .rodata section .data @@ -45,8 +58,77 @@ priority_queue@pop: priority_queue@decreasePriority: ezsqrt: +; ---------------------------------------------------------------------------- +; Function: Easy Square Root +; Description: +; Checks if number is perfect square; returns square root into RAX. +; Parameters: +; RDI - (long) Input value to sqrt. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) RAX == -1 (Input not square); RAX > 0 (Input IS perfect square). +; Clobbers - RCX +; --------------------------------------------------------------------------- + PUSH RBP + MOV RBP, RSP + + MOV RDX, -1 + MOV RCX, 1 + .sqrt_loop: + MOV RAX, RCX + MUL RCX + CMP RAX, RDI + INC RCX + CMOVA RAX, RDX + JB .sqrt_loop + MOV RAX, RCX + + MOV RSP, RBP + POP RBP + RET atoi: - +; ---------------------------------------------------------------------------- +; Function: atoi +; Description: +; Converts ascii string to integer. +; Parameters: +; RDI - (char*) Pointer to string to convert to integer. +; RSI - (long) Strlen. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; EAX - (int) Integer value of string. +; --------------------------------------------------------------------------- + + PUSH RBP + MOV RBP, RSP + SUB RSP, atoi.STACK_INIT + MOV QWORD [RBP - atoi.ret] + + MOV RBX, 10 ;Multiplier + MOV RCX, 0 + MOV R8B, BYTE [RDI+RCX] + .operation: + MOV RAX, QWORD [RBP - atoi.ret] + MUL RBX + INC RCX + SUB R8B, '0' + ADD RAX, R8 + MOV QWORD [RBP - atoi.ret], RAX + CMP RCX, RSI ;Compare counter to Strlen + JNE .operation + + MOV RAX, QWORD [RBP - atoi.ret] + ADD RSP, atoi.STACK_INIT + MOV RSP, RBP + POP RBP + RET From b396892b02614b1b61f978302edae50ca9ad3399 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 24 Oct 2025 07:56:49 -0700 Subject: [PATCH 40/87] Finally getting back to this AGAIN after being super busy. This should be the proper set of methods and structures to build the program going forward. --- archive/x/x86-64/dijkstra.asm | 67 ++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9e89b0350..ca3557f99 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -15,20 +15,36 @@ section .rodata section .data -struc priority_queue: - .virtualTable resq 1 - .nodes resq 1 - .nodePriorities resq 1 +struc min_heap: + .VT + .size resq 1 - .maxSize resq 1 + .array resq 1 +endstruc + +struc VT_min_heap: + endstruc +struc priority_queue: + .VT resq 1 + + .size resq 1 + .heap resq 1 + +endstruc + struc VT_priority_queue: - .insert resq 1 - .min resq 1 - .isEmpty resq 1 + .construct resq 1 + .destruct resq 1 + + .push resq 1 .pop resq 1 - .decreasePriority resq 1 + .peek resq 1 + .heapify resq 1 + .isEmpty resq 1 + .size resq 1 + .decreaseKey resq 1 endstruc section .bss @@ -47,15 +63,40 @@ parseVertices: dijkstra: -priority_queue@insert: +priority_queue@push: -priority_queue@min: +priority_queue@pop: + +priority_queue@peek: + +priority_queue@heapify: priority_queue@isEmpty: -priority_queue@pop: +priority_queue@size: + +priority_queue@decreaseKey: + +priority_queue@construct: + +priority_queue@destruct: + + +minheap@siftUp: + +minheap@siftDown: + +minheap@swap: + +minheap@parent: + +minheap@left: + +minheap@right: + +minheap@construct: -priority_queue@decreasePriority: +minheap@destruct: ezsqrt: ; ---------------------------------------------------------------------------- From 3aae1119e007d340d21da697474e448f0f9cac83 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 24 Oct 2025 07:59:27 -0700 Subject: [PATCH 41/87] Forgot to add the VT methods for minheap. --- archive/x/x86-64/dijkstra.asm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index ca3557f99..9b5019380 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -23,7 +23,15 @@ struc min_heap: endstruc struc VT_min_heap: + .construct resq 1 + .destruct resq 1 + .siftUp resq 1 + .siftDown resq 1 + .swap resq 1 + .parent resq 1 + .left resq 1 + .right resq 1 endstruc struc priority_queue: From aa2bdf60787bfcb3b7699f47e8310599b041052f Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Oct 2025 18:22:46 -0700 Subject: [PATCH 42/87] Added minheap@swap; getting methods done for structure, then I can work on the nitty gritty. --- archive/x/x86-64/dijkstra.asm | 91 +++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9b5019380..9715ae87f 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,10 @@ +; CONSTANTS +%DEFINE MUL_2 1 +%DEFINE DIV_2 1 +%DEFINE SIZE_INT 4 + + + %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 @@ -16,7 +23,7 @@ section .rodata section .data struc min_heap: - .VT + .VT resq 1 .size resq 1 .array resq 1 @@ -39,7 +46,6 @@ struc priority_queue: .size resq 1 .heap resq 1 - endstruc struc VT_priority_queue: @@ -95,13 +101,88 @@ minheap@siftUp: minheap@siftDown: minheap@swap: +; ---------------------------------------------------------------------------- +; Function: minheap swap +; Description: +; Swaps elements between given two indices. +; Parameters: +; RDI - (Minheap*) This* minheap. +; ESI - (int) Index one. +; EDX - (int) Index two. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Parent index. +; Clobbers - None. +; --------------------------------------------------------------------------- +MOV R10, DWORD [RDI+ESI*SIZE_INT] ;TMP +MOV R8, DWORD [RDI+EDX*SIZE_INT] ;TMP2 +MOV [RDI+ESI*SIZE_INT], R8D +MOV [RDI+EDX*SIZE_INT], R10D +RET -minheap@parent: +minheap@parent: +; ---------------------------------------------------------------------------- +; Function: minheap parent +; Description: +; Grabs parent element index relative to given index. +; Parameters: +; EDI - (int) Index. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Parent index. +; Clobbers - None. +; --------------------------------------------------------------------------- +MOV RAX, EDI +DEC RAX +SHR RAX, DIV_2 +RET minheap@left: - +; ---------------------------------------------------------------------------- +; Function: minheap left +; Description: +; Grabs left element index relative to given index. +; Parameters: +; EDI - (int) Index. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Left element index. +; Clobbers - None. +; --------------------------------------------------------------------------- +MOV RAX, EDI +SHL RAX, MUL_2 +INC RAX +RET minheap@right: - +; ---------------------------------------------------------------------------- +; Function: minheap left +; Description: +; Grabs right element index relative to given index. +; Parameters: +; EDI - (minheap) Index. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Right element index. +; Clobbers - None. +; --------------------------------------------------------------------------- +MOV RAX, EDI +SHL RAX, MUL_2 +ADD RAX, 2 +RET minheap@construct: minheap@destruct: From fee5f2284ccd7bb6ce910b7f0a0cb017d6ef7086 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Oct 2025 22:58:49 -0700 Subject: [PATCH 43/87] Finished minheap@shiftDown. This WILL need to be debugged when ran eventually. --- archive/x/x86-64/dijkstra.asm | 105 +++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 8 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9715ae87f..9f258f98f 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -8,6 +8,17 @@ %DEFINE atol.STACK_INIT 8 %DEFINE atol.ret 8 +%DEFINE minheap@siftDown.STACK_INIT 40 +%DEFINE minheap@siftDown.minheap_len 8 +%DEFINE minheap@siftDown.index 16 +%DEFINE minheap@siftDown.left 24 +%DEFINE minheap@siftDown.right 32 +%DEFINE minheap@siftDown.conditional_BOOLs 40 +%DEFINE minheap@siftDown.conditional_BOOLs-1 36 +%DEFINE minheap@siftDown.conditional_BOOLs-2 40 +%DEFINE minheap@siftDown.conditional_BOOLs-ACCEPT (0x1 + 0x1<<32) + + @@ -25,7 +36,7 @@ section .data struc min_heap: .VT resq 1 - .size resq 1 + .len resq 1 .array resq 1 endstruc @@ -99,7 +110,81 @@ priority_queue@destruct: minheap@siftUp: minheap@siftDown: - +; ---------------------------------------------------------------------------- +; Function: minheap swap +; Description: +; Swaps elements between given two indices. +; Parameters: +; RDI - (Minheap*) This* minheap. Will not juggle this; stays in callee-saved register. +; ESI - (int) Index. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (long) Parent index. +; Clobbers - RAX, RDI, RCX, RDX, R9. +; --------------------------------------------------------------------------- +PUSH RBP +MOV RBP, RSP +SUB RSP, minheap@siftDown.STACK_INIT +PUSH RBX ; Minheap* +PUSH R11 +PUSH R12 + +MOV RBX, RDI +MOV RDI, [RBX + min_heap.len] +MOV [RBP - minheap@siftDown.minheap_len], RDI +MOV [RBP - minheap@siftDown.index], RSI + + .sift: + MOV RDI, [RBP - minheap@siftDown.index] + CALL minheap@left + CMP RAX, [RBP - minheap@siftDown.minheap_len] + JA .sift_exit + + CALL minheap@left + MOV RCX, RAX ; Left + MOV [RBP - minheap@siftDown.left], RAX + CALL minheap@right + MOV RDX, RAX ; Right + MOV [RBP - minheap@siftDown.right], RAX + MOV R9, RCX + CMP RDX, [RBP - minheap@siftDown.minheap_len] + SETB [RBP - minheap@siftDown.conditional_BOOLs-1] + MOV RAX, [RBX + minheap.array] + MOV RCX, [RAX + RCX*SIZE_INT] + MOV RDX, [RAX + RCX*SIZE_INT] + CMP RDX, RCX + SETB [RBP - minheap@siftDown.conditional_BOOLs-2] + CMP [RBP - minheap@siftDown.conditional_BOOLs-1], minheap@siftDown.conditional_BOOLs-ACCEPT + CMOVB R9, [RBP - minheap@siftDown.right] + + MOV RAX, [RBX + minheap.array] + MOV R11, R9 + MOV R11, [RAX + R11*SIZE_INT] + MOV R12, [RBP - minheap@siftDown.index] + MOV R12, [RAX + R12*SIZE_INT] + CMP R11, R12 + JAE .sift_exit + MOV RDI, RBX + MOV RSI, [RBP - minheap@siftDown.index] + MOV RDX, R9 + CALL minheap@swap + MOV [RBX - minheap@siftDown.index], R9 + + JMP .sift + +.sift_exit: +POP R12 +POP R11 +POP RBX +ADD RSP, minheap@siftDown.STACK_INIT +MOV RSP, RBP +POP RBP +RET + + minheap@swap: ; ---------------------------------------------------------------------------- ; Function: minheap swap @@ -113,9 +198,10 @@ minheap@swap: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (long) Parent index. -; Clobbers - None. +; RAX - () None. +; Clobbers - R8, R10 ; --------------------------------------------------------------------------- +MOV RDI, [RDI + minheap.array] MOV R10, DWORD [RDI+ESI*SIZE_INT] ;TMP MOV R8, DWORD [RDI+EDX*SIZE_INT] ;TMP2 MOV [RDI+ESI*SIZE_INT], R8D @@ -137,7 +223,7 @@ minheap@parent: ; R9 - () Unused. ; Returns: ; RAX - (long) Parent index. -; Clobbers - None. +; Clobbers - RAX ; --------------------------------------------------------------------------- MOV RAX, EDI DEC RAX @@ -157,7 +243,7 @@ minheap@left: ; R9 - () Unused. ; Returns: ; RAX - (long) Left element index. -; Clobbers - None. +; Clobbers - RAX ; --------------------------------------------------------------------------- MOV RAX, EDI SHL RAX, MUL_2 @@ -177,7 +263,7 @@ minheap@right: ; R9 - () Unused. ; Returns: ; RAX - (long) Right element index. -; Clobbers - None. +; Clobbers - RAX ; --------------------------------------------------------------------------- MOV RAX, EDI SHL RAX, MUL_2 @@ -201,7 +287,7 @@ ezsqrt: ; R9 - () Unused. ; Returns: ; RAX - (long) RAX == -1 (Input not square); RAX > 0 (Input IS perfect square). -; Clobbers - RCX +; Clobbers - RAX, RCX, RDX ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -235,11 +321,13 @@ atoi: ; R9 - () Unused. ; Returns: ; EAX - (int) Integer value of string. +; Clobbers - RCX, R8 ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, atoi.STACK_INIT + PUSH RBX MOV QWORD [RBP - atoi.ret] MOV RBX, 10 ;Multiplier @@ -256,6 +344,7 @@ atoi: JNE .operation MOV RAX, QWORD [RBP - atoi.ret] + POP RBX ADD RSP, atoi.STACK_INIT MOV RSP, RBP POP RBP From b1542febd806376cfd5eb062e6a5e4b1bc22b26a Mon Sep 17 00:00:00 2001 From: = Date: Fri, 31 Oct 2025 23:54:58 -0700 Subject: [PATCH 44/87] Fixed some of the function descs, finished minheap@siftUp, tweaked logic of minheap@siftDown a bit (removed redundant call inside function). --- archive/x/x86-64/dijkstra.asm | 66 ++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9f258f98f..84b975571 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -18,6 +18,10 @@ %DEFINE minheap@siftDown.conditional_BOOLs-2 40 %DEFINE minheap@siftDown.conditional_BOOLs-ACCEPT (0x1 + 0x1<<32) +%DEFINE minheap@siftUp.STACK_INIT 16 +%DEFINE minheap@siftUp.index 8 +%DEFINE minheap@siftUp.parent 16 + @@ -108,12 +112,57 @@ priority_queue@destruct: minheap@siftUp: - +; ---------------------------------------------------------------------------- +; Function: minheap swap +; Description: +; Restores min-heap by moving new element upward. +; Parameters: +; RDI - (Minheap*) This* minheap. Will not juggle this; stays in callee-saved register. +; ESI - (int) Index. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - RDI, RSI, RDX, R10, R8. +; --------------------------------------------------------------------------- +PUSH RBP +MOV RBP, RSP +SUB RSP, minheap@siftUp.STACK_INIT +PUSH RBX +MOV RBX, RDI +MOV [RBP - minheap@siftUp.index], RSI + .sift: + CMP [RBP - minheap@siftUp.index], 0 + JBE .sift_end + MOV RDI, [RBP - minheap@siftUp.index] + CALL minheap@parent + MOV RDX, [RBP - minheap@siftUp.index] + MOV R10, RAX + MOV R8, RBX + MOV R8, [R8 + minheap.array] + MOV RDX, [R8 + RDX*SIZE_INT] + MOV R10, [R8 + RDX*SIZE_INT] + CMP RDX, R10 + JAE .sift_end + MOV RDI, RBX + MOV RSI, [RBP - minheap@siftUp.index] + MOV RDX, RAX + CALL minheap@swap + MOV [RBP - minheap@siftUp.index], RAX + JMP .sift +.sift_end: +POP RBX +ADD RSP, minheap@siftUp.STACK_INIT +MOV RSP, RBP +POP RBP +RET minheap@siftDown: ; ---------------------------------------------------------------------------- ; Function: minheap swap ; Description: -; Swaps elements between given two indices. +; Restores min-heap by moving root downward. ; Parameters: ; RDI - (Minheap*) This* minheap. Will not juggle this; stays in callee-saved register. ; ESI - (int) Index. @@ -122,8 +171,8 @@ minheap@siftDown: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (long) Parent index. -; Clobbers - RAX, RDI, RCX, RDX, R9. +; RAX - () None. +; Clobbers - RAX, RDI, RSI, RCX, RDX, R9. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -140,10 +189,11 @@ MOV [RBP - minheap@siftDown.index], RSI .sift: MOV RDI, [RBP - minheap@siftDown.index] CALL minheap@left + PUSH RAX CMP RAX, [RBP - minheap@siftDown.minheap_len] JA .sift_exit - CALL minheap@left + POP RAX MOV RCX, RAX ; Left MOV [RBP - minheap@siftDown.left], RAX CALL minheap@right @@ -199,7 +249,7 @@ minheap@swap: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - R8, R10 +; Clobbers - RDI, R8, R10 ; --------------------------------------------------------------------------- MOV RDI, [RDI + minheap.array] MOV R10, DWORD [RDI+ESI*SIZE_INT] ;TMP @@ -287,7 +337,7 @@ ezsqrt: ; R9 - () Unused. ; Returns: ; RAX - (long) RAX == -1 (Input not square); RAX > 0 (Input IS perfect square). -; Clobbers - RAX, RCX, RDX +; Clobbers - RAX, RDI, RCX, RDX ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -321,7 +371,7 @@ atoi: ; R9 - () Unused. ; Returns: ; EAX - (int) Integer value of string. -; Clobbers - RCX, R8 +; Clobbers - RAX, RDI, RSI, RCX, R8. ; --------------------------------------------------------------------------- PUSH RBP From b43a1826ad99b959a60c6909e860fd70b00dfb13 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 00:50:04 -0700 Subject: [PATCH 45/87] Good abstraction saved the day. Forgot to implement the tuple like usual, and was saved from needing to rewrite the entire program from my abstraction. Changed minheap@swap signature to have int[] array, added parallel elements (node "name") array, did same minheap@swap call but on that new array for every time it's called. Code will look a bit messier though. --- archive/x/x86-64/dijkstra.asm | 69 ++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 84b975571..62f71619c 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -38,44 +38,19 @@ section .rodata section .data struc min_heap: - .VT resq 1 - .len resq 1 .array resq 1 + .elements resq 1 endstruc -struc VT_min_heap: - .construct resq 1 - .destruct resq 1 - - .siftUp resq 1 - .siftDown resq 1 - .swap resq 1 - .parent resq 1 - .left resq 1 - .right resq 1 -endstruc +; I want this priority queue as it acts as a great container for the minheap +; and allows for easy abstraction of minheap methods. struc priority_queue: - .VT resq 1 - .size resq 1 .heap resq 1 endstruc -struc VT_priority_queue: - .construct resq 1 - .destruct resq 1 - - .push resq 1 - .pop resq 1 - .peek resq 1 - .heapify resq 1 - .isEmpty resq 1 - .size resq 1 - .decreaseKey resq 1 -endstruc - section .bss section .text @@ -93,6 +68,32 @@ dijkstra: priority_queue@push: +; ---------------------------------------------------------------------------- +; Function: priority queue push. +; Description: +; Pushes new value into minheap. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; ESI - (value) Value to insert. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - RDI, RSI, RDX, R10, R8. +; --------------------------------------------------------------------------- +MOV RDX, [RDI + priority_queue.heap] +MOV R10, [RDX + minheap.array] +MOV R8, [RDX + minheap.len] + +MOV [R10 + R8*SIZE_INT], ESI +INC [RDX + minheap.len] +DEC R8 +MOV RDI, RDX +MOV ESI, R8 +CALL minheap@siftUp +RET priority_queue@pop: @@ -141,15 +142,20 @@ MOV [RBP - minheap@siftUp.index], RSI MOV RDX, [RBP - minheap@siftUp.index] MOV R10, RAX MOV R8, RBX + MOV R9, RBX MOV R8, [R8 + minheap.array] MOV RDX, [R8 + RDX*SIZE_INT] MOV R10, [R8 + RDX*SIZE_INT] CMP RDX, R10 JAE .sift_end MOV RDI, RBX + MOV RDI, [RBX + minheap.array] MOV RSI, [RBP - minheap@siftUp.index] MOV RDX, RAX CALL minheap@swap + MOV RDI, RBX + MOV RDI, [RDI + minheap.array] + CALL minheap@swap MOV [RBP - minheap@siftUp.index], RAX JMP .sift .sift_end: @@ -218,9 +224,13 @@ MOV [RBP - minheap@siftDown.index], RSI CMP R11, R12 JAE .sift_exit MOV RDI, RBX + MOV RDI, [RDI + minheap.array] MOV RSI, [RBP - minheap@siftDown.index] MOV RDX, R9 CALL minheap@swap + MOV RDI, RBX + MOV RDI, [RDI + minheap.elements] + CALL minheap@swap MOV [RBX - minheap@siftDown.index], R9 JMP .sift @@ -241,7 +251,7 @@ minheap@swap: ; Description: ; Swaps elements between given two indices. ; Parameters: -; RDI - (Minheap*) This* minheap. +; RDI - (int[]*) Minheap array to operate on. ; ESI - (int) Index one. ; EDX - (int) Index two. ; R10 - () Unused. @@ -251,7 +261,6 @@ minheap@swap: ; RAX - () None. ; Clobbers - RDI, R8, R10 ; --------------------------------------------------------------------------- -MOV RDI, [RDI + minheap.array] MOV R10, DWORD [RDI+ESI*SIZE_INT] ;TMP MOV R8, DWORD [RDI+EDX*SIZE_INT] ;TMP2 MOV [RDI+ESI*SIZE_INT], R8D From 8f34661b14d78a6dff14f961e9b7ea3c07c35618 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 03:09:59 -0700 Subject: [PATCH 46/87] Completed most priority queue methods; the priority queue acts as an abstraction over the minheap so Tuples can be easily integrated, and RAW minheap method calls won't be made. --- archive/x/x86-64/dijkstra.asm | 179 +++++++++++++++++++++++++++++++--- 1 file changed, 166 insertions(+), 13 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 62f71619c..973457169 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -24,6 +24,19 @@ +;SYSCALLS + +;Memory +%DEFINE SYS_MMAP 9 +%DEFINE NO_ADDR 0 +%DEFINE NO_FD -1 +%DEFINE NO_OFFSET 0 +;PROTS (RDX) +%DEFINE PROT_READ 0x01 +%DEFINE PROT_WRITE 0x02 +;FLAGS (R10) +%DEFINE MAP_SHARED 0x01 +%DEFINE MAP_ANONYMOUS 0x20 @@ -43,6 +56,10 @@ struc min_heap: .elements resq 1 endstruc +struc NodeTuple: + .value resd 1 + .element resd 1 +endstruc ; I want this priority queue as it acts as a great container for the minheap ; and allows for easy abstraction of minheap methods. @@ -74,36 +91,172 @@ priority_queue@push: ; Pushes new value into minheap. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. -; ESI - (value) Value to insert. +; RSI - (NodeTuple*) Tuple that contains distance and element. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RDI, RSI, RDX, R10, R8. +; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -MOV RDX, [RDI + priority_queue.heap] -MOV R10, [RDX + minheap.array] -MOV R8, [RDX + minheap.len] - -MOV [R10 + R8*SIZE_INT], ESI -INC [RDX + minheap.len] -DEC R8 -MOV RDI, RDX -MOV ESI, R8 +PUSH ESI +MOV EDX, [ESI + NodeTuple.element] +MOV ESI, [ESI + NodeTuple.value] +MOV R10, [RDI + priority_queue.heap] +MOV R8, [R10 + minheap.array] +MOV RCX, [R10 + minheap.elements] +MOV R9, [R10 + minheap.len] + +MOV [R8 + R9*SIZE_INT], ESI +MOV [RCX + R9*SIZE_INT], EDX +INC [R10 + minheap.len] +INC [RDI + priority_queue.size] +DEC R9 +MOV RDI, R10 +MOV ESI, R9 CALL minheap@siftUp RET priority_queue@pop: +; ---------------------------------------------------------------------------- +; Function: priority queue pop. +; Description: +; Pops the first element in both the value and element array of the minheap and returns NodeTuple containing both. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (-1). +; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. +; --------------------------------------------------------------------------- +CMP [RDI + priority_queue.size], 0 +CMOVE RAX, -1 +JE .short_circuit + +MOV RSI, [RDI + priority_queue.heap] +MOV R10, [RSI + minheap.array] +MOV R8, [RSI + minheap.elements] + +MOV RDX, [R10] +PUSH RDX +MOV RDX, [R8] +PUSH RDX + +MOV RCX, [RDI + priority_queue.size] +DEC RCX +MOV R9, RCX +MOV [RDI + priority_queue.size], RCX +MOV ECX, [R10 + RCX*SIZE_INT] +MOV [R10], ECX +MOV R9D, [R8 + R9*SIZE_INT] +MOV [R8], R9D + +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, NodeTuple_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL + +POP RSI +POP RDX +MOV [RAX + NodeTuple.value], RDX +MOV [RAX + NodeTuple.element], RSI + +.short_circuit: +RET priority_queue@peek: - -priority_queue@heapify: +; ---------------------------------------------------------------------------- +; Function: priority queue peek. +; Description: +; Peeks at the first element in both the value and element array of the minheap and returns NodeTuple containing both. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (-1). +; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. +; --------------------------------------------------------------------------- +CMP [RDI + priority_queue.size], 0 +CMOVE RAX, -1 +JE .short_circuit + +MOV RSI, [RDI + priority_queue.heap] +MOV R10, [RSI + minheap.array] +MOV R8, [RSI + minheap.elements] + +MOV R10, [R10] +MOV R8, [R8] +PUSH R10 +PUSH R8 + +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, NodeTuple_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL + +POP RSI +POP RDX +MOV [RAX + NodeTuple.value], RDX +MOV [RAX + NodeTuple.element], RSI +.short_circuit: +RET priority_queue@isEmpty: +; ---------------------------------------------------------------------------- +; Function: priority queue isEmpty. +; Description: +; Self explanatory. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (bool) Boolean denoting whether PQ is empty (true) or not (false). +; Clobbers - RAX, RDI. +; --------------------------------------------------------------------------- +MOV RAX, 1 +CMP [RDI + priority_queue.size], 0 +CMOVA RAX, 0 +RET priority_queue@size: +; ---------------------------------------------------------------------------- +; Function: priority queue size. +; Description: +; Self explanatory. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; EAX - (int) Size of PQ/Minheap. +; Clobbers - RAX, RDI. +; --------------------------------------------------------------------------- +MOV RAX, [RDI + priority_queue.size] +RET priority_queue@decreaseKey: From 664a40052fc1327df87121876526f7df90793976 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 03:35:17 -0700 Subject: [PATCH 47/87] Completed priority_queue@decreaseKey. Going to bed now. --- archive/x/x86-64/dijkstra.asm | 40 +++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 973457169..90beec369 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -167,8 +167,8 @@ SYSCALL POP RSI POP RDX -MOV [RAX + NodeTuple.value], RDX -MOV [RAX + NodeTuple.element], RSI +MOV [RAX + NodeTuple.value], EDX +MOV [RAX + NodeTuple.element], ESI .short_circuit: RET @@ -213,8 +213,8 @@ SYSCALL POP RSI POP RDX -MOV [RAX + NodeTuple.value], RDX -MOV [RAX + NodeTuple.element], RSI +MOV [RAX + NodeTuple.value], EDX +MOV [RAX + NodeTuple.element], ESI .short_circuit: RET @@ -259,6 +259,38 @@ MOV RAX, [RDI + priority_queue.size] RET priority_queue@decreaseKey: +; ---------------------------------------------------------------------------- +; Function: priority queue size. +; Description: +; Self explanatory. +; Parameters: +; RDI - (PriorityQueue*)This* priority queue. +; RSI - (int) Index. +; RDX - (NodeTuple*) Replacement tuple. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9. +; --------------------------------------------------------------------------- +MOV R10, [RDI + priority_queue.heap] +MOV R8, [R10 + minheap.elements] +MOV R10, [R10 + minheap.array] + +MOV R9D, [R10 + RSI*SIZE_INT] +CMP R9D, [RDX + NodeTuple.value] +JBE .short_circuit +MOV R9D, [RDX + NodeTuple.value] +MOV [R10 + RSI*SIZE_INT], R9D +MOV R9D, [RDX + NodeTuple.element] +MOV [R8 + RSI*SIZE_INT], R9D + +MOV RDI, R10 +MOV ESI, RSI +CALL minheap@siftUp +.short_circuit: +RET priority_queue@construct: From 88d8f27e9480a9b82a4be4e3f6f90ab0ee2f9d73 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 03:47:09 -0700 Subject: [PATCH 48/87] Minor logic fixes (accidental usage of wrong register, wrong symbol names) --- archive/x/x86-64/dijkstra.asm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 90beec369..2d2b24312 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -330,7 +330,7 @@ MOV [RBP - minheap@siftUp.index], RSI MOV R9, RBX MOV R8, [R8 + minheap.array] MOV RDX, [R8 + RDX*SIZE_INT] - MOV R10, [R8 + RDX*SIZE_INT] + MOV R10, [R8 + R10*SIZE_INT] CMP RDX, R10 JAE .sift_end MOV RDI, RBX @@ -339,7 +339,7 @@ MOV [RBP - minheap@siftUp.index], RSI MOV RDX, RAX CALL minheap@swap MOV RDI, RBX - MOV RDI, [RDI + minheap.array] + MOV RDI, [RDI + minheap.elements] CALL minheap@swap MOV [RBP - minheap@siftUp.index], RAX JMP .sift @@ -395,13 +395,13 @@ MOV [RBP - minheap@siftDown.index], RSI SETB [RBP - minheap@siftDown.conditional_BOOLs-1] MOV RAX, [RBX + minheap.array] MOV RCX, [RAX + RCX*SIZE_INT] - MOV RDX, [RAX + RCX*SIZE_INT] + MOV RDX, [RAX + RDX*SIZE_INT] CMP RDX, RCX SETB [RBP - minheap@siftDown.conditional_BOOLs-2] CMP [RBP - minheap@siftDown.conditional_BOOLs-1], minheap@siftDown.conditional_BOOLs-ACCEPT CMOVB R9, [RBP - minheap@siftDown.right] - MOV RAX, [RBX + minheap.array] + MOV RAX, [RBX + min_heap.array] MOV R11, R9 MOV R11, [RAX + R11*SIZE_INT] MOV R12, [RBP - minheap@siftDown.index] @@ -409,7 +409,7 @@ MOV [RBP - minheap@siftDown.index], RSI CMP R11, R12 JAE .sift_exit MOV RDI, RBX - MOV RDI, [RDI + minheap.array] + MOV RDI, [RDI + min_heap.array] MOV RSI, [RBP - minheap@siftDown.index] MOV RDX, R9 CALL minheap@swap From aecf00df0f2fc6108b370c1c3ae0132c29217a23 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 14:38:02 -0700 Subject: [PATCH 49/87] Fixed up logic for decreaseKey. --- archive/x/x86-64/dijkstra.asm | 39 ++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2d2b24312..148096615 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -100,7 +100,6 @@ priority_queue@push: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -PUSH ESI MOV EDX, [ESI + NodeTuple.element] MOV ESI, [ESI + NodeTuple.value] MOV R10, [RDI + priority_queue.heap] @@ -260,34 +259,36 @@ RET priority_queue@decreaseKey: ; ---------------------------------------------------------------------------- -; Function: priority queue size. +; Function: priority queue decreaseKey. ; Description: -; Self explanatory. +; Decrease priority of given symbol. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. -; RSI - (int) Index. -; RDX - (NodeTuple*) Replacement tuple. +; RSI - (int) Symbol. +; RDX - (int) Replacement priority. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9. +; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -MOV R10, [RDI + priority_queue.heap] -MOV R8, [R10 + minheap.elements] -MOV R10, [R10 + minheap.array] -MOV R9D, [R10 + RSI*SIZE_INT] -CMP R9D, [RDX + NodeTuple.value] -JBE .short_circuit -MOV R9D, [RDX + NodeTuple.value] -MOV [R10 + RSI*SIZE_INT], R9D -MOV R9D, [RDX + NodeTuple.element] -MOV [R8 + RSI*SIZE_INT], R9D - -MOV RDI, R10 -MOV ESI, RSI +MOV R10, [RDI + priority_queue.heap] +MOV R8, [R10 + min_heap.array] +MOV R10, [R10 + min_heap.elements] +MOV RCX, 0 + .search: ; I really don't like having to implement a linear search, but a hashtable will take way too long to implement. + CMP RCX, [RDI + priority_queue.size] + JAE .short_circuit ;Not found + MOV RCX, [R10 + RCX*SIZE_INT] + CMP RCX, RSI + JNE .search +MOV [R8 + RCX*SIZE_INT], RDX + + +MOV RDI, [RDI + priority_queue.heap] +MOV ESI, RCX CALL minheap@siftUp .short_circuit: RET From 00721b65d69b59407ca2bd0928338bc11c8d45d3 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 15:21:13 -0700 Subject: [PATCH 50/87] Got some constructors done~ (PQ and Minheap) --- archive/x/x86-64/dijkstra.asm | 106 +++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 148096615..db366b92e 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -22,6 +22,9 @@ %DEFINE minheap@siftUp.index 8 %DEFINE minheap@siftUp.parent 16 +%DEFINE priority_queue@construct.STACK_INIT 8 +%DEFINE priority_queue@construct.PQPtr 8 + ;SYSCALLS @@ -51,6 +54,7 @@ section .rodata section .data struc min_heap: + .arr_size resq 1 .len resq 1 .array resq 1 .elements resq 1 @@ -271,7 +275,7 @@ priority_queue@decreaseKey: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8, R9. +; Clobbers - RDI, RSI, RCX, RDX, R10, R8. ; --------------------------------------------------------------------------- MOV R10, [RDI + priority_queue.heap] @@ -294,6 +298,69 @@ CALL minheap@siftUp RET priority_queue@construct: +; ---------------------------------------------------------------------------- +; Function: Priority Queue Constructor +; Description: +; Restores min-heap by moving new element upward. +; Parameters: +; RDI - (int) Allowing size to be defined ahead of time so there's no slow and annoying SYS_MREMAP. (SIZE OF MMAP, NOT ACTUAL HEAP SIZE!) +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (PriorityQueue*)Ptr to new PQ. +; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9 +; --------------------------------------------------------------------------- +PUSH RBP +MOV RBP, RSP +SUB RSP, priority_queue@construct.STACK_INIT + +PUSH RDI +PUSH RDI +PUSH RDI +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, priority_queue_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RBP - priority_queue@construct.PQPtr], RAX +MOV [RAX + priority_queue.size], 0 + +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +POP RSI ; size pushed to stack earlier. +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV RDI, RAX + +MOV [RBP - priority_queue@construct.PQPtr], RAX +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +POP RSI ; size pushed to stack earlier. +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV RSI, RAX + +POP RDX ; Size, again +CALL minheap@construct +MOV RDI, [RBP - priority_queue@construct.PQPtr] +MOV [RDI + priority_queue.heap], RAX + +ADD RSP, priority_queue@construct.STACK_INIT +MOV RSP, RBP +POP RBP +RET priority_queue@destruct: @@ -515,6 +582,43 @@ SHL RAX, MUL_2 ADD RAX, 2 RET minheap@construct: +; ---------------------------------------------------------------------------- +; Function: minheap constructor +; Description: +; Constructs minheap with information generated by priority_queue@construct +; Parameters: +; RDI - (int[]*) Value array. +; RSI - (int[]*) Element array. +; EDX - (int) Array size in memory. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (Minheap*) Minheap ptr. +; Clobbers - RAX +; --------------------------------------------------------------------------- +PUSH RDI +PUSH RSI +PUSH RDX + +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, min_heap_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL + +POP RDX +POP RSI +POP RDI + +MOV [RAX + min_heap.array], RDI +MOV [RAX + min_heap.elements], RSI +MOV [RAX + min_heap.array_size], RDX +MOV [RAX + min_heap.len], 0 +RET minheap@destruct: From 437f6a8b40992d923fbd34d5ba1265af33d9716a Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 15:52:30 -0700 Subject: [PATCH 51/87] Finished minheap and PQ destruct. --- archive/x/x86-64/dijkstra.asm | 61 ++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index db366b92e..a9649bcbd 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -41,6 +41,8 @@ %DEFINE MAP_SHARED 0x01 %DEFINE MAP_ANONYMOUS 0x20 +%DEFINE SYS_MUNMAP 11 + @@ -363,7 +365,31 @@ POP RBP RET priority_queue@destruct: +; ---------------------------------------------------------------------------- +; Function: Priority Queue Destructor +; Description: +; Destructs Priority Queue +; Parameters: +; RDI - (PriorityQueue*)Ptr to priority queue. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () +; Clobbers - RDI, RSI, RDX. +; --------------------------------------------------------------------------- +PUSH RDI +MOV RDI, [RDI + priority_queue.heap] +CALL minheap@destruct +MOV RAX, SYS_MUNMAP +POP RDI +MOV RSI, priority_queue_size +SYSCALL +XOR RDI, RDI ; Killing RDI so stale ptr isn't passed on. +RET minheap@siftUp: ; ---------------------------------------------------------------------------- @@ -583,7 +609,7 @@ ADD RAX, 2 RET minheap@construct: ; ---------------------------------------------------------------------------- -; Function: minheap constructor +; Function: Minheap Constructor ; Description: ; Constructs minheap with information generated by priority_queue@construct ; Parameters: @@ -621,7 +647,40 @@ MOV [RAX + min_heap.len], 0 RET minheap@destruct: +; ---------------------------------------------------------------------------- +; Function: Minheap Destructor +; Description: +; Destructs Minheap; only to be called by priority_queue@destruct +; Parameters: +; RDI - (Minheap*) Ptr to minheap. +; RSI - () Unused. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () +; Clobbers - RDI, RSI, RDX. +; --------------------------------------------------------------------------- +MOV RDX, RDI +MOV RAX, SYS_MUNMAP +MOV RDI, [RDX + min_heap.array] +MOV RSI, [RDX + min_heap.arr_size] +SYSCALL + +MOV RAX, SYS_MUNMAP +MOV RDI, [RDX + min_heap.elements] +MOV RSI, [RDX + min_heap.arr_size] +SYSCALL + +MOV RAX, SYS_MUNMAP +MOV RDI, [RDX + min_heap.array] +MOV RSI, min_heap_size +SYSCALL + +XOR RDX, RDX ; I want to kill this register so a stale ptr to minheap isn't passing on after this function's lifetime. +RET ezsqrt: ; ---------------------------------------------------------------------------- ; Function: Easy Square Root From 02959d7d45505c5140ef734b432910ae3ad81d45 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 19:16:30 -0700 Subject: [PATCH 52/87] Working on the parsing! --- archive/x/x86-64/dijkstra.asm | 129 ++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index a9649bcbd..bb753e646 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,14 @@ +;Exit codes +%DEFINE EXIT_OK 0 + +%DEFINE INVALID_ARGC -1 +%DEFINE INVALID_SRC/DST -2 +%DEFINE INVALID_NUM_NEG -3 +%DEFINE INVALID_CHAR -4 +%DEFINE INVALID_NUM_VERTS -5 +%DEFINE INVALID_NOT_SQUARE -6 +%DEFINE INVALID_STATE -7 + ; CONSTANTS %DEFINE MUL_2 1 %DEFINE DIV_2 1 @@ -5,8 +16,10 @@ -%DEFINE atol.STACK_INIT 8 -%DEFINE atol.ret 8 +; Functions/Methods + +%DEFINE atoi.STACK_INIT 8 +%DEFINE atoi.ret 8 %DEFINE minheap@siftDown.STACK_INIT 40 %DEFINE minheap@siftDown.minheap_len 8 @@ -25,6 +38,16 @@ %DEFINE priority_queue@construct.STACK_INIT 8 %DEFINE priority_queue@construct.PQPtr 8 +%DEFINE parseSRCDST.STACK_INIT 8 +%DEFINE parseSRCDST.strlen 8 + +%DEFINE parseVertices.STACK_INIT 40 +%DEFINE parseVertices.strlen 8 +%DEFINE parseVertices.SRC 16 +%DEFINE parseVertices.DST 24 +%DEFINE parseVertices.NumPtr 32 +%DEFINE parseVertices.prevState 40 + ;SYSCALLS @@ -45,8 +68,22 @@ +;Start - +%DEFINE _start.argc 8 +%DEFINE _start.argv0 16 +%DEFINE _start.argv1 24 +%DEFINE _start.argv2 32 +%DEFINE _start.argv3 40 +; RBP+ ^ +; RBP- v +%DEFINE _start.STACK_INIT 48 +%DEFINE _start.PriorityQueue 8 +%DEFINE _start.SRC 16 +%DEFINE _start.DST 24 +%DEFINE _start.dist 32 +%DEFINE _start.prev 40 +%DEFINE _start.graph 48 @@ -55,6 +92,9 @@ section .rodata section .data +Error_state: + .CODE db 0 + struc min_heap: .arr_size resq 1 .len resq 1 @@ -84,8 +124,89 @@ _start: parseSRCDST: +; ---------------------------------------------------------------------------- +; Function: Parse SRC & DST. +; Description: +; Parses given SRC OR DST. Separated from vertice parser for modularity and organization. +; Parsed through Finite State Machine. +; Parameters: +; RDI - (char[]*) Ptr to SRC/DST char array. +; RSI - (int*) Ptr to SRC/DST char for storage. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (int) 0 = success, -2 for INVALID_SRC/DST. +; Clobbers - RAX, RDI, RSI, RCX, RDX +; --------------------------------------------------------------------------- +MOV RBP, RSP +PUSH RBP +SUB RSP, parseSRCDST.STACK_INIT + +MOV RCX, 0 + .validate: + MOV DL, BYTE [RDI] + JMP [.jmpTable + RDX*8] + .jmpTable: + dq .zero + times 48 dq .error + times 10 dq .num + times 69 dq .error + .cont: + PUSH RSI + MOV RSI, RCX + CALL atoi + POP RSI + MOV [RSI], RAX + + ADD RSP, parseSRCDST.STACK_INIT + MOV RSP, RBP + POP RBP + RET + .zero: + CMP RCX, 0 + CMOVE RAX, INVALID_SRC/DST + JE .error + JNE .cont + .num: + INC RCX + JMP .validate + .error: + ADD RSP, parseSRCDST.STACK_INIT + MOV RSP, RBP + POP RBP + RET parseVertices: +; ---------------------------------------------------------------------------- +; Function: Parse Vertices. +; Description: +; Parses given vertices from array and checks for errors. +; Parsed through Finite State Machine. +; Parameters: +; RDI - (char[]*) Ptr to vertice char array. +; RSI - (int[][]*) Ptr to distances 2d array. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (int) +; Clobbers - +; --------------------------------------------------------------------------- +;Previous States + %DEFINE Parse.STATE.START 000b + %DEFINE Parse.STATE.NUM 001b + %DEFINE Parse.STATE.COMMA 010b + %DEFINE Parse.STATE.SPACE 100b +MOV RBP, RSP +PUSH RBP +SUB RSP, parseVertices.STACK_INIT + +MOV [RBP - parseVertices.SRC], RDI +MOV [RBP - parseVertices.DST], RSI + dijkstra: @@ -721,7 +842,7 @@ atoi: ; Description: ; Converts ascii string to integer. ; Parameters: -; RDI - (char*) Pointer to string to convert to integer. +; RDI - (char[]*) Pointer to string to convert to integer. ; RSI - (long) Strlen. ; RDX - () Unused. ; R10 - () Unused. From 6b0bd9efdc150a7ac954e354be2b16cc38871cbb Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 21:55:17 -0700 Subject: [PATCH 53/87] Got Parse SRC/DST and Parse Vertices done! --- archive/x/x86-64/dijkstra.asm | 146 +++++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 11 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index bb753e646..c6e028c23 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -8,11 +8,17 @@ %DEFINE INVALID_NUM_VERTS -5 %DEFINE INVALID_NOT_SQUARE -6 %DEFINE INVALID_STATE -7 +%DEFINE INVALID_EMPTY -8 +%DEFINE INVALID_BAD_STR -9 ; CONSTANTS %DEFINE MUL_2 1 %DEFINE DIV_2 1 %DEFINE SIZE_INT 4 +%DEFINE SIZE_LONG 8 +%DEFINE EMPTY_INPUT 0 + +%DEFINE COMMA_SPACE 2 @@ -41,17 +47,19 @@ %DEFINE parseSRCDST.STACK_INIT 8 %DEFINE parseSRCDST.strlen 8 -%DEFINE parseVertices.STACK_INIT 40 +%DEFINE parseVertices.STACK_INIT 48 %DEFINE parseVertices.strlen 8 %DEFINE parseVertices.SRC 16 %DEFINE parseVertices.DST 24 %DEFINE parseVertices.NumPtr 32 -%DEFINE parseVertices.prevState 40 - +%DEFINE parseVertices.PrevState 40 +%DEFINE parseVertices.NumElems 48 ;SYSCALLS - +;STDIN/OUT +%DEFINE SYS_WRITE 1 +%DEFINE STDOUT 1 ;Memory %DEFINE SYS_MMAP 9 %DEFINE NO_ADDR 0 @@ -66,6 +74,9 @@ %DEFINE SYS_MUNMAP 11 +;Thread +%DEFINE SYS_EXIT 60 + ;Start @@ -90,6 +101,10 @@ section .rodata +Error: + .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' + .len equ $- .msg + section .data Error_state: @@ -147,12 +162,12 @@ SUB RSP, parseSRCDST.STACK_INIT MOV RCX, 0 .validate: MOV DL, BYTE [RDI] - JMP [.jmpTable + RDX*8] + JMP [.jmpTable + RDX*SIZE_LONG] .jmpTable: dq .zero times 48 dq .error times 10 dq .num - times 69 dq .error + times 197 dq .error .cont: PUSH RSI MOV RSI, RCX @@ -192,21 +207,130 @@ parseVertices: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (int) +; RAX - (int) Error code. (0 = success) ; Clobbers - ; --------------------------------------------------------------------------- ;Previous States - %DEFINE Parse.STATE.START 000b - %DEFINE Parse.STATE.NUM 001b - %DEFINE Parse.STATE.COMMA 010b - %DEFINE Parse.STATE.SPACE 100b + %DEFINE Parse.STATE.START 0000b + %DEFINE Parse.STATE.NUM 0001b + %DEFINE Parse.STATE.COMMA 0010b + %DEFINE Parse.STATE.SPACE 0100b + %DEFINE Parse.STATE.ZERO 1000b MOV RBP, RSP PUSH RBP SUB RSP, parseVertices.STACK_INIT MOV [RBP - parseVertices.SRC], RDI MOV [RBP - parseVertices.DST], RSI +MOV [RBP - parseVertices.NumElems], 0 + +MOV AL, BYTE [RDI] +CMP AL, EMPTY_INPUT +CMOVE RAX, INVALID_EMPTY +JE .error +MOV RCX, 0 +MOV [RBP - parseVertices.NumPtr], RDI + .validate: + MOV DL, BYTE [RDI+RCX] + JMP [.jmpTable + RDX*SIZE_LONG] + .jmpTable: + dq .zero + times 31 dq .error + dq .space + times 11 .error + dq .comma + times 3 dq .error + times 10 dq .num + times 197 dq .error + + .num: + CMP [RBP - parseVertices.PrevState], Parse.STATE.START + JE .errSkip + CMP [RBP - parseVertices.PrevState], Parse.STATE.SPACE + PUSH RDI + ADD RDI, RCX + CMOVE [RBP - parseVertices.NumPtr], RDI + POP RDI + JE .errSkip + CMOVNE RDI, INVALID_BAD_STR + JMP .error + .errSkip: + INC [RBP - parseVertices.strlen] + INC RCX + MOV [RBP - parseVertices.PrevState], Parse.STATE.NUM + JMP .validate + + .comma: + CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM + CMOVNE RDI, INVALID_BAD_STR + JNE .error + + .zero_jmp: + PUSH RAX + PUSH RDI + PUSH RSI + PUSH RCX + PUSH RDX + MOV RDI, [RBP - parseVertices.NumPtr] + MOV RSI, [RBP - parseVertices.strlen] + CALL atoi + MOV RDI, [RBP - parseVertices.DST] + MOV RCX, [RBP - parseVertices.NumElems] + MOV [RDI + RCX*SIZE_INT], EAX + POP RDX + POP RCX + POP RSI + POP RDI + POP RAX + CMP [RBP - parseVertices.PrevState], PARSE.STATE.ZERO + JE .zero_cont + + MOV [RBP - parseVertices.PrevState], PARSE.STATE.COMMA + MOV [RBP - parseVertices.strlen], 0 + INC RCX + INC [RBP - parseVertices.NumElems] + JMP .validate + .space: + CMP [RBP - parseVertices.PrevState], Parse.STATE.COMMA + CMOVNE RDI, INVALID_BAD_STR + JNE .error + + JMP .validate + .zero: + CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM + CMOVNE RDI, INVALID_BAD_STR + JNE .error + CMP RCX, 0 + CMOVE RDI, INVALID_BAD_STR + JE .error + MOV [RBP - parseVertices.PrevState], Parse.STATE.ZERO + JMP .zero_jmp ; I don't like this backwards GOTO. + .zero_cont: + JMP .cont + + .cont: + ADD RSP, parseVertices.STACK_INIT + MOV RSP, RBP + POP RBP + RET + .error: + PUSH RDI + MOV RAX, SYS_WRITE + MOV RDI, STDIN + MOV RSI, Error.msg + MOV RDX, Error.len + SYSCALL + + ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. + MOV RAX, SYS_EXIT + POP RDI + SYSCALL + + + + + dijkstra: From aa783553066916d1872c1f4d39d430b6207b613c Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 23:02:37 -0700 Subject: [PATCH 54/87] Getting progress done on Dijkstra! --- archive/x/x86-64/dijkstra.asm | 124 +++++++++++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 9 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index c6e028c23..a7d847269 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -13,6 +13,7 @@ ; CONSTANTS %DEFINE MUL_2 1 +%DEFINE MUL_4 2 %DEFINE DIV_2 1 %DEFINE SIZE_INT 4 %DEFINE SIZE_LONG 8 @@ -88,13 +89,22 @@ %DEFINE _start.argv3 40 ; RBP+ ^ ; RBP- v -%DEFINE _start.STACK_INIT 48 -%DEFINE _start.PriorityQueue 8 -%DEFINE _start.SRC 16 -%DEFINE _start.DST 24 -%DEFINE _start.dist 32 -%DEFINE _start.prev 40 -%DEFINE _start.graph 48 +%DEFINE _start.STACK_INIT 32 +%DEFINE _start.SRC 8 +%DEFINE _start.DST 16 +%DEFINE _start.NumVerts 24 +%DEFINE _start.graph 32 + +%DEFINE dijkstra.STACK_INIT 64 +%DEFINE dijkstra.PriorityQueue 8 +%DEFINE dijkstra.NumVerts 16 +%DEFINE dijkstra.prev 24 +%DEFINE dijkstra.dist 32 +%DEFINE dijkstra.SRC 40 +%DEFINE dijkstra.DST 48 +%DEFINE dijkstra.graph 56 +%DEFINE dijkstra.CurrTex 64 + @@ -207,8 +217,8 @@ parseVertices: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (int) Error code. (0 = success) -; Clobbers - +; RAX - (int) Num elements (RAX > 0) +; Clobbers - RAX, RDI, RSI, RCX, RDX. ; --------------------------------------------------------------------------- ;Previous States %DEFINE Parse.STATE.START 0000b @@ -310,6 +320,8 @@ MOV [RBP - parseVertices.NumPtr], RDI JMP .cont .cont: + MOV RAX, [RBP - parseVertices.NumElemes] + ADD RSP, parseVertices.STACK_INIT MOV RSP, RBP POP RBP @@ -333,6 +345,100 @@ MOV [RBP - parseVertices.NumPtr], RDI dijkstra: +; ---------------------------------------------------------------------------- +; Function: priority queue push. +; Description: +; The algorithm of study itself, Dijkstra. +; Parameters: +; RDI - (int) SRC. +; RSI - (int) DST. +; RDX - (int[][]*) Graph to vertice&edges. +; R10 - (int) # Vertices. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - +; --------------------------------------------------------------------------- +MOV RBP, RSP +PUSH RBP +SUB RSP, dijkstra.STACK_INIT + +MOV [RBP - dijkstra.SRC], RDI +MOV [RBP - dijkstra.DST], RSI +MOV [RBP - dijkstra.graph], RDX +MOV [RBP - dijkstra.NumVerts], R10 + +MOV [RBP - dijkstra.CurrTex], RDI + +PUSH R10 +PUSH R10 + +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +POP RSI +SHL RSI, MUL_4 +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RBP - dijkstra.dist], RAX +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +POP RSI +SHL RSI, MUL_4 +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RBP - dijkstra.prev], RAX + +MOV RDI, [RBP - dijkstra.dist] +MOV RSI, [RBP - dijkstra.CurrTex] +MOV DWORD [RDI + RSI], 0 + + + + +dijkstra&GenerateTuple: +; ---------------------------------------------------------------------------- +; Function: Dijkstra Generate Tuple +; Description: +; Helper method for dijkstra to generate tuples. +; Preserving RDX, R10, R8, R9 as I know it will be annoying restoring those for every call if clobbered. +; Can replace ad hoc instances of tuple generation. +; Parameters: +; RDI - (int) Element. +; RSI - (int) Value. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (NodeTuple*) Generated Tuple. +; Clobbers - RAX, RDI, RSI. +; --------------------------------------------------------------------------- +PUSH RDX +PUSH R10 +PUSH R8 +PUSH R9 +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, NodeTuple_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RAX + NodeTuple.value], EDX +MOV [RAX + NodeTuple.element], ESI +POP R9 +POP R8 +POP R10 +POP RDX +RET priority_queue@push: From ebe871a419a3a21206501550e4f37e7af52a7272 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 1 Nov 2025 23:46:00 -0700 Subject: [PATCH 55/87] One chunk of the actual Dijkstra algorithm done. Now to work on the next part. I also NEED to fix the CMOVs I wrote earlier because disallowing immediate values is the best chip decision ever! --- archive/x/x86-64/dijkstra.asm | 48 ++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index a7d847269..d121bd53d 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -18,6 +18,7 @@ %DEFINE SIZE_INT 4 %DEFINE SIZE_LONG 8 %DEFINE EMPTY_INPUT 0 +%DEFINE INF 0xFFFFFFFF %DEFINE COMMA_SPACE 2 @@ -371,6 +372,10 @@ MOV [RBP - dijkstra.NumVerts], R10 MOV [RBP - dijkstra.CurrTex], RDI +MOV RDI, R10 +CALL priority_queue@construct +MOV [RBP - dijkstra.priority_queue], RAX + PUSH R10 PUSH R10 @@ -399,10 +404,51 @@ MOV RDI, [RBP - dijkstra.dist] MOV RSI, [RBP - dijkstra.CurrTex] MOV DWORD [RDI + RSI], 0 +MOV RDI, RSI +MOV RSI, 0 +CALL dijkstra~GenerateTuple +MOV RDI, [RBP - dijkstra.PriorityQueue] +MOV RSI, RAX +CALL priority_queue@push +MOV RCX, 0 +MOV RDI, [RBP - dijkstra.dist] +MOV RSI, [RBP - dijkstra.prev] +MOV RDX, [RBP - dijkstra.PriorityQueue] + .add_vertex_loop: + CMP RCX, [RBP - dijkstra.NumVerts] + JAE .v_loop_exit + CMP RCX, [RBP - dijkstra.SRC] + JE .vtx_loop_cont + + MOV [RDI+RCX*SIZE_INT], INF + MOV [RSI+RCX*SIZE_INT], -1 + + PUSH RDI + PUSH RSI + PUSH RCX + PUSH RDX + + MOV RDI, -1 + MOV RSI, INF + CALL dijkstra~GenerateTuple + MOV RDI, [RBP - dijkstra.PriorityQueue] + MOV RSI, RAX + CALL priority_queue@push + + POP RDX + POP RCX + POP RSI + POP RDI + .vtx_loop_cont: ; Fall through ^ + INC RCX + JMP .add_vertex_loop + + +.v_loop_exit: -dijkstra&GenerateTuple: +dijkstra~GenerateTuple: ; ---------------------------------------------------------------------------- ; Function: Dijkstra Generate Tuple ; Description: From dc2b5edd02cd1c83baa0ab567a84f5c56ea5ade1 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 00:09:24 -0700 Subject: [PATCH 56/87] Fixed the CMOV issues for now; awesome x86! --- archive/x/x86-64/dijkstra.asm | 50 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index d121bd53d..cf38dc93c 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -19,6 +19,7 @@ %DEFINE SIZE_LONG 8 %DEFINE EMPTY_INPUT 0 %DEFINE INF 0xFFFFFFFF +%DEFINE NULL 0 %DEFINE COMMA_SPACE 2 @@ -115,6 +116,19 @@ section .rodata Error: .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' .len equ $- .msg + +Err_Table: ; This is absurd but this because of CMOV not allowing immediates. + db 0 + db -1 + db -2 + db -3 + db -4 + db -5 + db -6 + db -7 + db -8 + db -9 + section .data @@ -192,7 +206,7 @@ MOV RCX, 0 RET .zero: CMP RCX, 0 - CMOVE RAX, INVALID_SRC/DST + CMOVE RAX, [Err_Table+INVALID_SRC/DST] JE .error JNE .cont .num: @@ -237,7 +251,7 @@ MOV [RBP - parseVertices.NumElems], 0 MOV AL, BYTE [RDI] CMP AL, EMPTY_INPUT -CMOVE RAX, INVALID_EMPTY +CMOVE RAX, [Err_Table+INVALID_EMPTY] JE .error MOV RCX, 0 @@ -258,13 +272,18 @@ MOV [RBP - parseVertices.NumPtr], RDI .num: CMP [RBP - parseVertices.PrevState], Parse.STATE.START JE .errSkip - CMP [RBP - parseVertices.PrevState], Parse.STATE.SPACE PUSH RDI + PUSH RAX + MOV RAX, [RBP - parseVertices.NumPtr] + MOV RAX, [RAX] ADD RDI, RCX - CMOVE [RBP - parseVertices.NumPtr], RDI + CMP [RBP - parseVertices.PrevState], Parse.STATE.SPACE + CMOVE RAX, RDI + MOV [RBP - parseVertices.NumPtr], RAX + POP RAX POP RDI JE .errSkip - CMOVNE RDI, INVALID_BAD_STR + CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JMP .error .errSkip: INC [RBP - parseVertices.strlen] @@ -274,7 +293,7 @@ MOV [RBP - parseVertices.NumPtr], RDI .comma: CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM - CMOVNE RDI, INVALID_BAD_STR + CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error .zero_jmp: @@ -304,16 +323,16 @@ MOV [RBP - parseVertices.NumPtr], RDI JMP .validate .space: CMP [RBP - parseVertices.PrevState], Parse.STATE.COMMA - CMOVNE RDI, INVALID_BAD_STR + CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error JMP .validate .zero: CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM - CMOVNE RDI, INVALID_BAD_STR + CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error CMP RCX, 0 - CMOVE RDI, INVALID_BAD_STR + CMOVE RDI, [Err_Table+INVALID_BAD_STR] JE .error MOV [RBP - parseVertices.PrevState], Parse.STATE.ZERO JMP .zero_jmp ; I don't like this backwards GOTO. @@ -533,11 +552,12 @@ priority_queue@pop: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (-1). +; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- CMP [RDI + priority_queue.size], 0 -CMOVE RAX, -1 +SETNE AL +MOVZX RAX, AL JE .short_circuit MOV RSI, [RDI + priority_queue.heap] @@ -588,11 +608,12 @@ priority_queue@peek: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (-1). +; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- CMP [RDI + priority_queue.size], 0 -CMOVE RAX, -1 +SETNE AL +MOVZX RAX, AL JE .short_circuit MOV RSI, [RDI + priority_queue.heap] @@ -638,7 +659,8 @@ priority_queue@isEmpty: ; --------------------------------------------------------------------------- MOV RAX, 1 CMP [RDI + priority_queue.size], 0 -CMOVA RAX, 0 +SETE AL +MOVZX RAX, AL RET priority_queue@size: From a87a5dd7c8a61f18d352ee2011bee59f690184df Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 00:20:17 -0700 Subject: [PATCH 57/87] Final commit for the night. The game plan is in motion. --- archive/x/x86-64/dijkstra.asm | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index cf38dc93c..a567e0408 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -20,6 +20,8 @@ %DEFINE EMPTY_INPUT 0 %DEFINE INF 0xFFFFFFFF %DEFINE NULL 0 +%DEFINE FALSE 0 +%DEFINE TRUE 1 %DEFINE COMMA_SPACE 2 @@ -383,6 +385,8 @@ dijkstra: MOV RBP, RSP PUSH RBP SUB RSP, dijkstra.STACK_INIT +PUSH R11 +PUSH R12 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.DST], RSI @@ -465,7 +469,27 @@ MOV RDX, [RBP - dijkstra.PriorityQueue] JMP .add_vertex_loop -.v_loop_exit: +.v_loop_exit: +MOV RDI, [RBP - dijkstra.PriorityQueue] +CALL priority_queue@isEmpty +MOV R11, RAX + + .dijkstra_loop: + CMP R11, TRUE + JE .dijkstra_exit + + MOV RDI, [RBP - dijkstra.PriorityQueue] + CALL priority_queue@pop + MOV R12, RAX + MOVZX EDI, DWORD [R12 + NodeTuple.value] + MOV [RBP - dijkstra.CurrTex], RDI + .dijkstra_get_neighbors: + + + + + +.dijkstra_exit: dijkstra~GenerateTuple: ; ---------------------------------------------------------------------------- From 89aa513e1b90452a27f0e6bd2cff9a33d40826c1 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 04:05:20 -0800 Subject: [PATCH 58/87] Got good progress on the Dijkstra function. This program is getting everso closer and closer to debug phase. --- archive/x/x86-64/dijkstra.asm | 59 ++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index a567e0408..b27ad2e2b 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -379,14 +379,16 @@ dijkstra: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - () None. +; RAX - (int[]*) Array of distances. ; Clobbers - ; --------------------------------------------------------------------------- MOV RBP, RSP PUSH RBP SUB RSP, dijkstra.STACK_INIT +PUSH RBX PUSH R11 PUSH R12 +PUSH R13 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.DST], RSI @@ -470,24 +472,65 @@ MOV RDX, [RBP - dijkstra.PriorityQueue] .v_loop_exit: -MOV RDI, [RBP - dijkstra.PriorityQueue] -CALL priority_queue@isEmpty -MOV R11, RAX - +MOV R13, [RBP- dijkstra.PriorityQueue] +MOV RBX, [RBP - dijkstra.dist] .dijkstra_loop: + MOV RDI, R13 + CALL priority_queue@isEmpty + MOV R11, RAX CMP R11, TRUE JE .dijkstra_exit - MOV RDI, [RBP - dijkstra.PriorityQueue] + MOV RDI, R13 CALL priority_queue@pop MOV R12, RAX MOVZX EDI, DWORD [R12 + NodeTuple.value] MOV [RBP - dijkstra.CurrTex], RDI + MOV RCX, 0 .dijkstra_get_neighbors: + MOV R8, [RBP - dijkstra.CurrTex] + MOV RAX, R8 + MOV R9, [RBP - dijkstra.NumVerts] + MUL R9 - - + MOV R10, [RBP - dijkstra.graph] + ADD R10, RAX + .neighbors_loop: + CMP [R10 + RCX*SIZE_INT], NULL + JNE .neighbor_cont + INC RCX + JMP .neighbors_loop + .neighbor_cont: + MOV RSI, RBX + MOV RSI, [RSI + R8*SIZE_INT] + ADD RSI, [R10 + RCX*SIZE_INT] + CMP RSI, [RBX + RCX*SIZE_INT] + JAE .neighbors_loop + PUSH RSI + MOV [RBX + RCX*SIZE_INT], RSI + MOVZX EDI, [R12 + NodeTuple.element] + PUSH RDI + MOV RSI, [RBP - dijkstra.prev] + MOV [RSI + RCX*SIZE_INT], EDI + MOV RDI, R13 + POP RSI + POP RDX + PUSH R10 + PUSH RCX + + CALL priority_queue@decreaseKey + POP RCX + POP R10 + INC RCX + CMP RCX, [RBP - dijkstra.NumVerts] + JAE .dijkstra_loop + JB .neighbors_loop +MOV RAX, [RBP - dijkstra.dist] +ADD RSP, dijkstra.STACK_INIT +MOV RSP, RBP +POP RBP +RET .dijkstra_exit: From d9de17a8884823edc6cffcd959c508f4edd5942c Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 04:37:35 -0800 Subject: [PATCH 59/87] All I need to do now is parse the return, and print it. Then, I'll seriously need to debug this. --- archive/x/x86-64/dijkstra.asm | 101 +++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 14 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index b27ad2e2b..6593dfba0 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -93,11 +93,12 @@ %DEFINE _start.argv3 40 ; RBP+ ^ ; RBP- v -%DEFINE _start.STACK_INIT 32 +%DEFINE _start.STACK_INIT 40 %DEFINE _start.SRC 8 %DEFINE _start.DST 16 %DEFINE _start.NumVerts 24 %DEFINE _start.graph 32 +%DEFINE _start.RET 40 %DEFINE dijkstra.STACK_INIT 64 %DEFINE dijkstra.PriorityQueue 8 @@ -163,7 +164,77 @@ section .text global _start _start: +MOV RBP, RSP +PUSH RBP +SUB RSP, _start.STACK_INIT + +MOV RAX, [RBP + _start.argv1] +MOV RCX, 0 +.count_commas: + CMP BYTE [RAX + RCX], 0 + JE .count_end + CMP BYTE [RAX + RCX], ',' + SETE BL + MOVZX RBX, BL + ADD RCX, RBX + MOV RBX, 0 +.count_end: +MOV RDI, RCX +CALL ezsqrt +CMP RAX, -1 +CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] +JE .error +MOV [RSP - _start.NumVerts], RAX + +MOV RDI, [RBP + _start.argv2] +CALL parseSRCDST +MOV [RBP + _start.SRC], RAX + +MOV RDI, [RBP + _start.argv3] +CALL parseSRCDST +MOV [RBP + _start.DST], RAX + +MOV RAX, [RBP - _start.NumVerts] +MUL RAX + +PUSH RAX +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +POP RSI +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RBP - _start.graph], RAX +MOV RDI, [RBP + _start.argv1] +MOV RSI, [RBP - _start.graph] +CALL parseVertices + +MOV RDI, [RBP - _start.SRC] +MOV RSI, [RBP - _start.DST] +MOV RDX, [RBP - _start.graph] +MOV R10, [RBP - _start.NumVerts] +CALL dijkstra + +MOV RCX, [RBP - _start.DST] +MOV RBX, [RAX + RCX*SIZE_INT] +MOV [RBP - _start.RET], RBX + + + +.error: + PUSH RDI + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, Error.msg + MOV RDX, Error.len + SYSCALL + + MOV RAX, SYS_EXIT + POP RDI + SYSCALL parseSRCDST: ; ---------------------------------------------------------------------------- @@ -173,13 +244,13 @@ parseSRCDST: ; Parsed through Finite State Machine. ; Parameters: ; RDI - (char[]*) Ptr to SRC/DST char array. -; RSI - (int*) Ptr to SRC/DST char for storage. +; RSI - () Unused. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (int) 0 = success, -2 for INVALID_SRC/DST. +; EAX - (int) SRC/DST ; Clobbers - RAX, RDI, RSI, RCX, RDX ; --------------------------------------------------------------------------- MOV RBP, RSP @@ -196,12 +267,9 @@ MOV RCX, 0 times 10 dq .num times 197 dq .error .cont: - PUSH RSI MOV RSI, RCX CALL atoi - POP RSI - MOV [RSI], RAX - + MOVZX RAX, EAX ADD RSP, parseSRCDST.STACK_INIT MOV RSP, RBP POP RBP @@ -215,10 +283,16 @@ MOV RCX, 0 INC RCX JMP .validate .error: - ADD RSP, parseSRCDST.STACK_INIT - MOV RSP, RBP - POP RBP - RET + PUSH RAX + MOV RAX, SYS_WRITE + MOV RDI, STDIN + MOV RSI, Error.msg + MOV RDX, Error.len + SYSCALL + + MOV RAX, SYS_EXIT + POP RDI + SYSCALL parseVertices: ; ---------------------------------------------------------------------------- @@ -380,7 +454,7 @@ dijkstra: ; R9 - () Unused. ; Returns: ; RAX - (int[]*) Array of distances. -; Clobbers - +; Clobbers - RAX, RSI, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- MOV RBP, RSP PUSH RBP @@ -531,8 +605,7 @@ ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP POP RBP RET - -.dijkstra_exit: + dijkstra~GenerateTuple: ; ---------------------------------------------------------------------------- From d930654a48ce1a6612fa72b04bfb3a8065b09bbe Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 05:07:44 -0800 Subject: [PATCH 60/87] Finally done with the structure of the program. Debugging and redundancy removal shall commence. --- archive/x/x86-64/dijkstra.asm | 98 +++++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 9 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 6593dfba0..af84dabaf 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,15 +1,15 @@ ;Exit codes %DEFINE EXIT_OK 0 -%DEFINE INVALID_ARGC -1 -%DEFINE INVALID_SRC/DST -2 -%DEFINE INVALID_NUM_NEG -3 -%DEFINE INVALID_CHAR -4 -%DEFINE INVALID_NUM_VERTS -5 -%DEFINE INVALID_NOT_SQUARE -6 -%DEFINE INVALID_STATE -7 -%DEFINE INVALID_EMPTY -8 -%DEFINE INVALID_BAD_STR -9 +%DEFINE INVALID_ARGC 1 +%DEFINE INVALID_SRC/DST 2 +%DEFINE INVALID_NUM_NEG 3 +%DEFINE INVALID_CHAR 4 +%DEFINE INVALID_NUM_VERTS 5 +%DEFINE INVALID_NOT_SQUARE 6 +%DEFINE INVALID_STATE 7 +%DEFINE INVALID_EMPTY 8 +%DEFINE INVALID_BAD_STR 9 ; CONSTANTS %DEFINE MUL_2 1 @@ -22,6 +22,7 @@ %DEFINE NULL 0 %DEFINE FALSE 0 %DEFINE TRUE 1 +%DEFINE MAX_STR_INT 11 ; 10 (Max Int) + 1 (Null) %DEFINE COMMA_SPACE 2 @@ -222,6 +223,30 @@ MOV RCX, [RBP - _start.DST] MOV RBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, MAX_STR_INT +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL + +PUSH RAX +MOV RDI, RBX +MOV RSI, RAX +CALL iota +MOV RAX, R10 + +MOV RAX, SYS_WRITE +MOV RDI, STDOUT +POP RSI +MOV RDX, R10 +SYSCALL + +MOV RAX, SYS_EXIT +MOV RDI, [Err_Table+EXIT_OK] +SYSCALL .error: @@ -236,6 +261,61 @@ MOV [RBP - _start.RET], RBX POP RDI SYSCALL +itoa: +; ---------------------------------------------------------------------------- +; Function: Int to ASCII +; Description: +; Converts integer to ASCII, returned through char[] ptr. +; Parameters: +; RDI - (int) Int to convert. +; RSI - (char[]*) String ptr. +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (int) Strlen. +; Clobbers - RAX, RDI, RSI, RCX, RDX +; --------------------------------------------------------------------------- +PUSH RBX +PUSH RDX +PUSH R10 +PUSH R8 +MOV RCX, 0 +MOV RAX, RDI +MOV RBX, 10 + .loop: + CMP RDI, 0 + JE .ext + DIV RBX + ADD RDX, '0' + MOV BYTE [RSI + RCX], DL + INC RCX + JMP .loop +.ext: +MOV BYTE [RSI + RCX], 0 +PUSH RCX +DEC RCX +MOV RDX, 0 + .reverse: + CMP RDX, RCX + JAE .ext2 + MOV R10B, [RSI+RDX] + MOV R8B, [RSI+RCX] + MOV [RSI+RDX], R8B + MOV [RSI+RDX], R10B + INC RDX + DEC RCX + JMP .reverse +.ext2: +POP RCX +MOV RAX, RCX +POP R8 +POP R10 +POP RDX +POP RBX +RET + parseSRCDST: ; ---------------------------------------------------------------------------- ; Function: Parse SRC & DST. From 0bdb9e514e1f875a5e09cb954c942d31c28ab641 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 08:16:27 -0800 Subject: [PATCH 61/87] Assemble time errors and warnings resolved! --- archive/x/x86-64/dijkstra.asm | 138 +++++++++++++++++----------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index af84dabaf..e348df4a0 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -2,7 +2,7 @@ %DEFINE EXIT_OK 0 %DEFINE INVALID_ARGC 1 -%DEFINE INVALID_SRC/DST 2 +%DEFINE INVALID_SRCDST 2 %DEFINE INVALID_NUM_NEG 3 %DEFINE INVALID_CHAR 4 %DEFINE INVALID_NUM_VERTS 5 @@ -39,9 +39,9 @@ %DEFINE minheap@siftDown.left 24 %DEFINE minheap@siftDown.right 32 %DEFINE minheap@siftDown.conditional_BOOLs 40 -%DEFINE minheap@siftDown.conditional_BOOLs-1 36 -%DEFINE minheap@siftDown.conditional_BOOLs-2 40 -%DEFINE minheap@siftDown.conditional_BOOLs-ACCEPT (0x1 + 0x1<<32) +%DEFINE minheap@siftDown.conditional_BOOLs~1 36 +%DEFINE minheap@siftDown.conditional_BOOLs~2 40 +%DEFINE minheap@siftDown.conditional_BOOLs~ACCEPT 0xFFFFFFFFFFFFFFFF %DEFINE minheap@siftUp.STACK_INIT 16 %DEFINE minheap@siftUp.index 8 @@ -63,7 +63,7 @@ ;SYSCALLS -;STDIN/OUT +;STDOUT/OUT %DEFINE SYS_WRITE 1 %DEFINE STDOUT 1 ;Memory @@ -139,21 +139,21 @@ section .data Error_state: .CODE db 0 -struc min_heap: +struc min_heap .arr_size resq 1 .len resq 1 .array resq 1 .elements resq 1 endstruc -struc NodeTuple: +struc NodeTuple .value resd 1 .element resd 1 endstruc ; I want this priority queue as it acts as a great container for the minheap ; and allows for easy abstraction of minheap methods. -struc priority_queue: +struc priority_queue .size resq 1 .heap resq 1 endstruc @@ -235,7 +235,7 @@ SYSCALL PUSH RAX MOV RDI, RBX MOV RSI, RAX -CALL iota +CALL itoa MOV RAX, R10 MOV RAX, SYS_WRITE @@ -349,14 +349,14 @@ MOV RCX, 0 .cont: MOV RSI, RCX CALL atoi - MOVZX RAX, EAX + MOV EAX, EAX ADD RSP, parseSRCDST.STACK_INIT MOV RSP, RBP POP RBP RET .zero: CMP RCX, 0 - CMOVE RAX, [Err_Table+INVALID_SRC/DST] + CMOVE RAX, [Err_Table+INVALID_SRCDST] JE .error JNE .cont .num: @@ -365,7 +365,7 @@ MOV RCX, 0 .error: PUSH RAX MOV RAX, SYS_WRITE - MOV RDI, STDIN + MOV RDI, STDOUT MOV RSI, Error.msg MOV RDX, Error.len SYSCALL @@ -403,7 +403,7 @@ SUB RSP, parseVertices.STACK_INIT MOV [RBP - parseVertices.SRC], RDI MOV [RBP - parseVertices.DST], RSI -MOV [RBP - parseVertices.NumElems], 0 +MOV QWORD [RBP - parseVertices.NumElems], 0 MOV AL, BYTE [RDI] CMP AL, EMPTY_INPUT @@ -419,21 +419,21 @@ MOV [RBP - parseVertices.NumPtr], RDI dq .zero times 31 dq .error dq .space - times 11 .error + times 11 dq .error dq .comma times 3 dq .error times 10 dq .num times 197 dq .error .num: - CMP [RBP - parseVertices.PrevState], Parse.STATE.START + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.START JE .errSkip PUSH RDI PUSH RAX MOV RAX, [RBP - parseVertices.NumPtr] MOV RAX, [RAX] ADD RDI, RCX - CMP [RBP - parseVertices.PrevState], Parse.STATE.SPACE + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.SPACE CMOVE RAX, RDI MOV [RBP - parseVertices.NumPtr], RAX POP RAX @@ -442,13 +442,13 @@ MOV [RBP - parseVertices.NumPtr], RDI CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JMP .error .errSkip: - INC [RBP - parseVertices.strlen] + INC QWORD [RBP - parseVertices.strlen] INC RCX - MOV [RBP - parseVertices.PrevState], Parse.STATE.NUM + MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM JMP .validate .comma: - CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error @@ -469,34 +469,34 @@ MOV [RBP - parseVertices.NumPtr], RDI POP RSI POP RDI POP RAX - CMP [RBP - parseVertices.PrevState], PARSE.STATE.ZERO + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.ZERO JE .zero_cont - MOV [RBP - parseVertices.PrevState], PARSE.STATE.COMMA - MOV [RBP - parseVertices.strlen], 0 + MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.COMMA + MOV QWORD [RBP - parseVertices.strlen], 0 INC RCX - INC [RBP - parseVertices.NumElems] + INC QWORD [RBP - parseVertices.NumElems] JMP .validate .space: - CMP [RBP - parseVertices.PrevState], Parse.STATE.COMMA + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.COMMA CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error JMP .validate .zero: - CMP [RBP - parseVertices.PrevState], Parse.STATE.NUM + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error CMP RCX, 0 CMOVE RDI, [Err_Table+INVALID_BAD_STR] JE .error - MOV [RBP - parseVertices.PrevState], Parse.STATE.ZERO + MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.ZERO JMP .zero_jmp ; I don't like this backwards GOTO. .zero_cont: JMP .cont .cont: - MOV RAX, [RBP - parseVertices.NumElemes] + MOV RAX, [RBP - parseVertices.NumElems] ADD RSP, parseVertices.STACK_INIT MOV RSP, RBP @@ -505,7 +505,7 @@ MOV [RBP - parseVertices.NumPtr], RDI .error: PUSH RDI MOV RAX, SYS_WRITE - MOV RDI, STDIN + MOV RDI, STDOUT MOV RSI, Error.msg MOV RDX, Error.len SYSCALL @@ -553,7 +553,7 @@ MOV [RBP - dijkstra.CurrTex], RDI MOV RDI, R10 CALL priority_queue@construct -MOV [RBP - dijkstra.priority_queue], RAX +MOV [RBP - dijkstra.PriorityQueue], RAX PUSH R10 PUSH R10 @@ -601,8 +601,8 @@ MOV RDX, [RBP - dijkstra.PriorityQueue] CMP RCX, [RBP - dijkstra.SRC] JE .vtx_loop_cont - MOV [RDI+RCX*SIZE_INT], INF - MOV [RSI+RCX*SIZE_INT], -1 + MOV DWORD [RDI+RCX*SIZE_INT], INF + MOV DWORD [RSI+RCX*SIZE_INT], -1 PUSH RDI PUSH RSI @@ -638,7 +638,7 @@ MOV RBX, [RBP - dijkstra.dist] MOV RDI, R13 CALL priority_queue@pop MOV R12, RAX - MOVZX EDI, DWORD [R12 + NodeTuple.value] + MOV EDI, DWORD [R12 + NodeTuple.value] MOV [RBP - dijkstra.CurrTex], RDI MOV RCX, 0 .dijkstra_get_neighbors: @@ -650,7 +650,7 @@ MOV RBX, [RBP - dijkstra.dist] MOV R10, [RBP - dijkstra.graph] ADD R10, RAX .neighbors_loop: - CMP [R10 + RCX*SIZE_INT], NULL + CMP DWORD [R10 + RCX*SIZE_INT], NULL JNE .neighbor_cont INC RCX JMP .neighbors_loop @@ -662,7 +662,7 @@ MOV RBX, [RBP - dijkstra.dist] JAE .neighbors_loop PUSH RSI MOV [RBX + RCX*SIZE_INT], RSI - MOVZX EDI, [R12 + NodeTuple.element] + MOV EDI, DWORD [R12 + NodeTuple.element] PUSH RDI MOV RSI, [RBP - dijkstra.prev] MOV [RSI + RCX*SIZE_INT], EDI @@ -679,7 +679,7 @@ MOV RBX, [RBP - dijkstra.dist] CMP RCX, [RBP - dijkstra.NumVerts] JAE .dijkstra_loop JB .neighbors_loop - +.dijkstra_exit: MOV RAX, [RBP - dijkstra.dist] ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP @@ -745,17 +745,17 @@ priority_queue@push: MOV EDX, [ESI + NodeTuple.element] MOV ESI, [ESI + NodeTuple.value] MOV R10, [RDI + priority_queue.heap] -MOV R8, [R10 + minheap.array] -MOV RCX, [R10 + minheap.elements] -MOV R9, [R10 + minheap.len] +MOV R8, [R10 + min_heap.array] +MOV RCX, [R10 + min_heap.elements] +MOV R9, [R10 + min_heap.len] MOV [R8 + R9*SIZE_INT], ESI MOV [RCX + R9*SIZE_INT], EDX -INC [R10 + minheap.len] -INC [RDI + priority_queue.size] +INC QWORD [R10 + min_heap.len] +INC QWORD [RDI + priority_queue.size] DEC R9 MOV RDI, R10 -MOV ESI, R9 +MOV ESI, R9D CALL minheap@siftUp RET @@ -775,14 +775,14 @@ priority_queue@pop: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -CMP [RDI + priority_queue.size], 0 +CMP QWORD [RDI + priority_queue.size], 0 SETNE AL MOVZX RAX, AL JE .short_circuit MOV RSI, [RDI + priority_queue.heap] -MOV R10, [RSI + minheap.array] -MOV R8, [RSI + minheap.elements] +MOV R10, [RSI + min_heap.array] +MOV R8, [RSI + min_heap.elements] MOV RDX, [R10] PUSH RDX @@ -831,14 +831,14 @@ priority_queue@peek: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -CMP [RDI + priority_queue.size], 0 +CMP QWORD [RDI + priority_queue.size], 0 SETNE AL MOVZX RAX, AL JE .short_circuit MOV RSI, [RDI + priority_queue.heap] -MOV R10, [RSI + minheap.array] -MOV R8, [RSI + minheap.elements] +MOV R10, [RSI + min_heap.array] +MOV R8, [RSI + min_heap.elements] MOV R10, [R10] MOV R8, [R8] @@ -878,7 +878,7 @@ priority_queue@isEmpty: ; Clobbers - RAX, RDI. ; --------------------------------------------------------------------------- MOV RAX, 1 -CMP [RDI + priority_queue.size], 0 +CMP QWORD [RDI + priority_queue.size], 0 SETE AL MOVZX RAX, AL RET @@ -933,7 +933,7 @@ MOV [R8 + RCX*SIZE_INT], RDX MOV RDI, [RDI + priority_queue.heap] -MOV ESI, RCX +MOV ESI, ECX CALL minheap@siftUp .short_circuit: RET @@ -970,7 +970,7 @@ MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL MOV [RBP - priority_queue@construct.PQPtr], RAX -MOV [RAX + priority_queue.size], 0 +MOV QWORD [RAX + priority_queue.size], 0 MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -1053,7 +1053,7 @@ PUSH RBX MOV RBX, RDI MOV [RBP - minheap@siftUp.index], RSI .sift: - CMP [RBP - minheap@siftUp.index], 0 + CMP QWORD [RBP - minheap@siftUp.index], 0 JBE .sift_end MOV RDI, [RBP - minheap@siftUp.index] CALL minheap@parent @@ -1061,18 +1061,18 @@ MOV [RBP - minheap@siftUp.index], RSI MOV R10, RAX MOV R8, RBX MOV R9, RBX - MOV R8, [R8 + minheap.array] + MOV R8, [R8 + min_heap.array] MOV RDX, [R8 + RDX*SIZE_INT] MOV R10, [R8 + R10*SIZE_INT] CMP RDX, R10 JAE .sift_end MOV RDI, RBX - MOV RDI, [RBX + minheap.array] + MOV RDI, [RBX + min_heap.array] MOV RSI, [RBP - minheap@siftUp.index] MOV RDX, RAX CALL minheap@swap MOV RDI, RBX - MOV RDI, [RDI + minheap.elements] + MOV RDI, [RDI + min_heap.elements] CALL minheap@swap MOV [RBP - minheap@siftUp.index], RAX JMP .sift @@ -1125,13 +1125,13 @@ MOV [RBP - minheap@siftDown.index], RSI MOV [RBP - minheap@siftDown.right], RAX MOV R9, RCX CMP RDX, [RBP - minheap@siftDown.minheap_len] - SETB [RBP - minheap@siftDown.conditional_BOOLs-1] - MOV RAX, [RBX + minheap.array] + SETB [RBP - minheap@siftDown.conditional_BOOLs~1] + MOV RAX, [RBX + min_heap.array] MOV RCX, [RAX + RCX*SIZE_INT] MOV RDX, [RAX + RDX*SIZE_INT] CMP RDX, RCX - SETB [RBP - minheap@siftDown.conditional_BOOLs-2] - CMP [RBP - minheap@siftDown.conditional_BOOLs-1], minheap@siftDown.conditional_BOOLs-ACCEPT + SETB [RBP - minheap@siftDown.conditional_BOOLs~2] + CMP QWORD [RBP - minheap@siftDown.conditional_BOOLs~1], minheap@siftDown.conditional_BOOLs~ACCEPT CMOVB R9, [RBP - minheap@siftDown.right] MOV RAX, [RBX + min_heap.array] @@ -1147,7 +1147,7 @@ MOV [RBP - minheap@siftDown.index], RSI MOV RDX, R9 CALL minheap@swap MOV RDI, RBX - MOV RDI, [RDI + minheap.elements] + MOV RDI, [RDI + min_heap.elements] CALL minheap@swap MOV [RBX - minheap@siftDown.index], R9 @@ -1179,10 +1179,10 @@ minheap@swap: ; RAX - () None. ; Clobbers - RDI, R8, R10 ; --------------------------------------------------------------------------- -MOV R10, DWORD [RDI+ESI*SIZE_INT] ;TMP -MOV R8, DWORD [RDI+EDX*SIZE_INT] ;TMP2 -MOV [RDI+ESI*SIZE_INT], R8D -MOV [RDI+EDX*SIZE_INT], R10D +MOV R10D, DWORD [RDI+RSI*SIZE_INT] ;TMP +MOV R8D, DWORD [RDI+RDX*SIZE_INT] ;TMP2 +MOV [RDI+RSI*SIZE_INT], R8D +MOV [RDI+RDX*SIZE_INT], R10D RET @@ -1202,7 +1202,7 @@ minheap@parent: ; RAX - (long) Parent index. ; Clobbers - RAX ; --------------------------------------------------------------------------- -MOV RAX, EDI +MOV EAX, EDI DEC RAX SHR RAX, DIV_2 RET @@ -1222,7 +1222,7 @@ minheap@left: ; RAX - (long) Left element index. ; Clobbers - RAX ; --------------------------------------------------------------------------- -MOV RAX, EDI +MOV EAX, EDI SHL RAX, MUL_2 INC RAX RET @@ -1242,7 +1242,7 @@ minheap@right: ; RAX - (long) Right element index. ; Clobbers - RAX ; --------------------------------------------------------------------------- -MOV RAX, EDI +MOV EAX, EDI SHL RAX, MUL_2 ADD RAX, 2 RET @@ -1281,8 +1281,8 @@ POP RDI MOV [RAX + min_heap.array], RDI MOV [RAX + min_heap.elements], RSI -MOV [RAX + min_heap.array_size], RDX -MOV [RAX + min_heap.len], 0 +MOV [RAX + min_heap.arr_size], RDX +MOV QWORD [RAX + min_heap.len], 0 RET minheap@destruct: @@ -1375,7 +1375,7 @@ atoi: MOV RBP, RSP SUB RSP, atoi.STACK_INIT PUSH RBX - MOV QWORD [RBP - atoi.ret] + MOV QWORD [RBP - atoi.ret], 0 MOV RBX, 10 ;Multiplier MOV RCX, 0 From 0d02ebcec5b62ec05403f58f432d5ccdb7d490c5 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 15:45:20 -0800 Subject: [PATCH 62/87] Fixed the malformed function prologues. SIGSEGV at RIP 0x0 is horrifying to witness. --- archive/x/x86-64/dijkstra.asm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e348df4a0..952b2d2ac 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -186,11 +186,9 @@ CMP RAX, -1 CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] JE .error MOV [RSP - _start.NumVerts], RAX - MOV RDI, [RBP + _start.argv2] CALL parseSRCDST MOV [RBP + _start.SRC], RAX - MOV RDI, [RBP + _start.argv3] CALL parseSRCDST MOV [RBP + _start.DST], RAX @@ -333,13 +331,13 @@ parseSRCDST: ; EAX - (int) SRC/DST ; Clobbers - RAX, RDI, RSI, RCX, RDX ; --------------------------------------------------------------------------- -MOV RBP, RSP PUSH RBP +MOV RBP, RSP SUB RSP, parseSRCDST.STACK_INIT MOV RCX, 0 .validate: - MOV DL, BYTE [RDI] + MOV DL, BYTE [RDI+RCX] JMP [.jmpTable + RDX*SIZE_LONG] .jmpTable: dq .zero @@ -397,8 +395,8 @@ parseVertices: %DEFINE Parse.STATE.COMMA 0010b %DEFINE Parse.STATE.SPACE 0100b %DEFINE Parse.STATE.ZERO 1000b -MOV RBP, RSP PUSH RBP +MOV RBP, RSP SUB RSP, parseVertices.STACK_INIT MOV [RBP - parseVertices.SRC], RDI @@ -536,8 +534,8 @@ dijkstra: ; RAX - (int[]*) Array of distances. ; Clobbers - RAX, RSI, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -MOV RBP, RSP PUSH RBP +MOV RBP, RSP SUB RSP, dijkstra.STACK_INIT PUSH RBX PUSH R11 @@ -1388,7 +1386,7 @@ atoi: ADD RAX, R8 MOV QWORD [RBP - atoi.ret], RAX CMP RCX, RSI ;Compare counter to Strlen - JNE .operation + JBE .operation MOV RAX, QWORD [RBP - atoi.ret] POP RBX From 1662cf43da400c2975a2967885d979d45e05eae4 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 15:58:45 -0800 Subject: [PATCH 63/87] Fixed incorrect arg offsets in %DEFINEs --- archive/x/x86-64/dijkstra.asm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 952b2d2ac..e44c976ce 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -87,11 +87,11 @@ ;Start -%DEFINE _start.argc 8 -%DEFINE _start.argv0 16 -%DEFINE _start.argv1 24 -%DEFINE _start.argv2 32 -%DEFINE _start.argv3 40 +%DEFINE _start.argc 0 +%DEFINE _start.argv0 8 +%DEFINE _start.argv1 16 +%DEFINE _start.argv2 24 +%DEFINE _start.argv3 32 ; RBP+ ^ ; RBP- v %DEFINE _start.STACK_INIT 40 @@ -188,7 +188,7 @@ JE .error MOV [RSP - _start.NumVerts], RAX MOV RDI, [RBP + _start.argv2] CALL parseSRCDST -MOV [RBP + _start.SRC], RAX +MOV [RBP - _start.SRC], RAX MOV RDI, [RBP + _start.argv3] CALL parseSRCDST MOV [RBP + _start.DST], RAX From 3a1f1f80d74bee06cbc94a234e0efee92b58ec93 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 17:23:22 -0800 Subject: [PATCH 64/87] Fixed jump table in parseSRCDST. --- archive/x/x86-64/dijkstra.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index e44c976ce..b8141d169 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -341,9 +341,9 @@ MOV RCX, 0 JMP [.jmpTable + RDX*SIZE_LONG] .jmpTable: dq .zero - times 48 dq .error + times 47 dq .error times 10 dq .num - times 197 dq .error + times 198 dq .error .cont: MOV RSI, RCX CALL atoi From fa929a64c8efc53a5bfebbde20318a20a0b9266a Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 18:43:33 -0800 Subject: [PATCH 65/87] Fixed ezsqrt. --- archive/x/x86-64/dijkstra.asm | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index b8141d169..47a36bb83 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -171,16 +171,18 @@ SUB RSP, _start.STACK_INIT MOV RAX, [RBP + _start.argv1] MOV RCX, 0 +MOV RDX, 0 .count_commas: CMP BYTE [RAX + RCX], 0 JE .count_end CMP BYTE [RAX + RCX], ',' SETE BL - MOVZX RBX, BL - ADD RCX, RBX - MOV RBX, 0 + ADD RDX, RBX + INC RCX + JMP .count_commas .count_end: -MOV RDI, RCX +MOV RDI, RDX +INC RDI ; + 1 because there's one less comma than numbers. CALL ezsqrt CMP RAX, -1 CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] @@ -195,7 +197,6 @@ MOV [RBP + _start.DST], RAX MOV RAX, [RBP - _start.NumVerts] MUL RAX - PUSH RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -206,7 +207,6 @@ MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL MOV [RBP - _start.graph], RAX - MOV RDI, [RBP + _start.argv1] MOV RSI, [RBP - _start.graph] CALL parseVertices @@ -398,12 +398,11 @@ parseVertices: PUSH RBP MOV RBP, RSP SUB RSP, parseVertices.STACK_INIT - MOV [RBP - parseVertices.SRC], RDI MOV [RBP - parseVertices.DST], RSI MOV QWORD [RBP - parseVertices.NumElems], 0 -MOV AL, BYTE [RDI] +MOV RAX, RDI CMP AL, EMPTY_INPUT CMOVE RAX, [Err_Table+INVALID_EMPTY] JE .error @@ -1343,11 +1342,14 @@ ezsqrt: MOV RAX, RCX MUL RCX CMP RAX, RDI + JE .ext INC RCX CMOVA RAX, RDX + JA .short_circuit JB .sqrt_loop + .ext: MOV RAX, RCX - + .short_circuit: MOV RSP, RBP POP RBP RET From e29373fc45f5ac898c9f01f8c0e26376f9e11173 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 21:42:36 -0800 Subject: [PATCH 66/87] Did some more bugfixes. --- archive/x/x86-64/dijkstra.asm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 47a36bb83..2e3251459 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -168,7 +168,6 @@ _start: MOV RBP, RSP PUSH RBP SUB RSP, _start.STACK_INIT - MOV RAX, [RBP + _start.argv1] MOV RCX, 0 MOV RDX, 0 @@ -180,20 +179,20 @@ MOV RDX, 0 ADD RDX, RBX INC RCX JMP .count_commas -.count_end: +.count_end: MOV RDI, RDX INC RDI ; + 1 because there's one less comma than numbers. CALL ezsqrt +MOV [RBP - _start.NumVerts], RAX CMP RAX, -1 CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] JE .error -MOV [RSP - _start.NumVerts], RAX MOV RDI, [RBP + _start.argv2] CALL parseSRCDST MOV [RBP - _start.SRC], RAX MOV RDI, [RBP + _start.argv3] CALL parseSRCDST -MOV [RBP + _start.DST], RAX +MOV [RBP - _start.DST], RAX MOV RAX, [RBP - _start.NumVerts] MUL RAX @@ -201,6 +200,7 @@ PUSH RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR POP RSI +SHL RSI, MUL_4 MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD @@ -347,6 +347,7 @@ MOV RCX, 0 .cont: MOV RSI, RCX CALL atoi + MOV EAX, EAX ADD RSP, parseSRCDST.STACK_INIT MOV RSP, RBP @@ -1376,7 +1377,6 @@ atoi: SUB RSP, atoi.STACK_INIT PUSH RBX MOV QWORD [RBP - atoi.ret], 0 - MOV RBX, 10 ;Multiplier MOV RCX, 0 MOV R8B, BYTE [RDI+RCX] From c7225a7f48ff682e14b6540dd3f38c8c8407b127 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 22:09:26 -0800 Subject: [PATCH 67/87] Slowly fixing the program. Just fixed parseVertices. --- archive/x/x86-64/dijkstra.asm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2e3251459..f9d9eafe7 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -450,7 +450,7 @@ MOV [RBP - parseVertices.NumPtr], RDI CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error - .zero_jmp: + .zero_jmp: PUSH RAX PUSH RDI PUSH RSI @@ -479,7 +479,8 @@ MOV [RBP - parseVertices.NumPtr], RDI CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.COMMA CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error - + INC RCX + MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.SPACE JMP .validate .zero: CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM From a61d40a22db03bd25a0688aa258d1f69a8e7799c Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 23:07:43 -0800 Subject: [PATCH 68/87] Knocked out a nasty bug involving the sift up operation on minheap. --- archive/x/x86-64/dijkstra.asm | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index f9d9eafe7..82356aa61 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -678,7 +678,11 @@ MOV RBX, [RBP - dijkstra.dist] CMP RCX, [RBP - dijkstra.NumVerts] JAE .dijkstra_loop JB .neighbors_loop -.dijkstra_exit: +.dijkstra_exit: +POP R13 +POP R12 +POP R11 +POP RBX MOV RAX, [RBP - dijkstra.dist] ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP @@ -741,8 +745,8 @@ priority_queue@push: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -MOV EDX, [ESI + NodeTuple.element] -MOV ESI, [ESI + NodeTuple.value] +MOV EDX, DWORD [RSI + NodeTuple.element] +MOV ESI, DWORD [RSI + NodeTuple.value] MOV R10, [RDI + priority_queue.heap] MOV R8, [R10 + min_heap.array] MOV RCX, [R10 + min_heap.elements] @@ -754,7 +758,8 @@ INC QWORD [R10 + min_heap.len] INC QWORD [RDI + priority_queue.size] DEC R9 MOV RDI, R10 -MOV ESI, R9D +MOV RSI, [R10 + min_heap.len] +INT3 CALL minheap@siftUp RET @@ -956,6 +961,7 @@ priority_queue@construct: PUSH RBP MOV RBP, RSP SUB RSP, priority_queue@construct.STACK_INIT +PUSH R13 PUSH RDI PUSH RDI @@ -979,9 +985,8 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV RDI, RAX +MOV R13, RAX -MOV [RBP - priority_queue@construct.PQPtr], RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR POP RSI ; size pushed to stack earlier. @@ -990,13 +995,16 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV RSI, RAX +MOV RDI, R13 +MOV RSI, RAX POP RDX ; Size, again CALL minheap@construct MOV RDI, [RBP - priority_queue@construct.PQPtr] MOV [RDI + priority_queue.heap], RAX +POP R13 +MOV RAX, [RBP - priority_queue@construct.PQPtr] ADD RSP, priority_queue@construct.STACK_INIT MOV RSP, RBP POP RBP @@ -1031,7 +1039,7 @@ RET minheap@siftUp: ; ---------------------------------------------------------------------------- -; Function: minheap swap +; Function: minheap sift up ; Description: ; Restores min-heap by moving new element upward. ; Parameters: @@ -1061,6 +1069,7 @@ MOV [RBP - minheap@siftUp.index], RSI MOV R8, RBX MOV R9, RBX MOV R8, [R8 + min_heap.array] + INT3 MOV RDX, [R8 + RDX*SIZE_INT] MOV R10, [R8 + R10*SIZE_INT] CMP RDX, R10 From 7b8a555fa4efc0136549c92c58d957a526a27d54 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 2 Nov 2025 23:09:47 -0800 Subject: [PATCH 69/87] Forgot to remove INT3s --- archive/x/x86-64/dijkstra.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 82356aa61..720fe1733 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -759,7 +759,7 @@ INC QWORD [RDI + priority_queue.size] DEC R9 MOV RDI, R10 MOV RSI, [R10 + min_heap.len] -INT3 + CALL minheap@siftUp RET @@ -1069,7 +1069,7 @@ MOV [RBP - minheap@siftUp.index], RSI MOV R8, RBX MOV R9, RBX MOV R8, [R8 + min_heap.array] - INT3 + MOV RDX, [R8 + RDX*SIZE_INT] MOV R10, [R8 + R10*SIZE_INT] CMP RDX, R10 From 8d3991088752e80ce20816121b2d9bca0c5ce2e3 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 3 Nov 2025 19:23:53 -0800 Subject: [PATCH 70/87] Committing this small fix before I make any big changes to my testing code. --- archive/x/x86-64/dijkstra.asm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 720fe1733..fa03936f9 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -642,6 +642,7 @@ MOV RBX, [RBP - dijkstra.dist] MOV RCX, 0 .dijkstra_get_neighbors: MOV R8, [RBP - dijkstra.CurrTex] + MOV RAX, R8 MOV R9, [RBP - dijkstra.NumVerts] MUL R9 @@ -655,7 +656,9 @@ MOV RBX, [RBP - dijkstra.dist] JMP .neighbors_loop .neighbor_cont: MOV RSI, RBX + MOV R8, [RBP - dijkstra.CurrTex] MOV RSI, [RSI + R8*SIZE_INT] + INT3 ADD RSI, [R10 + RCX*SIZE_INT] CMP RSI, [RBX + RCX*SIZE_INT] JAE .neighbors_loop @@ -922,7 +925,7 @@ priority_queue@decreaseKey: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8. ; --------------------------------------------------------------------------- - +PUSH R12 MOV R10, [RDI + priority_queue.heap] MOV R8, [R10 + min_heap.array] MOV R10, [R10 + min_heap.elements] @@ -930,16 +933,20 @@ MOV RCX, 0 .search: ; I really don't like having to implement a linear search, but a hashtable will take way too long to implement. CMP RCX, [RDI + priority_queue.size] JAE .short_circuit ;Not found - MOV RCX, [R10 + RCX*SIZE_INT] - CMP RCX, RSI + MOV R12, [R10 + RCX*SIZE_INT] + CMP R12, RSI + JE .break_search + INC RCX JNE .search +.break_search: +CMP RDX, [R8 + RCX*SIZE_INT] +JAE .short_circuit MOV [R8 + RCX*SIZE_INT], RDX - - MOV RDI, [RDI + priority_queue.heap] MOV ESI, ECX CALL minheap@siftUp .short_circuit: +POP R12 RET priority_queue@construct: From fc887c52abd59873e9f2ae9170ed39ecb0bf22d0 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 4 Nov 2025 06:33:14 -0800 Subject: [PATCH 71/87] Program getting further! Before it was getting deadlocked in Dijkstra, now it's segfaulting in itoa. --- archive/x/x86-64/dijkstra.asm | 116 ++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index fa03936f9..67f5d4958 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -132,7 +132,10 @@ Err_Table: ; This is absurd but this because of CMOV not allowing immediates. db -7 db -8 db -9 - + +BOOLs: + .TRUE dq 1 + .FALSE dq 0 section .data @@ -542,6 +545,7 @@ PUSH RBX PUSH R11 PUSH R12 PUSH R13 +PUSH R14 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.DST], RSI @@ -625,63 +629,67 @@ MOV RDX, [RBP - dijkstra.PriorityQueue] .v_loop_exit: -MOV R13, [RBP- dijkstra.PriorityQueue] -MOV RBX, [RBP - dijkstra.dist] - .dijkstra_loop: +MOV R13, [RBP - dijkstra.PriorityQueue] + .queue_loop: MOV RDI, R13 CALL priority_queue@isEmpty - MOV R11, RAX - CMP R11, TRUE - JE .dijkstra_exit + CMP RAX, TRUE + JE .finish MOV RDI, R13 CALL priority_queue@pop - MOV R12, RAX - MOV EDI, DWORD [R12 + NodeTuple.value] - MOV [RBP - dijkstra.CurrTex], RDI + + MOV R11, [RAX + NodeTuple.value] + MOV R12, [RAX + NodeTuple.element] + + PUSH RAX + MOV RAX, R12 + MUL RAX + MOV RBX, SIZE_INT + MUL RBX + MOV R14, [RBP - dijkstra.graph] + LEA R14, [R14 + RAX] + MOV RCX, 0 - .dijkstra_get_neighbors: - MOV R8, [RBP - dijkstra.CurrTex] - - MOV RAX, R8 - MOV R9, [RBP - dijkstra.NumVerts] - MUL R9 - - MOV R10, [RBP - dijkstra.graph] - ADD R10, RAX - .neighbors_loop: - CMP DWORD [R10 + RCX*SIZE_INT], NULL - JNE .neighbor_cont - INC RCX - JMP .neighbors_loop - .neighbor_cont: - MOV RSI, RBX - MOV R8, [RBP - dijkstra.CurrTex] - MOV RSI, [RSI + R8*SIZE_INT] - INT3 - ADD RSI, [R10 + RCX*SIZE_INT] - CMP RSI, [RBX + RCX*SIZE_INT] - JAE .neighbors_loop - PUSH RSI - MOV [RBX + RCX*SIZE_INT], RSI - MOV EDI, DWORD [R12 + NodeTuple.element] - PUSH RDI - MOV RSI, [RBP - dijkstra.prev] - MOV [RSI + RCX*SIZE_INT], EDI - MOV RDI, R13 - POP RSI - POP RDX - PUSH R10 - PUSH RCX - - CALL priority_queue@decreaseKey - POP RCX - POP R10 - INC RCX - CMP RCX, [RBP - dijkstra.NumVerts] - JAE .dijkstra_loop - JB .neighbors_loop + MOV RAX, R12 + MUL RAX + MOV RDX, SIZE_INT + MUL RDX + MOV RDX, R12 + MOV R8, [RBP - dijkstra.dist] + MOV R9, [RBP - dijkstra.prev] + + MOV R10, 0 + .neighbors: + ADD R10, [R8+R12*SIZE_INT] + ADD R10, [R14+RCX*SIZE_INT] + + CMP R10, [R8+RCX*SIZE_INT] + CMOVB R11, R10 + CMOVAE R11, [R8+RCX*SIZE_INT] + MOV [R8+RCX*SIZE_INT], R11D + CMOVB R11, R12 + CMOVAE R11, [R9+RCX*SIZE_INT] + MOV R11, [R9+RCX*SIZE_INT] + + MOV RDI, R13 + MOV RSI, RCX + MOV RDX, R10 + PUSH R10 + CALL priority_queue@decreaseKey + CMP RAX, TRUE + JE .queue_loop + MOV RDI, R13 + POP RDX + CALL dijkstra~GenerateTuple + MOV RDI, R13 + MOV RSI, RAX + CALL priority_queue@push + JMP .queue_loop +.finish: + .dijkstra_exit: +POP R14 POP R13 POP R12 POP R11 @@ -922,8 +930,8 @@ priority_queue@decreaseKey: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - () None. -; Clobbers - RDI, RSI, RCX, RDX, R10, R8. +; EAX - (int) EAX == 0 : NOT IN QUEUE; EAX == 1 : IN QUEUE. +; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8. ; --------------------------------------------------------------------------- PUSH R12 MOV R10, [RDI + priority_queue.heap] @@ -932,6 +940,8 @@ MOV R10, [R10 + min_heap.elements] MOV RCX, 0 .search: ; I really don't like having to implement a linear search, but a hashtable will take way too long to implement. CMP RCX, [RDI + priority_queue.size] + CMOVAE EAX, [BOOLs.FALSE] + CMOVB EAX, [BOOLs.TRUE] JAE .short_circuit ;Not found MOV R12, [R10 + RCX*SIZE_INT] CMP R12, RSI From 3fa7e7acc149ec4ff4cabaea1f81d46968fd97a9 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 5 Nov 2025 02:19:43 -0800 Subject: [PATCH 72/87] Fixed some logic and especially atoi (I seriously have zero clue why I made such a horrendous error on that function). --- archive/x/x86-64/dijkstra.asm | 289 +++++++++++++++------------------- 1 file changed, 131 insertions(+), 158 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 67f5d4958..77812f1a5 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -18,7 +18,7 @@ %DEFINE SIZE_INT 4 %DEFINE SIZE_LONG 8 %DEFINE EMPTY_INPUT 0 -%DEFINE INF 0xFFFFFFFF +%DEFINE INT_MAX 0xFFFFFFFF %DEFINE NULL 0 %DEFINE FALSE 0 %DEFINE TRUE 1 @@ -107,9 +107,8 @@ %DEFINE dijkstra.prev 24 %DEFINE dijkstra.dist 32 %DEFINE dijkstra.SRC 40 -%DEFINE dijkstra.DST 48 -%DEFINE dijkstra.graph 56 -%DEFINE dijkstra.CurrTex 64 +%DEFINE dijkstra.graph 48 +%DEFINE dijkstra.CurrTex 56 @@ -213,13 +212,16 @@ MOV [RBP - _start.graph], RAX MOV RDI, [RBP + _start.argv1] MOV RSI, [RBP - _start.graph] CALL parseVertices - MOV RDI, [RBP - _start.SRC] -MOV RSI, [RBP - _start.DST] -MOV RDX, [RBP - _start.graph] -MOV R10, [RBP - _start.NumVerts] +MOV RSI, [RBP - _start.graph] +.chkGrph: +MOV RDX, [RBP - _start.NumVerts] CALL dijkstra - +.dijkstra_complete: +;$1 = {-2657552, -1, -1, -1, -1, 0, 0, 0, 0, 0} +;This means there's likely an issue with the pointers I was using +;to pull data from. +;The -1s look good, but the position of the non -1 number is odd. MOV RCX, [RBP - _start.DST] MOV RBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX @@ -296,6 +298,7 @@ MOV RBX, 10 .ext: MOV BYTE [RSI + RCX], 0 PUSH RCX + DEC RCX MOV RDX, 0 .reverse: @@ -415,6 +418,7 @@ MOV RCX, 0 MOV [RBP - parseVertices.NumPtr], RDI .validate: MOV DL, BYTE [RDI+RCX] + JMP [.jmpTable + RDX*SIZE_LONG] .jmpTable: dq .zero @@ -459,11 +463,12 @@ MOV [RBP - parseVertices.NumPtr], RDI PUSH RSI PUSH RCX PUSH RDX + PUSH RCX MOV RDI, [RBP - parseVertices.NumPtr] MOV RSI, [RBP - parseVertices.strlen] CALL atoi MOV RDI, [RBP - parseVertices.DST] - MOV RCX, [RBP - parseVertices.NumElems] + POP RCX MOV [RDI + RCX*SIZE_INT], EAX POP RDX POP RCX @@ -499,7 +504,6 @@ MOV [RBP - parseVertices.NumPtr], RDI .cont: MOV RAX, [RBP - parseVertices.NumElems] - ADD RSP, parseVertices.STACK_INIT MOV RSP, RBP POP RBP @@ -529,172 +533,119 @@ dijkstra: ; The algorithm of study itself, Dijkstra. ; Parameters: ; RDI - (int) SRC. -; RSI - (int) DST. -; RDX - (int[][]*) Graph to vertice&edges. -; R10 - (int) # Vertices. +; RSI - (int[][]*) Graph to vertice&edges. +; RDX - (int) # Vertices. +; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - (int[]*) Array of distances. -; Clobbers - RAX, RSI, RDX, R10, R8, R9. +; Clobbers - RAX, RDI, RSI, RDX, R10, R11. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, dijkstra.STACK_INIT -PUSH RBX -PUSH R11 PUSH R12 PUSH R13 PUSH R14 - MOV [RBP - dijkstra.SRC], RDI -MOV [RBP - dijkstra.DST], RSI -MOV [RBP - dijkstra.graph], RDX -MOV [RBP - dijkstra.NumVerts], R10 - -MOV [RBP - dijkstra.CurrTex], RDI - -MOV RDI, R10 -CALL priority_queue@construct -MOV [RBP - dijkstra.PriorityQueue], RAX +MOV [RBP - dijkstra.graph], RSI +MOV [RBP - dijkstra.NumVerts], RDX PUSH R10 -PUSH R10 - -MOV RAX, SYS_MMAP -MOV RDI, NO_ADDR -POP RSI -SHL RSI, MUL_4 -MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS -MOV R8, NO_FD -MOV R9, NO_OFFSET -SYSCALL -MOV [RBP - dijkstra.dist], RAX +PUSH R8 +PUSH R9 MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -POP RSI +MOV RSI, [RBP - dijkstra.NumVerts] SHL RSI, MUL_4 MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R10, MAP_ANONYMOUS | MAP_SHARED MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RBP - dijkstra.prev], RAX +POP R9 +POP R8 +POP R10 + + +MOV [RBP - dijkstra.dist], RAX +MOV RCX, 0 + .fill_dist: + CMP RCX, R12 + JA .fill_ext + MOV DWORD [RAX+RCX*4], INT_MAX + INC RCX + JMP .fill_dist +.fill_ext: +MOV RDI, [RBP - dijkstra.NumVerts] +CALL priority_queue@construct +MOV [RBP - dijkstra.PriorityQueue], RAX -MOV RDI, [RBP - dijkstra.dist] -MOV RSI, [RBP - dijkstra.CurrTex] -MOV DWORD [RDI + RSI], 0 +MOV RDI, [RBP - dijkstra.SRC] +MOV RAX, [RBP - dijkstra.dist] +MOV DWORD [RAX + RDI*SIZE_INT], 0 +.checkDst1: -MOV RDI, RSI MOV RSI, 0 CALL dijkstra~GenerateTuple - -MOV RDI, [RBP - dijkstra.PriorityQueue] MOV RSI, RAX +MOV RDI, [RBP - dijkstra.PriorityQueue] CALL priority_queue@push - -MOV RCX, 0 -MOV RDI, [RBP - dijkstra.dist] -MOV RSI, [RBP - dijkstra.prev] -MOV RDX, [RBP - dijkstra.PriorityQueue] - .add_vertex_loop: - CMP RCX, [RBP - dijkstra.NumVerts] - JAE .v_loop_exit - CMP RCX, [RBP - dijkstra.SRC] - JE .vtx_loop_cont - - MOV DWORD [RDI+RCX*SIZE_INT], INF - MOV DWORD [RSI+RCX*SIZE_INT], -1 - - PUSH RDI - PUSH RSI - PUSH RCX - PUSH RDX - - MOV RDI, -1 - MOV RSI, INF - CALL dijkstra~GenerateTuple - MOV RDI, [RBP - dijkstra.PriorityQueue] - MOV RSI, RAX - CALL priority_queue@push - - POP RDX - POP RCX - POP RSI - POP RDI - .vtx_loop_cont: ; Fall through ^ - INC RCX - JMP .add_vertex_loop - - -.v_loop_exit: -MOV R13, [RBP - dijkstra.PriorityQueue] - .queue_loop: - MOV RDI, R13 +MOV R12, [RBP - dijkstra.PriorityQueue] +MOV R13, [RBP - dijkstra.dist] + .dijkstra_loop: + MOV RDI, R12 CALL priority_queue@isEmpty CMP RAX, TRUE - JE .finish + JE .dijkstra_ext - MOV RDI, R13 + MOV RDI, R12 CALL priority_queue@pop - MOV R11, [RAX + NodeTuple.value] - MOV R12, [RAX + NodeTuple.element] + MOV EDI, [RAX + NodeTuple.value] + MOV ESI, [RAX + NodeTuple.element] + MOV [RBP - dijkstra.CurrTex], RSI - PUSH RAX - MOV RAX, R12 - MUL RAX - MOV RBX, SIZE_INT - MUL RBX - MOV R14, [RBP - dijkstra.graph] - LEA R14, [R14 + RAX] + CMP RDI, [R13 + RSI*SIZE_INT] + JE .dijkstra_loop + MOV RDI, [RBP - dijkstra.graph] + MOV RDX, [RBP - dijkstra.NumVerts] + CALL dijkstra~GetRow + MOV R14, RAX MOV RCX, 0 - MOV RAX, R12 - MUL RAX - MOV RDX, SIZE_INT - MUL RDX - MOV RDX, R12 - MOV R8, [RBP - dijkstra.dist] - MOV R9, [RBP - dijkstra.prev] - - MOV R10, 0 - .neighbors: - ADD R10, [R8+R12*SIZE_INT] - ADD R10, [R14+RCX*SIZE_INT] - - CMP R10, [R8+RCX*SIZE_INT] - CMOVB R11, R10 - CMOVAE R11, [R8+RCX*SIZE_INT] - MOV [R8+RCX*SIZE_INT], R11D - CMOVB R11, R12 - CMOVAE R11, [R9+RCX*SIZE_INT] - MOV R11, [R9+RCX*SIZE_INT] - - MOV RDI, R13 - MOV RSI, RCX - MOV RDX, R10 - PUSH R10 - CALL priority_queue@decreaseKey - CMP RAX, TRUE - JE .queue_loop - MOV RDI, R13 - POP RDX - CALL dijkstra~GenerateTuple - MOV RDI, R13 - MOV RSI, RAX - CALL priority_queue@push - JMP .queue_loop -.finish: - -.dijkstra_exit: + .neighbor_loop: + CMP RCX, [RBP - dijkstra.NumVerts] + JAE .dijkstra_loop + + MOV EDI, [R14 + RCX*SIZE_INT] + CMP RDI, 0 + JNE .neighbor_cont ; Branch predictor is not gonna like this. + INC RCX + JMP .neighbor_loop + .neighbor_cont: + MOV RBX, [RBP - dijkstra.CurrTex] + MOV R10D, [R13 + RBX*SIZE_INT] + ADD R10, RDX + CMP R10D, [R13 + RCX*SIZE_INT] + JB .neighbor_operate + INC RCX + JMP .neighbor_loop + .neighbor_operate: + MOV [R13 + RCX*SIZE_INT], R10D + .checkDst2: + MOV RDI, RCX + MOV ESI, [R13 + RCX*SIZE_INT] + CALL dijkstra~GenerateTuple + MOV RDI, R12 + MOV RSI, RAX + CALL priority_queue@push +MOV RAX, [RBP - dijkstra.graph] +.dijkstra_ext: POP R14 POP R13 POP R12 -POP R11 -POP RBX -MOV RAX, [RBP - dijkstra.dist] ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP POP RBP @@ -739,6 +690,29 @@ POP R10 POP RDX RET +dijkstra~GetRow: +; ---------------------------------------------------------------------------- +; Function: Dijkstra Get Row +; Description: +; Helper method for dijkstra to grab the address of the needed row given a graph. +; Parameters: +; RDI - (int[][]*) Graph. +; RSI - (int) Element. +; RDX - (int) # Vertices. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - (int[]*) Row. +; Clobbers - RAX. +; --------------------------------------------------------------------------- +PUSH RDX +MOV RAX, RSI +MUL RDX +POP RDX +LEA RAX, [RDI + RAX*SIZE_INT] +RET + priority_queue@push: ; ---------------------------------------------------------------------------- @@ -979,10 +953,9 @@ PUSH RBP MOV RBP, RSP SUB RSP, priority_queue@construct.STACK_INIT PUSH R13 +PUSH R12 +MOV R12, RDI -PUSH RDI -PUSH RDI -PUSH RDI MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, priority_queue_size @@ -996,17 +969,18 @@ MOV QWORD [RAX + priority_queue.size], 0 MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -POP RSI ; size pushed to stack earlier. +MOV RSI, R12 MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL +.tstdbg: MOV R13, RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -POP RSI ; size pushed to stack earlier. +MOV RSI, R12 MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD @@ -1015,11 +989,12 @@ SYSCALL MOV RDI, R13 MOV RSI, RAX -POP RDX ; Size, again +MOV RDX, R12 CALL minheap@construct MOV RDI, [RBP - priority_queue@construct.PQPtr] MOV [RDI + priority_queue.heap], RAX +POP R12 POP R13 MOV RAX, [RBP - priority_queue@construct.PQPtr] ADD RSP, priority_queue@construct.STACK_INIT @@ -1396,28 +1371,26 @@ atoi: ; R9 - () Unused. ; Returns: ; EAX - (int) Integer value of string. -; Clobbers - RAX, RDI, RSI, RCX, R8. +; Clobbers - RAX, RCX, R10. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, atoi.STACK_INIT PUSH RBX - MOV QWORD [RBP - atoi.ret], 0 - MOV RBX, 10 ;Multiplier + MOV RCX, 0 - MOV R8B, BYTE [RDI+RCX] - .operation: - MOV RAX, QWORD [RBP - atoi.ret] + MOV RBX, 10 + MOV RAX, 0 + .loop: + MOV R10B, [RDI + RCX] + SUB R10B, '0' MUL RBX + ADD RAX, R10 INC RCX - SUB R8B, '0' - ADD RAX, R8 - MOV QWORD [RBP - atoi.ret], RAX - CMP RCX, RSI ;Compare counter to Strlen - JBE .operation - - MOV RAX, QWORD [RBP - atoi.ret] + CMP RCX, RSI + JB .loop + .ext: POP RBX ADD RSP, atoi.STACK_INIT MOV RSP, RBP From fb956be4dfcd52a3ee25a98faf3fcef31f611a8e Mon Sep 17 00:00:00 2001 From: = Date: Thu, 13 Nov 2025 01:35:11 -0800 Subject: [PATCH 73/87] Made the siftUp and siftDown functions smaller & less register heavy, AND tried fixing the logic. --- archive/x/x86-64/dijkstra.asm | 232 +++++++++++++--------------------- 1 file changed, 87 insertions(+), 145 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 77812f1a5..90448e81d 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -18,7 +18,7 @@ %DEFINE SIZE_INT 4 %DEFINE SIZE_LONG 8 %DEFINE EMPTY_INPUT 0 -%DEFINE INT_MAX 0xFFFFFFFF +%DEFINE MAX_INT 0xFFFFFFFF %DEFINE NULL 0 %DEFINE FALSE 0 %DEFINE TRUE 1 @@ -173,18 +173,21 @@ SUB RSP, _start.STACK_INIT MOV RAX, [RBP + _start.argv1] MOV RCX, 0 MOV RDX, 0 +MOV RBX, 0 .count_commas: CMP BYTE [RAX + RCX], 0 JE .count_end CMP BYTE [RAX + RCX], ',' - SETE BL - ADD RDX, RBX + JNE .skip + INC RBX + .skip: INC RCX JMP .count_commas .count_end: -MOV RDI, RDX -INC RDI ; + 1 because there's one less comma than numbers. +INC RBX +MOV RDI, RBX CALL ezsqrt + MOV [RBP - _start.NumVerts], RAX CMP RAX, -1 CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] @@ -218,10 +221,6 @@ MOV RSI, [RBP - _start.graph] MOV RDX, [RBP - _start.NumVerts] CALL dijkstra .dijkstra_complete: -;$1 = {-2657552, -1, -1, -1, -1, 0, 0, 0, 0, 0} -;This means there's likely an issue with the pointers I was using -;to pull data from. -;The -1s look good, but the position of the non -1 number is odd. MOV RCX, [RBP - _start.DST] MOV RBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX @@ -408,6 +407,7 @@ SUB RSP, parseVertices.STACK_INIT MOV [RBP - parseVertices.SRC], RDI MOV [RBP - parseVertices.DST], RSI MOV QWORD [RBP - parseVertices.NumElems], 0 +MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.START MOV RAX, RDI CMP AL, EMPTY_INPUT @@ -463,12 +463,11 @@ MOV [RBP - parseVertices.NumPtr], RDI PUSH RSI PUSH RCX PUSH RDX - PUSH RCX MOV RDI, [RBP - parseVertices.NumPtr] MOV RSI, [RBP - parseVertices.strlen] CALL atoi + MOV RCX, [RBP - parseVertices.NumElems] MOV RDI, [RBP - parseVertices.DST] - POP RCX MOV [RDI + RCX*SIZE_INT], EAX POP RDX POP RCX @@ -494,7 +493,7 @@ MOV [RBP - parseVertices.NumPtr], RDI CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM CMOVNE RDI, [Err_Table+INVALID_BAD_STR] JNE .error - CMP RCX, 0 + CMP QWORD [RBP - parseVertices.NumElems], 0 CMOVE RDI, [Err_Table+INVALID_BAD_STR] JE .error MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.ZERO @@ -509,16 +508,9 @@ MOV [RBP - parseVertices.NumPtr], RDI POP RBP RET .error: - PUSH RDI - MOV RAX, SYS_WRITE - MOV RDI, STDOUT - MOV RSI, Error.msg - MOV RDX, Error.len - SYSCALL - ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. MOV RAX, SYS_EXIT - POP RDI + MOV RDI, [RBP - parseVertices.PrevState] SYSCALL @@ -568,16 +560,20 @@ POP R9 POP R8 POP R10 +MOV RAX, MAX_INT + -MOV [RBP - dijkstra.dist], RAX +MOV RAX, [RBP - dijkstra.dist] +MOV R12, [RBP - dijkstra.NumVerts] MOV RCX, 0 .fill_dist: CMP RCX, R12 JA .fill_ext - MOV DWORD [RAX+RCX*4], INT_MAX + MOV DWORD [RAX+RCX*4], MAX_INT INC RCX JMP .fill_dist .fill_ext: + MOV RDI, [RBP - dijkstra.NumVerts] CALL priority_queue@construct MOV [RBP - dijkstra.PriorityQueue], RAX @@ -585,8 +581,6 @@ MOV [RBP - dijkstra.PriorityQueue], RAX MOV RDI, [RBP - dijkstra.SRC] MOV RAX, [RBP - dijkstra.dist] MOV DWORD [RAX + RDI*SIZE_INT], 0 -.checkDst1: - MOV RSI, 0 CALL dijkstra~GenerateTuple MOV RSI, RAX @@ -599,20 +593,20 @@ MOV R13, [RBP - dijkstra.dist] CALL priority_queue@isEmpty CMP RAX, TRUE JE .dijkstra_ext - MOV RDI, R12 - CALL priority_queue@pop - + CALL priority_queue@pop MOV EDI, [RAX + NodeTuple.value] MOV ESI, [RAX + NodeTuple.element] + MOV [RBP - dijkstra.CurrTex], RSI CMP RDI, [R13 + RSI*SIZE_INT] - JE .dijkstra_loop - + JA .dijkstra_loop MOV RDI, [RBP - dijkstra.graph] + MOV RSI, [RBP - dijkstra.CurrTex] MOV RDX, [RBP - dijkstra.NumVerts] CALL dijkstra~GetRow + .rowchk: MOV R14, RAX MOV RCX, 0 .neighbor_loop: @@ -640,9 +634,11 @@ MOV R13, [RBP - dijkstra.dist] CALL dijkstra~GenerateTuple MOV RDI, R12 MOV RSI, RAX - CALL priority_queue@push -MOV RAX, [RBP - dijkstra.graph] + CALL priority_queue@push + INC RCX + JMP .neighbor_loop .dijkstra_ext: +MOV RAX, R13 POP R14 POP R13 POP R12 @@ -730,21 +726,21 @@ priority_queue@push: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- +.checkRSI: MOV EDX, DWORD [RSI + NodeTuple.element] MOV ESI, DWORD [RSI + NodeTuple.value] MOV R10, [RDI + priority_queue.heap] MOV R8, [R10 + min_heap.array] MOV RCX, [R10 + min_heap.elements] MOV R9, [R10 + min_heap.len] - +DEC R9 MOV [R8 + R9*SIZE_INT], ESI MOV [RCX + R9*SIZE_INT], EDX +.checkHeap: INC QWORD [R10 + min_heap.len] INC QWORD [RDI + priority_queue.size] -DEC R9 MOV RDI, R10 MOV RSI, [R10 + min_heap.len] - CALL minheap@siftUp RET @@ -764,44 +760,15 @@ priority_queue@pop: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -CMP QWORD [RDI + priority_queue.size], 0 -SETNE AL -MOVZX RAX, AL -JE .short_circuit +PUSH RBP +MOV RBP, RSP -MOV RSI, [RDI + priority_queue.heap] -MOV R10, [RSI + min_heap.array] -MOV R8, [RSI + min_heap.elements] +MOV R12, -1 -MOV RDX, [R10] -PUSH RDX -MOV RDX, [R8] -PUSH RDX -MOV RCX, [RDI + priority_queue.size] -DEC RCX -MOV R9, RCX -MOV [RDI + priority_queue.size], RCX -MOV ECX, [R10 + RCX*SIZE_INT] -MOV [R10], ECX -MOV R9D, [R8 + R9*SIZE_INT] -MOV [R8], R9D -MOV RAX, SYS_MMAP -MOV RDI, NO_ADDR -MOV RSI, NodeTuple_size -MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS -MOV R8, NO_FD -MOV R9, NO_OFFSET -SYSCALL - -POP RSI -POP RDX -MOV [RAX + NodeTuple.value], EDX -MOV [RAX + NodeTuple.element], ESI - -.short_circuit: +MOV RSP, RBP +POP RBP RET priority_queue@peek: @@ -1035,7 +1002,7 @@ minheap@siftUp: ; Description: ; Restores min-heap by moving new element upward. ; Parameters: -; RDI - (Minheap*) This* minheap. Will not juggle this; stays in callee-saved register. +; RDI - (Minheap*) This* minheap. ; ESI - (int) Index. ; RDX - () Unused. ; R10 - () Unused. @@ -1048,36 +1015,28 @@ minheap@siftUp: PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftUp.STACK_INIT -PUSH RBX -MOV RBX, RDI -MOV [RBP - minheap@siftUp.index], RSI + .sift: - CMP QWORD [RBP - minheap@siftUp.index], 0 - JBE .sift_end - MOV RDI, [RBP - minheap@siftUp.index] + MOV R11, RSI + + PUSH RDI + MOV EDI, R11D CALL minheap@parent - MOV RDX, [RBP - minheap@siftUp.index] - MOV R10, RAX - MOV R8, RBX - MOV R9, RBX - MOV R8, [R8 + min_heap.array] + CMP EAX, 0 + JL .siftEXT - MOV RDX, [R8 + RDX*SIZE_INT] - MOV R10, [R8 + R10*SIZE_INT] - CMP RDX, R10 - JAE .sift_end - MOV RDI, RBX - MOV RDI, [RBX + min_heap.array] - MOV RSI, [RBP - minheap@siftUp.index] - MOV RDX, RAX - CALL minheap@swap - MOV RDI, RBX - MOV RDI, [RDI + min_heap.elements] + POP RDI + MOV EDX, [RDI + R11*SIZE_INT] + MOV R10D, [RDI + RAX*SIZE_INT] + CMP R10, RDX + JBE .siftEXT + + MOV EDX, EAX + PUSH RAX CALL minheap@swap - MOV [RBP - minheap@siftUp.index], RAX + POP RSI JMP .sift -.sift_end: -POP RBX +.siftEXT: ADD RSP, minheap@siftUp.STACK_INIT MOV RSP, RBP POP RBP @@ -1088,75 +1047,58 @@ minheap@siftDown: ; Description: ; Restores min-heap by moving root downward. ; Parameters: -; RDI - (Minheap*) This* minheap. Will not juggle this; stays in callee-saved register. +; RDI - (Minheap*) This* minheap. ; ESI - (int) Index. -; RDX - () Unused. +; RDX - (int) Heap size. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RAX, RDI, RSI, RCX, RDX, R9. +; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8, R9, R11. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftDown.STACK_INIT -PUSH RBX ; Minheap* -PUSH R11 -PUSH R12 - -MOV RBX, RDI -MOV RDI, [RBX + min_heap.len] -MOV [RBP - minheap@siftDown.minheap_len], RDI -MOV [RBP - minheap@siftDown.index], RSI .sift: - MOV RDI, [RBP - minheap@siftDown.index] + MOV RCX, RDI + MOV RDI, RSI CALL minheap@left - PUSH RAX - CMP RAX, [RBP - minheap@siftDown.minheap_len] - JA .sift_exit + MOV R10, RAX + CALL minheap@right + MOV R8, RAX + MOV RDI, RCX + MOV RCX, RSI + PUSH RCX + + CMP R10, RDX + JAE .leftEXT + MOV R9, [RDI + R10*SIZE_INT] + MOV R11, [RDI + RCX*SIZE_INT] + CMP R9, R11 + CMOVB RCX, R10 + .leftEXT: + CMP R8, RDX + JAE .rightEXT + MOV R9, [RDI + R8*SIZE_INT] + MOV R11, [RDI + RCX*SIZE_INT] + CMP R9, R11 + CMOVB RCX, R8 POP RAX - MOV RCX, RAX ; Left - MOV [RBP - minheap@siftDown.left], RAX - CALL minheap@right - MOV RDX, RAX ; Right - MOV [RBP - minheap@siftDown.right], RAX - MOV R9, RCX - CMP RDX, [RBP - minheap@siftDown.minheap_len] - SETB [RBP - minheap@siftDown.conditional_BOOLs~1] - MOV RAX, [RBX + min_heap.array] - MOV RCX, [RAX + RCX*SIZE_INT] - MOV RDX, [RAX + RDX*SIZE_INT] - CMP RDX, RCX - SETB [RBP - minheap@siftDown.conditional_BOOLs~2] - CMP QWORD [RBP - minheap@siftDown.conditional_BOOLs~1], minheap@siftDown.conditional_BOOLs~ACCEPT - CMOVB R9, [RBP - minheap@siftDown.right] + CMP RAX, RCX + JE .siftEXT - MOV RAX, [RBX + min_heap.array] - MOV R11, R9 - MOV R11, [RAX + R11*SIZE_INT] - MOV R12, [RBP - minheap@siftDown.index] - MOV R12, [RAX + R12*SIZE_INT] - CMP R11, R12 - JAE .sift_exit - MOV RDI, RBX - MOV RDI, [RDI + min_heap.array] - MOV RSI, [RBP - minheap@siftDown.index] - MOV RDX, R9 - CALL minheap@swap - MOV RDI, RBX - MOV RDI, [RDI + min_heap.elements] + MOV RSI, RAX + MOV RDX, RCX + PUSH RCX CALL minheap@swap - MOV [RBX - minheap@siftDown.index], R9 + POP RSI JMP .sift - -.sift_exit: -POP R12 -POP R11 -POP RBX + +.siftEXT: ADD RSP, minheap@siftDown.STACK_INIT MOV RSP, RBP POP RBP @@ -1177,7 +1119,7 @@ minheap@swap: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RDI, R8, R10 +; Clobbers - RDI, R8, R10. ; --------------------------------------------------------------------------- MOV R10D, DWORD [RDI+RSI*SIZE_INT] ;TMP MOV R8D, DWORD [RDI+RDX*SIZE_INT] ;TMP2 From 53438ac9e1a6e64bb03a91079073bedf7808779b Mon Sep 17 00:00:00 2001 From: = Date: Fri, 14 Nov 2025 19:03:28 -0800 Subject: [PATCH 74/87] Doing a maybe final commit for the PQ implementation; if I can get a simpler version to work, then the PQ/Minheap stuff is axed. --- archive/x/x86-64/dijkstra.asm | 95 ++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 24 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 90448e81d..2b6fcca7b 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -157,6 +157,7 @@ endstruc ; and allows for easy abstraction of minheap methods. struc priority_queue .size resq 1 + .max_len resq 1 .heap resq 1 endstruc @@ -726,22 +727,8 @@ priority_queue@push: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -.checkRSI: -MOV EDX, DWORD [RSI + NodeTuple.element] -MOV ESI, DWORD [RSI + NodeTuple.value] -MOV R10, [RDI + priority_queue.heap] -MOV R8, [R10 + min_heap.array] -MOV RCX, [R10 + min_heap.elements] -MOV R9, [R10 + min_heap.len] -DEC R9 -MOV [R8 + R9*SIZE_INT], ESI -MOV [RCX + R9*SIZE_INT], EDX -.checkHeap: -INC QWORD [R10 + min_heap.len] -INC QWORD [RDI + priority_queue.size] -MOV RDI, R10 -MOV RSI, [R10 + min_heap.len] -CALL minheap@siftUp + + RET priority_queue@pop: @@ -758,15 +745,70 @@ priority_queue@pop: ; R9 - () Unused. ; Returns: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). -; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. +; Clobbers - RDI, RSI, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP +PUSH R12 +PUSH R13 -MOV R12, -1 +MOV R12, 0 +CMP [RDI + priority_queue.size], 0 +CMOVE RAX, R12 +JE .ext +MOV RSI, [RDI + priority_queue.heap] +MOV R10, [RSI + min_heap.array] +MOV R8, [RSI + min_heap.elements] +MOV R10, [R10] +MOV R8, [R8] +PUSH R10 +PUSH R8 +PUSH RDI +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, NodeTuple_size +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +POP RDI + +POP RSI +POP RDX +MOV [RAX + NodeTuple.value], EDX +MOV [RAX + NodeTuple.element], ESI +MOV RCX, RAX + +MOV RSI, [RDI + priority_queue.heap] +MOV RDX, [RSI + min_heap.array] +MOV R10, [RDI + priority_queue.size] +DEC R10 +MOV R8D, [RDX+R10*SIZE_INT] +MOV [RDX], R8D +MOV RDX, [RSI + min_heap.elements] +MOV R8D, [RDX+R10*SIZE_INT] +MOV [RDX], R8D + +DEC [RDI + priority_queue.size] +DEC [RSI + min_heap.len] + +MOV R12, RDI +MOV R12, [RDI + priority_queue.heap] +MOV RSI, 0 +MOV RDX, [RDI + priority_queue.size] +MOV RDI, R12 +PUSH RCX +CALL minheap@siftDown +POP RCX + +MOV RAX, RCX +.ext: +POP R13 ;Ret +POP R12 MOV RSP, RBP POP RBP RET @@ -787,10 +829,12 @@ priority_queue@peek: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -CMP QWORD [RDI + priority_queue.size], 0 -SETNE AL -MOVZX RAX, AL -JE .short_circuit +PUSH R12 + +MOV R12, -1 +CMP [RDI + priority_queue.size], 0 +CMOVE RAX, R12 +JMP .ext MOV RSI, [RDI + priority_queue.heap] MOV R10, [RSI + min_heap.array] @@ -814,7 +858,8 @@ POP RSI POP RDX MOV [RAX + NodeTuple.value], EDX MOV [RAX + NodeTuple.element], ESI -.short_circuit: +.ext: +POP R12 RET priority_queue@isEmpty: @@ -933,6 +978,7 @@ MOV R9, NO_OFFSET SYSCALL MOV [RBP - priority_queue@construct.PQPtr], RAX MOV QWORD [RAX + priority_queue.size], 0 +MOV QWORD [RAX + priority_queue.max_len], R12 MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -1015,6 +1061,7 @@ minheap@siftUp: PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftUp.STACK_INIT +MOV RDI, [RDI + minheap.array] .sift: MOV R11, RSI @@ -1049,7 +1096,7 @@ minheap@siftDown: ; Parameters: ; RDI - (Minheap*) This* minheap. ; ESI - (int) Index. -; RDX - (int) Heap size. +; EDX - (int) Heap size. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. From 237cc8183a09e72d6aad12c501224f3a47ff54b0 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 31 Dec 2025 01:33:58 -0800 Subject: [PATCH 75/87] Working on this again. I'm going through the pain of debugging and rewriting sections as needed. --- archive/x/x86-64/dijkstra.asm | 643 +++++++++++++++++++++------------- 1 file changed, 395 insertions(+), 248 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2b6fcca7b..afd6dbe23 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -1,3 +1,26 @@ +; MACROS + +%MACRO MMAP_PUSH 0 +PUSH RDI +PUSH RSI +PUSH RDX +PUSH RCX +PUSH R10 +PUSH R8 +PUSH R9 +PUSH R11 +%ENDMACRO +%MACRO MMAP_POP 0 +POP R11 +POP R9 +POP R8 +POP R10 +POP RCX +POP RDX +POP RSI +POP RDI +%ENDMACRO + ;Exit codes %DEFINE EXIT_OK 0 @@ -11,19 +34,28 @@ %DEFINE INVALID_EMPTY 8 %DEFINE INVALID_BAD_STR 9 +%DEFINE VALID_ARGC 4 + ; CONSTANTS %DEFINE MUL_2 1 %DEFINE MUL_4 2 +%DEFINE MUL_INT 2 +%DEFINE MUL_LONG 3 %DEFINE DIV_2 1 %DEFINE SIZE_INT 4 %DEFINE SIZE_LONG 8 %DEFINE EMPTY_INPUT 0 -%DEFINE MAX_INT 0xFFFFFFFF +%DEFINE INT_MAX 0xFFFFFFFF %DEFINE NULL 0 %DEFINE FALSE 0 %DEFINE TRUE 1 %DEFINE MAX_STR_INT 11 ; 10 (Max Int) + 1 (Null) +%DEFINE UNSEEN 0 +%DEFINE SEEN 1 + +%DEFINE NO_CONNECTION 0 + %DEFINE COMMA_SPACE 2 @@ -53,13 +85,15 @@ %DEFINE parseSRCDST.STACK_INIT 8 %DEFINE parseSRCDST.strlen 8 -%DEFINE parseVertices.STACK_INIT 48 +%DEFINE parseVertices.STACK_INIT 64 %DEFINE parseVertices.strlen 8 %DEFINE parseVertices.SRC 16 %DEFINE parseVertices.DST 24 %DEFINE parseVertices.NumPtr 32 %DEFINE parseVertices.PrevState 40 %DEFINE parseVertices.NumElems 48 +%DEFINE parseVertices.CurrentArray 56 +%DEFINE parseVertices.NumVertices 64 ;SYSCALLS @@ -87,11 +121,11 @@ ;Start -%DEFINE _start.argc 0 -%DEFINE _start.argv0 8 -%DEFINE _start.argv1 16 -%DEFINE _start.argv2 24 -%DEFINE _start.argv3 32 +%DEFINE _start.argc 8 +%DEFINE _start.argv0 16 +%DEFINE _start.argv1 24 +%DEFINE _start.argv2 32 +%DEFINE _start.argv3 40 ; RBP+ ^ ; RBP- v %DEFINE _start.STACK_INIT 40 @@ -101,14 +135,18 @@ %DEFINE _start.graph 32 %DEFINE _start.RET 40 -%DEFINE dijkstra.STACK_INIT 64 +%DEFINE dijkstra.STACK_INIT 40 %DEFINE dijkstra.PriorityQueue 8 -%DEFINE dijkstra.NumVerts 16 -%DEFINE dijkstra.prev 24 -%DEFINE dijkstra.dist 32 -%DEFINE dijkstra.SRC 40 -%DEFINE dijkstra.graph 48 -%DEFINE dijkstra.CurrTex 56 +%DEFINE dijkstra.seen 16 +%DEFINE dijkstra.dist 24 +%DEFINE dijkstra.SRC 32 +%DEFINE dijkstra.graph 40 + +%DEFINE dijkstra.PQ_LOOP.STACK_INIT 32 +%DEFINE dijkstra.PQ_LOOP.current 8 +%DEFINE dijkstra.PQ_LOOP.currentDistance 16 +%DEFINE dijkstra.PQ_LOOP.seen 24 +%DEFINE dijkstra.PQ_LOOP.dist 32 @@ -121,16 +159,16 @@ Error: .len equ $- .msg Err_Table: ; This is absurd but this because of CMOV not allowing immediates. - db 0 - db -1 - db -2 - db -3 - db -4 - db -5 - db -6 - db -7 - db -8 - db -9 + dq 0 + dq -1 + dq -2 + dq -3 + dq -4 + dq -5 + dq -6 + dq -7 + dq -8 + dq -9 BOOLs: .TRUE dq 1 @@ -142,10 +180,9 @@ Error_state: .CODE db 0 struc min_heap - .arr_size resq 1 - .len resq 1 - .array resq 1 - .elements resq 1 + .max_len resq 1 + .size resq 1 + .elems resq 1 endstruc struc NodeTuple @@ -168,9 +205,17 @@ section .text global _start _start: -MOV RBP, RSP +INT3 PUSH RBP +MOV RBP, RSP SUB RSP, _start.STACK_INIT +MOV RSI, [RBP + _start.argv1] +CMP QWORD [RBP + _start.argc], VALID_ARGC +CMOVNE RDI, [Err_Table + INVALID_ARGC*SIZE_LONG] +INT3 +CMOVNE RSI, [RBP + _start.argc] +JNE .error + MOV RAX, [RBP + _start.argv1] MOV RCX, 0 MOV RDX, 0 @@ -191,7 +236,7 @@ CALL ezsqrt MOV [RBP - _start.NumVerts], RAX CMP RAX, -1 -CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE] +CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE*SIZE_LONG] JE .error MOV RDI, [RBP + _start.argv2] CALL parseSRCDST @@ -200,25 +245,58 @@ MOV RDI, [RBP + _start.argv3] CALL parseSRCDST MOV [RBP - _start.DST], RAX -MOV RAX, [RBP - _start.NumVerts] -MUL RAX -PUSH RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -POP RSI -SHL RSI, MUL_4 +MOV RSI, [RBP - _start.NumVerts] +SHL RSI, MUL_LONG MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL MOV [RBP - _start.graph], RAX +MOV R12, [RBP - _start.NumVerts] +MOV R13, [RBP - _start.graph] + .GRAPH_LOOP: + PUSH RBP + MOV RBP, RSP + SUB RSP, SIZE_LONG*1 + XOR RCX, RCX + MOV QWORD [RBP - SIZE_LONG*1], 0 + .GRAPH_Inner: + MOV RCX, [RBP - SIZE_LONG*1] + CMP RCX, R12 + JAE .GRAPH_Exit + + PUSH RCX + MOV RAX, SYS_MMAP + MOV RDI, NO_ADDR + MOV RSI, R12 + SHL RSI, MUL_INT + .chk_sze: INT3 + MOV RDX, PROT_READ | PROT_WRITE + MOV R10, MAP_SHARED | MAP_ANONYMOUS + MOV R8, NO_FD + MOV R9, NO_OFFSET + SYSCALL + .graph_mchk: INT3 + POP RCX + MOV [R13 + RCX*SIZE_LONG], RAX + .graph_regchk: INT3 + INC RCX + MOV [RBP - SIZE_LONG*1], RCX + JMP .GRAPH_Inner + .GRAPH_Exit: + ADD RSP, SIZE_LONG*1 + MOV RSP, RBP + POP RBP MOV RDI, [RBP + _start.argv1] MOV RSI, [RBP - _start.graph] +MOV RDX, [RBP - _start.NumVerts] +.print_graph: INT3 CALL parseVertices MOV RDI, [RBP - _start.SRC] MOV RSI, [RBP - _start.graph] -.chkGrph: MOV RDX, [RBP - _start.NumVerts] CALL dijkstra .dijkstra_complete: @@ -237,23 +315,24 @@ SYSCALL PUSH RAX MOV RDI, RBX +MOV R15, RDI MOV RSI, RAX CALL itoa MOV RAX, R10 - MOV RAX, SYS_WRITE MOV RDI, STDOUT -POP RSI +MOV RSI, R15 MOV RDX, R10 SYSCALL MOV RAX, SYS_EXIT -MOV RDI, [Err_Table+EXIT_OK] +MOV RDI, [Err_Table+EXIT_OK*SIZE_LONG] SYSCALL .error: PUSH RDI + PUSH RSI MOV RAX, SYS_WRITE MOV RDI, STDOUT MOV RSI, Error.msg @@ -261,7 +340,9 @@ SYSCALL SYSCALL MOV RAX, SYS_EXIT + POP RSI POP RDI + INT3 SYSCALL itoa: @@ -284,12 +365,14 @@ PUSH RBX PUSH RDX PUSH R10 PUSH R8 -MOV RCX, 0 +.itoa_check: INT3 +XOR RCX, RCX MOV RAX, RDI MOV RBX, 10 .loop: - CMP RDI, 0 + CMP RAX, 0 JE .ext + XOR RDX, RDX DIV RBX ADD RDX, '0' MOV BYTE [RSI + RCX], DL @@ -307,7 +390,7 @@ MOV RDX, 0 MOV R10B, [RSI+RDX] MOV R8B, [RSI+RCX] MOV [RSI+RDX], R8B - MOV [RSI+RDX], R10B + MOV [RSI+RCX], R10B INC RDX DEC RCX JMP .reverse @@ -361,7 +444,7 @@ MOV RCX, 0 RET .zero: CMP RCX, 0 - CMOVE RAX, [Err_Table+INVALID_SRCDST] + CMOVE RAX, [Err_Table+INVALID_SRCDST*SIZE_LONG] JE .error JNE .cont .num: @@ -377,6 +460,7 @@ MOV RCX, 0 MOV RAX, SYS_EXIT POP RDI + INT3 SYSCALL parseVertices: @@ -387,13 +471,13 @@ parseVertices: ; Parsed through Finite State Machine. ; Parameters: ; RDI - (char[]*) Ptr to vertice char array. -; RSI - (int[][]*) Ptr to distances 2d array. -; RDX - () Unused. +; RSI - (int[][]*) Ptr to graph 2d array. +; RDX - (int) Number of vertices. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (int) Num elements (RAX > 0) +; RAX - (int) 0 (OK) ; Clobbers - RAX, RDI, RSI, RCX, RDX. ; --------------------------------------------------------------------------- ;Previous States @@ -407,15 +491,19 @@ MOV RBP, RSP SUB RSP, parseVertices.STACK_INIT MOV [RBP - parseVertices.SRC], RDI MOV [RBP - parseVertices.DST], RSI +MOV QWORD [RBP - parseVertices.NumVertices], RDX MOV QWORD [RBP - parseVertices.NumElems], 0 +MOV QWORD [RBP - parseVertices.strlen], 0 MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.START - +PUSH RBX +PUSH R12 MOV RAX, RDI CMP AL, EMPTY_INPUT -CMOVE RAX, [Err_Table+INVALID_EMPTY] +CMOVE RAX, [Err_Table+INVALID_EMPTY*SIZE_LONG] JE .error MOV RCX, 0 +XOR RBX, RBX MOV [RBP - parseVertices.NumPtr], RDI .validate: MOV DL, BYTE [RDI+RCX] @@ -445,7 +533,7 @@ MOV [RBP - parseVertices.NumPtr], RDI POP RAX POP RDI JE .errSkip - CMOVNE RDI, [Err_Table+INVALID_BAD_STR] + CMOVNE RDI, [Err_Table+INVALID_BAD_STR*SIZE_LONG] JMP .error .errSkip: INC QWORD [RBP - parseVertices.strlen] @@ -455,7 +543,7 @@ MOV [RBP - parseVertices.NumPtr], RDI .comma: CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM - CMOVNE RDI, [Err_Table+INVALID_BAD_STR] + CMOVNE RDI, [Err_Table+INVALID_BAD_STR*SIZE_LONG] JNE .error .zero_jmp: @@ -467,9 +555,15 @@ MOV [RBP - parseVertices.NumPtr], RDI MOV RDI, [RBP - parseVertices.NumPtr] MOV RSI, [RBP - parseVertices.strlen] CALL atoi + .atoi_res: INT3 MOV RCX, [RBP - parseVertices.NumElems] - MOV RDI, [RBP - parseVertices.DST] + MOV R12, [RBP - parseVertices.DST] + .chkDstVert: INT3 + MOV RDI, [R12 + RBX*SIZE_LONG] + .chkDstRdi: INT3 MOV [RDI + RCX*SIZE_INT], EAX + .arr_chk: INT3 + .skip_move: POP RDX POP RCX POP RSI @@ -482,28 +576,42 @@ MOV [RBP - parseVertices.NumPtr], RDI MOV QWORD [RBP - parseVertices.strlen], 0 INC RCX INC QWORD [RBP - parseVertices.NumElems] + PUSH RCX + MOV RCX, [RBP - parseVertices.NumElems] + CMP RCX, [RBP - parseVertices.NumVertices] + POP RCX + JB .skipReset + MOV QWORD [RBP - parseVertices.NumElems], 0 + INC RBX + INT3 + .skipReset: JMP .validate .space: CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.COMMA - CMOVNE RDI, [Err_Table+INVALID_BAD_STR] + CMOVNE RDI, [Err_Table+INVALID_BAD_STR*SIZE_LONG] JNE .error INC RCX MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.SPACE JMP .validate .zero: + CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.START + JE .skip_err CMP QWORD [RBP - parseVertices.PrevState], Parse.STATE.NUM - CMOVNE RDI, [Err_Table+INVALID_BAD_STR] + CMOVNE RDI, [Err_Table+INVALID_BAD_STR*SIZE_LONG] JNE .error CMP QWORD [RBP - parseVertices.NumElems], 0 - CMOVE RDI, [Err_Table+INVALID_BAD_STR] + CMOVE RDI, [Err_Table+INVALID_BAD_STR*SIZE_LONG] JE .error + .skip_err: MOV QWORD [RBP - parseVertices.PrevState], Parse.STATE.ZERO JMP .zero_jmp ; I don't like this backwards GOTO. .zero_cont: JMP .cont .cont: - MOV RAX, [RBP - parseVertices.NumElems] + MOV RAX, 0 + POP R12 + POP RBX ADD RSP, parseVertices.STACK_INIT MOV RSP, RBP POP RBP @@ -512,6 +620,7 @@ MOV [RBP - parseVertices.NumPtr], RDI ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. MOV RAX, SYS_EXIT MOV RDI, [RBP - parseVertices.PrevState] + INT3 SYSCALL @@ -538,111 +647,158 @@ dijkstra: PUSH RBP MOV RBP, RSP SUB RSP, dijkstra.STACK_INIT +PUSH RBX PUSH R12 PUSH R13 PUSH R14 +PUSH R15 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.graph], RSI -MOV [RBP - dijkstra.NumVerts], RDX -PUSH R10 -PUSH R8 -PUSH R9 +MOV R12, RDI +MOV R13, RSI +MOV R14, RDX + MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -MOV RSI, [RBP - dijkstra.NumVerts] +MOV RSI, R14 SHL RSI, MUL_4 MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_ANONYMOUS | MAP_SHARED +MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -POP R9 -POP R8 -POP R10 - -MOV RAX, MAX_INT - - -MOV RAX, [RBP - dijkstra.dist] -MOV R12, [RBP - dijkstra.NumVerts] -MOV RCX, 0 - .fill_dist: - CMP RCX, R12 - JA .fill_ext - MOV DWORD [RAX+RCX*4], MAX_INT - INC RCX - JMP .fill_dist -.fill_ext: +MOV [RBP - dijkstra.dist], RAX +MOV RAX, SYS_MMAP +MOV RDI, NO_ADDR +MOV RSI, R14 +SHL RSI, MUL_4 +MOV RDX, PROT_READ | PROT_WRITE +MOV R10, MAP_SHARED | MAP_ANONYMOUS +MOV R8, NO_FD +MOV R9, NO_OFFSET +SYSCALL +MOV [RBP - dijkstra.seen], RAX + + .INF_Loop: + MOV RDI, [RBP - dijkstra.dist] + MOV R10, [RBP - dijkstra.seen] + PUSH RBP + MOV RBP, RSP + SUB RSP, SIZE_LONG*1 + MOV QWORD [RBP - SIZE_LONG*1], 0 + .INF_Inner: + MOV RCX, [RBP - SIZE_LONG*1] + CMP RCX, R14 + JAE .INF_Exit + MOV DWORD [RDI + RCX*SIZE_INT], INT_MAX + MOV DWORD [R10 + RCX*SIZE_INT], UNSEEN + INC RCX + MOV [RBP - SIZE_LONG*1], RCX + JMP .INF_Inner + .INF_Exit: + XOR RCX, RCX + ADD RSP, SIZE_LONG*1 + MOV RSP, RBP + POP RBP +MOV RCX, [RBP - dijkstra.SRC] +MOV RDI, [RBP- dijkstra.dist] +MOV DWORD [RDI + RCX*SIZE_INT], 0 -MOV RDI, [RBP - dijkstra.NumVerts] +MOV RDI, R14 CALL priority_queue@construct MOV [RBP - dijkstra.PriorityQueue], RAX MOV RDI, [RBP - dijkstra.SRC] -MOV RAX, [RBP - dijkstra.dist] -MOV DWORD [RAX + RDI*SIZE_INT], 0 MOV RSI, 0 CALL dijkstra~GenerateTuple -MOV RSI, RAX + MOV RDI, [RBP - dijkstra.PriorityQueue] -CALL priority_queue@push -MOV R12, [RBP - dijkstra.PriorityQueue] -MOV R13, [RBP - dijkstra.dist] - .dijkstra_loop: - MOV RDI, R12 - CALL priority_queue@isEmpty - CMP RAX, TRUE - JE .dijkstra_ext - MOV RDI, R12 - CALL priority_queue@pop - MOV EDI, [RAX + NodeTuple.value] - MOV ESI, [RAX + NodeTuple.element] - - MOV [RBP - dijkstra.CurrTex], RSI - - CMP RDI, [R13 + RSI*SIZE_INT] - JA .dijkstra_loop - MOV RDI, [RBP - dijkstra.graph] - MOV RSI, [RBP - dijkstra.CurrTex] - MOV RDX, [RBP - dijkstra.NumVerts] - CALL dijkstra~GetRow - .rowchk: - MOV R14, RAX - MOV RCX, 0 - .neighbor_loop: - CMP RCX, [RBP - dijkstra.NumVerts] - JAE .dijkstra_loop +MOV RSI, RAX +CALL priority_queue@add + +MOV R15, [RBP - dijkstra.PriorityQueue] +MOV R10, [RBP - dijkstra.seen] +MOV R8, [RBP - dijkstra.dist] +MOV R9, [RBP - dijkstra.graph] + + + .PQ_LOOP: + PUSH RBP + MOV RBP, RSP + SUB RSP, dijkstra.PQ_LOOP.STACK_INIT + MOV [RBP - dijkstra.PQ_LOOP.seen], R10 + MOV [RBP - dijkstra.PQ_LOOP.dist], R8 + MOV QWORD [RBP - dijkstra.PQ_LOOP.current], 0 + MOV QWORD [RBP - dijkstra.PQ_LOOP.currentDistance], 0 + .PQ_Inner: + MOV RDI, R15 + CALL priority_queue@isEmpty + CMP RAX, TRUE + JE .PQ_Exit - MOV EDI, [R14 + RCX*SIZE_INT] - CMP RDI, 0 - JNE .neighbor_cont ; Branch predictor is not gonna like this. - INC RCX - JMP .neighbor_loop - .neighbor_cont: - MOV RBX, [RBP - dijkstra.CurrTex] - MOV R10D, [R13 + RBX*SIZE_INT] - ADD R10, RDX - CMP R10D, [R13 + RCX*SIZE_INT] - JB .neighbor_operate - INC RCX - JMP .neighbor_loop - .neighbor_operate: - MOV [R13 + RCX*SIZE_INT], R10D - .checkDst2: - MOV RDI, RCX - MOV ESI, [R13 + RCX*SIZE_INT] - CALL dijkstra~GenerateTuple - MOV RDI, R12 - MOV RSI, RAX - CALL priority_queue@push - INC RCX - JMP .neighbor_loop -.dijkstra_ext: -MOV RAX, R13 + MOV RDI, R15 + PUSH R8 + CALL priority_queue@remove + POP R8 + MOV EDI, [RAX + NodeTuple.value] + MOV [RBP - dijkstra.PQ_LOOP.currentDistance], EDI + MOV EDI, [RAX + NodeTuple.element] + MOV [RBP - dijkstra.PQ_LOOP.current], EDI + MOV EDI, [RBP - dijkstra.PQ_LOOP.currentDistance] + MOV RBX, [RBP - dijkstra.PQ_LOOP.seen] + CMP DWORD [RBX + RDI*SIZE_INT], SEEN + JE .PQ_Inner + + MOV DWORD [RBX + RDI*SIZE_INT], SEEN + + MOV RBX, [RBP - dijkstra.PQ_LOOP.dist] + .chkDist: INT3 + MOV RSI, [RBP - dijkstra.PQ_LOOP.currentDistance] + CMP RSI, [RBX + RDI*SIZE_INT] + JA .PQ_Inner + XOR RCX, RCX + .NEIGHBORS_LOOP: + INT3 + CMP RCX, R14 + JAE .PQ_Inner + MOV R10, R13 + .print_graph: + MOV R9, R13 + MOV R8, [RBP - dijkstra.PQ_LOOP.current] + MOV R10, [R9 + R8*SIZE_LONG] + MOV R8, [RBP - dijkstra.PQ_LOOP.currentDistance] + CMP DWORD [R10 + RCX*SIZE_INT], NO_CONNECTION + JE .NEIGHBORS_SKIP + MOV R9, R8 + ADD R9D, [R10 + RCX*SIZE_INT] + + CMP R9D, [RBX + RCX*SIZE_INT] + JAE .NEIGHBORS_SKIP + + MOV [RBX + RCX*SIZE_INT], R9D + + MOV RDI, RCX + MOV RSI, R9 + CALL dijkstra~GenerateTuple + MOV RSI, RAX + MOV RDI, R15 + CALL priority_queue@add + + .NEIGHBORS_SKIP: + INC RCX + JMP .NEIGHBORS_LOOP + .PQ_Exit: + ADD RSP, dijkstra.PQ_LOOP.STACK_INIT + MOV RSP, RBP + POP RBP + +POP R15 POP R14 POP R13 POP R12 +POP RBX +MOV RAX, [RBP - dijkstra.dist] ADD RSP, dijkstra.STACK_INIT MOV RSP, RBP POP RBP @@ -679,8 +835,8 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RAX + NodeTuple.value], EDX -MOV [RAX + NodeTuple.element], ESI +MOV DWORD [RAX + NodeTuple.value], ESI +MOV DWORD [RAX + NodeTuple.element], EDI POP R9 POP R8 POP R10 @@ -711,11 +867,11 @@ LEA RAX, [RDI + RAX*SIZE_INT] RET -priority_queue@push: +priority_queue@add: ; ---------------------------------------------------------------------------- -; Function: priority queue push. +; Function: priority queue add. ; Description: -; Pushes new value into minheap. +; Adds new value into minheap. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. ; RSI - (NodeTuple*) Tuple that contains distance and element. @@ -727,15 +883,30 @@ priority_queue@push: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- - - +MOV RDX, [RDI + priority_queue.max_len] +CMP RDX, 0 +JE .skip +DEC RDX +INT3 +.skip: +INC QWORD [RDI + priority_queue.size] +MOV EDX, [RDI + priority_queue.size] +MOV R8, [RDI + priority_queue.heap] +MOV R9, [R10 + min_heap.elems] +MOV [R9 + RDI*SIZE_LONG], RSI + + + +MOV ESI, EDI +MOV RDI, R8 +CALL minheap@siftUp RET -priority_queue@pop: +priority_queue@remove: ; ---------------------------------------------------------------------------- -; Function: priority queue pop. +; Function: priority queue remove. ; Description: -; Pops the first element in both the value and element array of the minheap and returns NodeTuple containing both. +; Removes the first element in both the value and element array of the minheap and returns NodeTuple containing both. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. ; RSI - () Unused. @@ -753,7 +924,7 @@ PUSH R12 PUSH R13 MOV R12, 0 -CMP [RDI + priority_queue.size], 0 +CMP QWORD [RDI + priority_queue.size], 0 CMOVE RAX, R12 JE .ext @@ -793,13 +964,12 @@ MOV RDX, [RSI + min_heap.elements] MOV R8D, [RDX+R10*SIZE_INT] MOV [RDX], R8D -DEC [RDI + priority_queue.size] -DEC [RSI + min_heap.len] +DEC QWORD [RDI + priority_queue.size] +DEC QWORD [RSI + min_heap.len] MOV R12, RDI MOV R12, [RDI + priority_queue.heap] MOV RSI, 0 -MOV RDX, [RDI + priority_queue.size] MOV RDI, R12 PUSH RCX CALL minheap@siftDown @@ -829,19 +999,22 @@ priority_queue@peek: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- +PUSH RBP +MOV RBP, RSP PUSH R12 +PUSH R13 -MOV R12, -1 -CMP [RDI + priority_queue.size], 0 +MOV R12, 0 +CMP QWORD [RDI + priority_queue.size], 0 CMOVE RAX, R12 -JMP .ext +JE .ext MOV RSI, [RDI + priority_queue.heap] MOV R10, [RSI + min_heap.array] MOV R8, [RSI + min_heap.elements] -MOV R10, [R10] -MOV R8, [R8] +MOV R10D, [R10] +MOV R8D, [R8] PUSH R10 PUSH R8 @@ -854,14 +1027,17 @@ MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -POP RSI -POP RDX -MOV [RAX + NodeTuple.value], EDX -MOV [RAX + NodeTuple.element], ESI +MOV [RAX + NodeTuple.value], R10D +MOV [RAX + NodeTuple.element], R8D .ext: +POP R13 POP R12 +MOV RSP, RBP +POP RBP RET + + priority_queue@isEmpty: ; ---------------------------------------------------------------------------- ; Function: priority queue isEmpty. @@ -878,7 +1054,7 @@ priority_queue@isEmpty: ; RAX - (bool) Boolean denoting whether PQ is empty (true) or not (false). ; Clobbers - RAX, RDI. ; --------------------------------------------------------------------------- -MOV RAX, 1 +MOV RAX, 0 CMP QWORD [RDI + priority_queue.size], 0 SETE AL MOVZX RAX, AL @@ -983,26 +1159,15 @@ MOV QWORD [RAX + priority_queue.max_len], R12 MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, R12 +SHL RSI, MUL_LONG MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -.tstdbg: -MOV R13, RAX -MOV RAX, SYS_MMAP -MOV RDI, NO_ADDR +MOV RDI, RAX MOV RSI, R12 -MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS -MOV R8, NO_FD -MOV R9, NO_OFFSET -SYSCALL - -MOV RDI, R13 -MOV RSI, RAX -MOV RDX, R12 CALL minheap@construct MOV RDI, [RBP - priority_queue@construct.PQPtr] MOV [RDI + priority_queue.heap], RAX @@ -1056,47 +1221,45 @@ minheap@siftUp: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RDI, RSI, RDX, R10, R8. +; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9, R11. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftUp.STACK_INIT -MOV RDI, [RDI + minheap.array] - .sift: - MOV R11, RSI - + .sift_loop: + CMP ESI, 0 + JE .sift_ext PUSH RDI - MOV EDI, R11D + MOV RDI, RSI CALL minheap@parent - CMP EAX, 0 - JL .siftEXT - + MOV R11, RDI POP RDI - MOV EDX, [RDI + R11*SIZE_INT] - MOV R10D, [RDI + RAX*SIZE_INT] - CMP R10, RDX - JBE .siftEXT - + MOV RDX, [RDI + min_heap.elems] + MOV R8, [RDX + RAX*SIZE_LONG] + MOV R9, [RDX + RSI*SIZE_LONG] + MOV ECX, [R8 + Node_Tuple.value] + CMP ECX, [R9 + Node_Tuple.value] + JBE .sift_ext MOV EDX, EAX - PUSH RAX + MOV ESI, R11D CALL minheap@swap - POP RSI - JMP .sift -.siftEXT: + MOV RSI, RAX + JMP .sift_loop +.sift_ext: ADD RSP, minheap@siftUp.STACK_INIT MOV RSP, RBP POP RBP RET minheap@siftDown: ; ---------------------------------------------------------------------------- -; Function: minheap swap +; Function: minheap sift down. ; Description: ; Restores min-heap by moving root downward. ; Parameters: ; RDI - (Minheap*) This* minheap. ; ESI - (int) Index. -; EDX - (int) Heap size. +; EDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. @@ -1110,39 +1273,32 @@ SUB RSP, minheap@siftDown.STACK_INIT .sift: MOV RCX, RDI + MOV R10D, ESI MOV RDI, RSI CALL minheap@left - MOV R10, RAX + MOV R9, RAX CALL minheap@right MOV R8, RAX - MOV RDI, RCX - MOV RCX, RSI - PUSH RCX + MOV EDX, EDI - CMP R10, RDX - JAE .leftEXT - MOV R9, [RDI + R10*SIZE_INT] - MOV R11, [RDI + RCX*SIZE_INT] - CMP R9, R11 - CMOVB RCX, R10 - .leftEXT: - CMP R8, RDX - JAE .rightEXT - MOV R9, [RDI + R8*SIZE_INT] - MOV R11, [RDI + RCX*SIZE_INT] - CMP R9, R11 - CMOVB RCX, R8 - - POP RAX - CMP RAX, RCX + MOV R11, [RCX + min_heap.elems] + CMP R9D, [RCX + min_heap.size] + JAE .skpLft + MOV RDX, R9 + .skpLft: + CMP R8D, [RCX + min_heap.size] + JAE .skpRgt + MOV RDX, R8 + .skpRgt: + CMP RDX, R10 JE .siftEXT - - MOV RSI, RAX - MOV RDX, RCX PUSH RCX + PUSH RDX + MOV RDI, RCX + MOV RSI, R10 CALL minheap@swap - POP RSI + POP RDI JMP .sift .siftEXT: @@ -1158,7 +1314,7 @@ minheap@swap: ; Description: ; Swaps elements between given two indices. ; Parameters: -; RDI - (int[]*) Minheap array to operate on. +; RDI - (Minheap*) Minheap to operate on. ; ESI - (int) Index one. ; EDX - (int) Index two. ; R10 - () Unused. @@ -1166,12 +1322,13 @@ minheap@swap: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - RDI, R8, R10. +; Clobbers - R8, R9. ; --------------------------------------------------------------------------- -MOV R10D, DWORD [RDI+RSI*SIZE_INT] ;TMP -MOV R8D, DWORD [RDI+RDX*SIZE_INT] ;TMP2 -MOV [RDI+RSI*SIZE_INT], R8D -MOV [RDI+RDX*SIZE_INT], R10D +MOV R10, [RDI + min_heap.elems] +MOV R8, [R10 + RSI*SIZE_LONG] +MOV R9, [R10 + RDX*SIZE_LONG] +MOV [R10 + RSI*SIZE_LONG], R9 +MOV [R10 + RDX*SIZE_LONG], R8 RET @@ -1241,9 +1398,9 @@ minheap@construct: ; Description: ; Constructs minheap with information generated by priority_queue@construct ; Parameters: -; RDI - (int[]*) Value array. -; RSI - (int[]*) Element array. -; EDX - (int) Array size in memory. +; RDI - (long[]*) Element array. +; ESI - (int) Array size in memory. +; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. @@ -1251,9 +1408,7 @@ minheap@construct: ; RAX - (Minheap*) Minheap ptr. ; Clobbers - RAX ; --------------------------------------------------------------------------- -PUSH RDI -PUSH RSI -PUSH RDX +MMAP_PUSH MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -1264,14 +1419,12 @@ MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -POP RDX -POP RSI -POP RDI +MMAP_POP + +MOV [RAX + min_heap.elems], RDI +MOV [RAX + min_heap.max_len], ESI +MOV QWORD [RAX + min_heap.size], 0 -MOV [RAX + min_heap.array], RDI -MOV [RAX + min_heap.elements], RSI -MOV [RAX + min_heap.arr_size], RDX -MOV QWORD [RAX + min_heap.len], 0 RET minheap@destruct: @@ -1315,7 +1468,7 @@ ezsqrt: ; Description: ; Checks if number is perfect square; returns square root into RAX. ; Parameters: -; RDI - (long) Input value to sqrt. +; EDI - (long) Input value to sqrt. ; RSI - () Unused. ; RDX - () Unused. ; R10 - () Unused. @@ -1333,7 +1486,7 @@ ezsqrt: .sqrt_loop: MOV RAX, RCX MUL RCX - CMP RAX, RDI + CMP EAX, EDI JE .ext INC RCX CMOVA RAX, RDX @@ -1360,30 +1513,24 @@ atoi: ; R9 - () Unused. ; Returns: ; EAX - (int) Integer value of string. -; Clobbers - RAX, RCX, R10. +; Clobbers - RAX, RDX, RCX, R10. ; --------------------------------------------------------------------------- - - PUSH RBP - MOV RBP, RSP - SUB RSP, atoi.STACK_INIT PUSH RBX + .check_atoi: INT3 MOV RCX, 0 MOV RBX, 10 MOV RAX, 0 .loop: - MOV R10B, [RDI + RCX] + MOV R10B, [RDI + RCX] SUB R10B, '0' MUL RBX - ADD RAX, R10 + ADD EAX, R10D INC RCX - CMP RCX, RSI JB .loop .ext: + .check_atoi2: INT3 POP RBX - ADD RSP, atoi.STACK_INIT - MOV RSP, RBP - POP RBP RET From f362507671b8f3941bc5bdeeae9c715f699f7d9e Mon Sep 17 00:00:00 2001 From: = Date: Wed, 31 Dec 2025 06:04:05 -0800 Subject: [PATCH 76/87] Made a bunch of more bug fixes, rewrite of functions. --- archive/x/x86-64/dijkstra.asm | 451 +++++++++++++--------------------- 1 file changed, 170 insertions(+), 281 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index afd6dbe23..2726f50e9 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -135,18 +135,16 @@ POP RDI %DEFINE _start.graph 32 %DEFINE _start.RET 40 -%DEFINE dijkstra.STACK_INIT 40 +%DEFINE dijkstra.STACK_INIT 72 %DEFINE dijkstra.PriorityQueue 8 -%DEFINE dijkstra.seen 16 +%DEFINE dijkstra.prev 16 %DEFINE dijkstra.dist 24 %DEFINE dijkstra.SRC 32 %DEFINE dijkstra.graph 40 - -%DEFINE dijkstra.PQ_LOOP.STACK_INIT 32 -%DEFINE dijkstra.PQ_LOOP.current 8 -%DEFINE dijkstra.PQ_LOOP.currentDistance 16 -%DEFINE dijkstra.PQ_LOOP.seen 24 -%DEFINE dijkstra.PQ_LOOP.dist 32 +%DEFINE dijkstra.x 48 +%DEFINE dijkstra.y 56 +%DEFINE dijkstra.numVerts 64 +%DEFINE dijkstra.currentROw 72 @@ -301,7 +299,7 @@ MOV RDX, [RBP - _start.NumVerts] CALL dijkstra .dijkstra_complete: MOV RCX, [RBP - _start.DST] -MOV RBX, [RAX + RCX*SIZE_INT] +MOV EBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX MOV RAX, SYS_MMAP @@ -634,9 +632,9 @@ dijkstra: ; Description: ; The algorithm of study itself, Dijkstra. ; Parameters: -; RDI - (int) SRC. +; EDI - (int) SRC. ; RSI - (int[][]*) Graph to vertice&edges. -; RDX - (int) # Vertices. +; EDX - (int) # Vertices. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. @@ -651,152 +649,128 @@ PUSH RBX PUSH R12 PUSH R13 PUSH R14 -PUSH R15 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.graph], RSI +MOV [RBP - dijkstra.numVerts], RDX +MOV [RBP - dijkstra.x], 0 +MOV [RBP - dijkstra.y], 0 -MOV R12, RDI -MOV R13, RSI -MOV R14, RDX +MOV RDX, [RBP - dijkstra.SRC] +MOV RSI, [RBP - dijkstra.graph] +CALL dijkstra~GetRow +MOV [RBP - dijkstra.currentRow], RAX +MOV RSI, [RBP - dijkstra.SRC] +MOV RDI, [RBP - dijkstra.graph] +MMAP_PUSH MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -MOV RSI, R14 -SHL RSI, MUL_4 +MOV RSI, [RBP - dijkstra.numVerts] +SHL RSI, SIZE_INT MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RBP - dijkstra.dist], RAX +MOV [RBP _ dijkstra.prev], RAX + MOV RAX, SYS_MMAP MOV RDI, NO_ADDR -MOV RSI, R14 -SHL RSI, MUL_4 +MOV RSI, [RBP - dijkstra.numVerts] +SHL RSI, SIZE_INT MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RBP - dijkstra.seen], RAX - - .INF_Loop: - MOV RDI, [RBP - dijkstra.dist] - MOV R10, [RBP - dijkstra.seen] - PUSH RBP - MOV RBP, RSP - SUB RSP, SIZE_LONG*1 - MOV QWORD [RBP - SIZE_LONG*1], 0 - .INF_Inner: - MOV RCX, [RBP - SIZE_LONG*1] - CMP RCX, R14 - JAE .INF_Exit - MOV DWORD [RDI + RCX*SIZE_INT], INT_MAX - MOV DWORD [R10 + RCX*SIZE_INT], UNSEEN - INC RCX - MOV [RBP - SIZE_LONG*1], RCX - JMP .INF_Inner - .INF_Exit: - XOR RCX, RCX - ADD RSP, SIZE_LONG*1 - MOV RSP, RBP - POP RBP -MOV RCX, [RBP - dijkstra.SRC] -MOV RDI, [RBP- dijkstra.dist] -MOV DWORD [RDI + RCX*SIZE_INT], 0 +MOV [RBP _ dijkstra.dist], RAX +MMAP_POP +MOV RCX, 0 +MOV R8, [RBP - dijkstra.prev] +MOV R9, [RBP - dijkstra.dist] + .dists_loop: + CMP RCX, [RBP - dijkstra.numVerts] + JE .dists_ext + MOV [R8 + RCX*SIZE_INT], 0 + MOV [R9 + RCX*SIZE_INT], INT_MAX + INC RCX + JMP .dists_loop +.dists_ext: +MOV RCX, [RBP - dijkstra.numVerts] +MOV [R9 + RCX*SIZE_INT], 0 -MOV RDI, R14 +MOV RDI, RCX CALL priority_queue@construct -MOV [RBP - dijkstra.PriorityQueue], RAX - -MOV RDI, [RBP - dijkstra.SRC] -MOV RSI, 0 -CALL dijkstra~GenerateTuple +MOV [RBP - dijkstra.PriorityQueue], RAX +MOV RCX, [RBP - dijkstra.numVerts] +MOV RDX, [RBP - dijkstra.currentRow] + .PQ_INIT: + CMP RCX, [RBP - dijkstra.numVerts] + JE .PQ_INIT_EXIT + + MOV EDI, ECX + MOV ESI, [RDX + RCX*SIZE_INT] + CALL dijkstra~GenerateTuple + + MOV RDI, [RBP - dijkstra.PriorityQueue] + MOV RSI, RAX + CALL priority_queue@add + + INC RCX + JMP .PQ_INIT +.PQ_INIT_EXIT: MOV RDI, [RBP - dijkstra.PriorityQueue] -MOV RSI, RAX -CALL priority_queue@add - -MOV R15, [RBP - dijkstra.PriorityQueue] -MOV R10, [RBP - dijkstra.seen] -MOV R8, [RBP - dijkstra.dist] -MOV R9, [RBP - dijkstra.graph] - - .PQ_LOOP: - PUSH RBP - MOV RBP, RSP - SUB RSP, dijkstra.PQ_LOOP.STACK_INIT - MOV [RBP - dijkstra.PQ_LOOP.seen], R10 - MOV [RBP - dijkstra.PQ_LOOP.dist], R8 - MOV QWORD [RBP - dijkstra.PQ_LOOP.current], 0 - MOV QWORD [RBP - dijkstra.PQ_LOOP.currentDistance], 0 - .PQ_Inner: - MOV RDI, R15 - CALL priority_queue@isEmpty - CMP RAX, TRUE - JE .PQ_Exit + CALL priority_queue@isEmpty + CMP RAX, [BOOLs.TRUE] + JE .PQ_EXIT + + CALL priority_queue@remove + MOV EBX, [RAX + Node_Tuple.element] + MOV [RBP - dijkstra.x], EBX + MOV RCX, [RBP - dijkstra.dist] + MOV ECX, [RCX + RBX*SIZE_INT] + MOV RBX, RAX + CMP [RBX + Node_Tuple.value], ECX + JA .PQ_LOOP + + + + MOV RDI, [RBP - dijkstra.graph] + MOV ESI, [RBX + Node_Tuple.value] + CALL dijkstra~GetRow + MOV [RBP - dijkstra.currentRow], RAX + MOV R11, [RBP - dijkstra.dist] + MOV RCX. 0 + .neighbor_loop: + CMP DWORD [R11 + RCX*SIZE_INT], 0 + JE .neighbor_iterate - MOV RDI, R15 - PUSH R8 - CALL priority_queue@remove - POP R8 - MOV EDI, [RAX + NodeTuple.value] - MOV [RBP - dijkstra.PQ_LOOP.currentDistance], EDI - MOV EDI, [RAX + NodeTuple.element] - MOV [RBP - dijkstra.PQ_LOOP.current], EDI - MOV EDI, [RBP - dijkstra.PQ_LOOP.currentDistance] - MOV RBX, [RBP - dijkstra.PQ_LOOP.seen] - CMP DWORD [RBX + RDI*SIZE_INT], SEEN - JE .PQ_Inner + MOV EDX, [R11 + RCX*SIZE_INT] + MOV R12D, [RBX + Node_Tuple.element] + MOV R12D, [R11 + R12*SIZE_INT] + ADD R12D, EDX + MOV R13D, [R11 + RCX*SIZE_INT] + CMP R12D, R13D + JB .neighbor_iterate + MOV [R11 + RCX*SIZE_INT], R12D - MOV DWORD [RBX + RDI*SIZE_INT], SEEN + MOV RDI, RCX + MOV ESI, [R11 + RCX*SIZE_INT] + CALL dijkstra~GenerateTuple - MOV RBX, [RBP - dijkstra.PQ_LOOP.dist] - .chkDist: INT3 - MOV RSI, [RBP - dijkstra.PQ_LOOP.currentDistance] - CMP RSI, [RBX + RDI*SIZE_INT] - JA .PQ_Inner - XOR RCX, RCX - .NEIGHBORS_LOOP: - INT3 - CMP RCX, R14 - JAE .PQ_Inner - MOV R10, R13 - .print_graph: - MOV R9, R13 - MOV R8, [RBP - dijkstra.PQ_LOOP.current] - MOV R10, [R9 + R8*SIZE_LONG] - MOV R8, [RBP - dijkstra.PQ_LOOP.currentDistance] - CMP DWORD [R10 + RCX*SIZE_INT], NO_CONNECTION - JE .NEIGHBORS_SKIP - MOV R9, R8 - ADD R9D, [R10 + RCX*SIZE_INT] - - CMP R9D, [RBX + RCX*SIZE_INT] - JAE .NEIGHBORS_SKIP - - MOV [RBX + RCX*SIZE_INT], R9D - - MOV RDI, RCX - MOV RSI, R9 - CALL dijkstra~GenerateTuple - MOV RSI, RAX - MOV RDI, R15 - CALL priority_queue@add - - .NEIGHBORS_SKIP: - INC RCX - JMP .NEIGHBORS_LOOP - .PQ_Exit: - ADD RSP, dijkstra.PQ_LOOP.STACK_INIT - MOV RSP, RBP - POP RBP - -POP R15 + MOV RDI, [RBP - dijkstra.PriorityQueue] + MOV RSI, RAX + CALL priority_queue@add + .neighbor_iterate: + INC RCX + JMP .neighbor_loop + +.PQ_EXIT: POP R14 POP R13 -POP R12 +POP R12 POP RBX MOV RAX, [RBP - dijkstra.dist] ADD RSP, dijkstra.STACK_INIT @@ -813,20 +787,18 @@ dijkstra~GenerateTuple: ; Preserving RDX, R10, R8, R9 as I know it will be annoying restoring those for every call if clobbered. ; Can replace ad hoc instances of tuple generation. ; Parameters: -; RDI - (int) Element. -; RSI - (int) Value. +; EDI - (int) Element. +; ESI - (int) Value. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. ; Returns: ; RAX - (NodeTuple*) Generated Tuple. -; Clobbers - RAX, RDI, RSI. +; Clobbers - ; --------------------------------------------------------------------------- -PUSH RDX -PUSH R10 -PUSH R8 -PUSH R9 +MMAP_PUSH + MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, NodeTuple_size @@ -837,10 +809,8 @@ MOV R9, NO_OFFSET SYSCALL MOV DWORD [RAX + NodeTuple.value], ESI MOV DWORD [RAX + NodeTuple.element], EDI -POP R9 -POP R8 -POP R10 -POP RDX + +MMAP_POP RET dijkstra~GetRow: @@ -850,8 +820,8 @@ dijkstra~GetRow: ; Helper method for dijkstra to grab the address of the needed row given a graph. ; Parameters: ; RDI - (int[][]*) Graph. -; RSI - (int) Element. -; RDX - (int) # Vertices. +; RSI - (int) Row # +; RDX - () Unused ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. @@ -859,11 +829,7 @@ dijkstra~GetRow: ; RAX - (int[]*) Row. ; Clobbers - RAX. ; --------------------------------------------------------------------------- -PUSH RDX -MOV RAX, RSI -MUL RDX -POP RDX -LEA RAX, [RDI + RAX*SIZE_INT] +MOV RAX, [RDI + RSI*SIZE_LONG] RET @@ -880,26 +846,24 @@ priority_queue@add: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - () None. -; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. +; RAX - () RAX == 0 (Full), RAX == 1 (Success). +; Clobbers - ; --------------------------------------------------------------------------- -MOV RDX, [RDI + priority_queue.max_len] -CMP RDX, 0 -JE .skip -DEC RDX -INT3 -.skip: -INC QWORD [RDI + priority_queue.size] +MMAP_PUSH ;Having abstracted the min heap allows me to do this. MOV EDX, [RDI + priority_queue.size] +CMP EDX, [RDI + priority_queue.max_len] +CMOVE RAX, [BOOLs.FALSE] +JE .ext MOV R8, [RDI + priority_queue.heap] -MOV R9, [R10 + min_heap.elems] -MOV [R9 + RDI*SIZE_LONG], RSI - - - -MOV ESI, EDI +MOV [R8 + RDX*SIZE_LONG], RSI +INC EDX +INC [RDI + priority_queue.size] MOV RDI, R8 +MOV ESI, EDX CALL minheap@siftUp +MOV RAX, [BOOLs.TRUE] +.ext: +MMAP_POP RET priority_queue@remove: @@ -907,6 +871,7 @@ priority_queue@remove: ; Function: priority queue remove. ; Description: ; Removes the first element in both the value and element array of the minheap and returns NodeTuple containing both. +; Preserves RDI ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. ; RSI - () Unused. @@ -915,72 +880,30 @@ priority_queue@remove: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). +; RAX - (NodeTuple*) NodeTuple containing value, elem, or nil (0). ; Clobbers - RDI, RSI, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -PUSH RBP -MOV RBP, RSP -PUSH R12 -PUSH R13 - -MOV R12, 0 -CMP QWORD [RDI + priority_queue.size], 0 -CMOVE RAX, R12 -JE .ext - -MOV RSI, [RDI + priority_queue.heap] -MOV R10, [RSI + min_heap.array] -MOV R8, [RSI + min_heap.elements] - -MOV R10, [R10] -MOV R8, [R8] -PUSH R10 -PUSH R8 - PUSH RDI -MOV RAX, SYS_MMAP -MOV RDI, NO_ADDR -MOV RSI, NodeTuple_size -MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS -MOV R8, NO_FD -MOV R9, NO_OFFSET -SYSCALL -POP RDI - -POP RSI -POP RDX -MOV [RAX + NodeTuple.value], EDX -MOV [RAX + NodeTuple.element], ESI -MOV RCX, RAX +CMP DWORD [RDI + priority_queue.size], 0 +CMOVA RAX, [BOOLs.FALSE] +JE .ext: MOV RSI, [RDI + priority_queue.heap] -MOV RDX, [RSI + min_heap.array] -MOV R10, [RDI + priority_queue.size] -DEC R10 -MOV R8D, [RDX+R10*SIZE_INT] -MOV [RDX], R8D -MOV RDX, [RSI + min_heap.elements] -MOV R8D, [RDX+R10*SIZE_INT] -MOV [RDX], R8D - -DEC QWORD [RDI + priority_queue.size] -DEC QWORD [RSI + min_heap.len] +MOV RCX, [RDI + min_heap.elems] +MOV RAX, [RCX] +PUSH RAX -MOV R12, RDI -MOV R12, [RDI + priority_queue.heap] -MOV RSI, 0 -MOV RDI, R12 -PUSH RCX -CALL minheap@siftDown -POP RCX +MOV EDX, [RDI + priority_queue.size] +DEC EDX +MOV R8, [RCX + RDX*SIZE_LONG] +MOV [RCX], R8 -MOV RAX, RCX +MOV RDI, RSI +MOV ESI, 0 +CALL minheap@siftDown +POP RAX .ext: -POP R13 ;Ret -POP R12 -MOV RSP, RBP -POP RBP +POP RDI RET priority_queue@peek: @@ -996,44 +919,16 @@ priority_queue@peek: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (NodeTuple*) NodeTuple containing value, elem, or null (0). +; RAX - (NodeTuple*) NodeTuple containing value, elem, or nil (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- -PUSH RBP -MOV RBP, RSP -PUSH R12 -PUSH R13 - -MOV R12, 0 -CMP QWORD [RDI + priority_queue.size], 0 -CMOVE RAX, R12 -JE .ext - +CMP DWORD [RDI + priority_queue.size], 0 +CMOVA RAX, [BOOLs.FALSE] +JE .ext: MOV RSI, [RDI + priority_queue.heap] -MOV R10, [RSI + min_heap.array] -MOV R8, [RSI + min_heap.elements] - -MOV R10D, [R10] -MOV R8D, [R8] -PUSH R10 -PUSH R8 - -MOV RAX, SYS_MMAP -MOV RDI, NO_ADDR -MOV RSI, NodeTuple_size -MOV RDX, PROT_READ | PROT_WRITE -MOV R10, MAP_SHARED | MAP_ANONYMOUS -MOV R8, NO_FD -MOV R9, NO_OFFSET -SYSCALL - -MOV [RAX + NodeTuple.value], R10D -MOV [RAX + NodeTuple.element], R8D +MOV RCX, [RSI + min_heap.elems] +MOV RAX, [RCX] .ext: -POP R13 -POP R12 -MOV RSP, RBP -POP RBP RET @@ -1056,8 +951,8 @@ priority_queue@isEmpty: ; --------------------------------------------------------------------------- MOV RAX, 0 CMP QWORD [RDI + priority_queue.size], 0 -SETE AL -MOVZX RAX, AL +CMOVA RAX, [BOOLs.FALSE] +CMOVE RAX, [BOOLs.TRUE] RET priority_queue@size: @@ -1083,11 +978,11 @@ priority_queue@decreaseKey: ; ---------------------------------------------------------------------------- ; Function: priority queue decreaseKey. ; Description: -; Decrease priority of given symbol. +; Decrease priority of given symbol. Implemented through linear search because implementing a hashmap would take too long for now; possibility for improvement. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. -; RSI - (int) Symbol. -; RDX - (int) Replacement priority. +; ESI - (int) Symbol. +; EDX - (int) Replacement priority. ; R10 - () Unused. ; R8 - () Unused. ; R9 - () Unused. @@ -1095,30 +990,24 @@ priority_queue@decreaseKey: ; EAX - (int) EAX == 0 : NOT IN QUEUE; EAX == 1 : IN QUEUE. ; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8. ; --------------------------------------------------------------------------- -PUSH R12 -MOV R10, [RDI + priority_queue.heap] -MOV R8, [R10 + min_heap.array] -MOV R10, [R10 + min_heap.elements] +MOV RDX, [RDI + priority_queue.heap] MOV RCX, 0 - .search: ; I really don't like having to implement a linear search, but a hashtable will take way too long to implement. - CMP RCX, [RDI + priority_queue.size] - CMOVAE EAX, [BOOLs.FALSE] - CMOVB EAX, [BOOLs.TRUE] - JAE .short_circuit ;Not found - MOV R12, [R10 + RCX*SIZE_INT] - CMP R12, RSI - JE .break_search - INC RCX + .search: + CMP ECX, [RDI + priority_queue.size] + CMOVE RAX, [BOOLs.FALSE] + JE .ext + MOV R10, [RDX + RCX*SIZE_LONG] + CMP ESI, [R10 + Node_Tuple.element] + JE .success + INC ECX JNE .search -.break_search: -CMP RDX, [R8 + RCX*SIZE_INT] -JAE .short_circuit -MOV [R8 + RCX*SIZE_INT], RDX -MOV RDI, [RDI + priority_queue.heap] +.success: +MOV R10, [RDX + RCX*SIZE_LONG] +MOV [R10 + Node_Tuple.value], EDX MOV ESI, ECX -CALL minheap@siftUp -.short_circuit: -POP R12 +CALL minheap@siftUp +MOV RAX, [BOOLs.TRUE] +.ext: RET priority_queue@construct: @@ -1378,7 +1267,7 @@ minheap@right: ; Description: ; Grabs right element index relative to given index. ; Parameters: -; EDI - (minheap) Index. +; EDI - (minheap) Index. ; RSI - () Unused. ; RDX - () Unused. ; R10 - () Unused. From a983c0c2db9c4b9090a12adf55fac3f3efe54dbd Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Jan 2026 21:22:10 -0800 Subject: [PATCH 77/87] Got A LOT of debugging process on. It seems the correct answer is being placed. Now I just need to correct all instances of the algorithm and print the correct result. --- archive/x/x86-64/dijkstra.asm | 239 ++++++++++++++++++++-------------- 1 file changed, 140 insertions(+), 99 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 2726f50e9..f74d098fe 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -144,7 +144,7 @@ POP RDI %DEFINE dijkstra.x 48 %DEFINE dijkstra.y 56 %DEFINE dijkstra.numVerts 64 -%DEFINE dijkstra.currentROw 72 +%DEFINE dijkstra.currentRow 72 @@ -178,8 +178,8 @@ Error_state: .CODE db 0 struc min_heap - .max_len resq 1 .size resq 1 + .max_len resq 1 .elems resq 1 endstruc @@ -203,14 +203,14 @@ section .text global _start _start: -INT3 + PUSH RBP MOV RBP, RSP SUB RSP, _start.STACK_INIT MOV RSI, [RBP + _start.argv1] CMP QWORD [RBP + _start.argc], VALID_ARGC CMOVNE RDI, [Err_Table + INVALID_ARGC*SIZE_LONG] -INT3 + CMOVNE RSI, [RBP + _start.argc] JNE .error @@ -271,16 +271,16 @@ MOV R13, [RBP - _start.graph] MOV RDI, NO_ADDR MOV RSI, R12 SHL RSI, MUL_INT - .chk_sze: INT3 + .chk_sze: MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL - .graph_mchk: INT3 + .graph_mchk: POP RCX MOV [R13 + RCX*SIZE_LONG], RAX - .graph_regchk: INT3 + .graph_regchk: INC RCX MOV [RBP - SIZE_LONG*1], RCX JMP .GRAPH_Inner @@ -291,13 +291,13 @@ MOV R13, [RBP - _start.graph] MOV RDI, [RBP + _start.argv1] MOV RSI, [RBP - _start.graph] MOV RDX, [RBP - _start.NumVerts] -.print_graph: INT3 +.print_graph: CALL parseVertices MOV RDI, [RBP - _start.SRC] MOV RSI, [RBP - _start.graph] MOV RDX, [RBP - _start.NumVerts] CALL dijkstra -.dijkstra_complete: +.dijkstra_complete: INT3 MOV RCX, [RBP - _start.DST] MOV EBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX @@ -340,7 +340,7 @@ SYSCALL MOV RAX, SYS_EXIT POP RSI POP RDI - INT3 + SYSCALL itoa: @@ -363,7 +363,7 @@ PUSH RBX PUSH RDX PUSH R10 PUSH R8 -.itoa_check: INT3 +.itoa_check: XOR RCX, RCX MOV RAX, RDI MOV RBX, 10 @@ -458,7 +458,7 @@ MOV RCX, 0 MOV RAX, SYS_EXIT POP RDI - INT3 + SYSCALL parseVertices: @@ -553,14 +553,14 @@ MOV [RBP - parseVertices.NumPtr], RDI MOV RDI, [RBP - parseVertices.NumPtr] MOV RSI, [RBP - parseVertices.strlen] CALL atoi - .atoi_res: INT3 + .atoi_res: MOV RCX, [RBP - parseVertices.NumElems] MOV R12, [RBP - parseVertices.DST] - .chkDstVert: INT3 + .chkDstVert: MOV RDI, [R12 + RBX*SIZE_LONG] - .chkDstRdi: INT3 + .chkDstRdi: MOV [RDI + RCX*SIZE_INT], EAX - .arr_chk: INT3 + .arr_chk: .skip_move: POP RDX POP RCX @@ -581,7 +581,7 @@ MOV [RBP - parseVertices.NumPtr], RDI JB .skipReset MOV QWORD [RBP - parseVertices.NumElems], 0 INC RBX - INT3 + .skipReset: JMP .validate .space: @@ -618,7 +618,7 @@ MOV [RBP - parseVertices.NumPtr], RDI ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. MOV RAX, SYS_EXIT MOV RDI, [RBP - parseVertices.PrevState] - INT3 + SYSCALL @@ -649,14 +649,16 @@ PUSH RBX PUSH R12 PUSH R13 PUSH R14 +PUSH R15 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.graph], RSI MOV [RBP - dijkstra.numVerts], RDX -MOV [RBP - dijkstra.x], 0 -MOV [RBP - dijkstra.y], 0 +.chkInps: INT3 +MOV DWORD [RBP - dijkstra.x], 0 +MOV DWORD [RBP - dijkstra.y], 0 -MOV RDX, [RBP - dijkstra.SRC] -MOV RSI, [RBP - dijkstra.graph] +MOV RSI, [RBP - dijkstra.SRC] +MOV RDI, [RBP - dijkstra.graph] CALL dijkstra~GetRow MOV [RBP - dijkstra.currentRow], RAX MOV RSI, [RBP - dijkstra.SRC] @@ -672,7 +674,7 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RBP _ dijkstra.prev], RAX +MOV [RBP - dijkstra.prev], RAX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -683,7 +685,7 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL -MOV [RBP _ dijkstra.dist], RAX +MOV [RBP - dijkstra.dist], RAX MMAP_POP MOV RCX, 0 MOV R8, [RBP - dijkstra.prev] @@ -691,83 +693,92 @@ MOV R9, [RBP - dijkstra.dist] .dists_loop: CMP RCX, [RBP - dijkstra.numVerts] JE .dists_ext - MOV [R8 + RCX*SIZE_INT], 0 - MOV [R9 + RCX*SIZE_INT], INT_MAX + INT3 + MOV DWORD [R8 + RCX*SIZE_INT], 0 + MOV DWORD [R9 + RCX*SIZE_INT], INT_MAX INC RCX JMP .dists_loop .dists_ext: -MOV RCX, [RBP - dijkstra.numVerts] -MOV [R9 + RCX*SIZE_INT], 0 - -MOV RDI, RCX +MOV RCX, [RBP - dijkstra.SRC] +MOV DWORD [R9 + RCX*SIZE_INT], 0 +.chkDistsArr: INT3 +MOV RDI, [RBP - dijkstra.numVerts] CALL priority_queue@construct MOV [RBP - dijkstra.PriorityQueue], RAX -MOV RCX, [RBP - dijkstra.numVerts] +MOV RCX, 0 MOV RDX, [RBP - dijkstra.currentRow] - .PQ_INIT: - CMP RCX, [RBP - dijkstra.numVerts] - JE .PQ_INIT_EXIT - - MOV EDI, ECX - MOV ESI, [RDX + RCX*SIZE_INT] - CALL dijkstra~GenerateTuple - - MOV RDI, [RBP - dijkstra.PriorityQueue] - MOV RSI, RAX - CALL priority_queue@add - - INC RCX - JMP .PQ_INIT +MOV RDI, [RBP - dijkstra.SRC] +MOV ESI, 0 +CALL dijkstra~GenerateTuple +MOV RSI, RAX +MOV RDI, [RBP - dijkstra.PriorityQueue] +CALL priority_queue@add .PQ_INIT_EXIT: MOV RDI, [RBP - dijkstra.PriorityQueue] .PQ_LOOP: CALL priority_queue@isEmpty + .raxchk: INT3 CMP RAX, [BOOLs.TRUE] JE .PQ_EXIT - + .chkRDI: INT3 + MOV RDI, [RBP - dijkstra.PriorityQueue] CALL priority_queue@remove - MOV EBX, [RAX + Node_Tuple.element] + INT3 + MOV EBX, [RAX + NodeTuple.element] MOV [RBP - dijkstra.x], EBX MOV RCX, [RBP - dijkstra.dist] MOV ECX, [RCX + RBX*SIZE_INT] MOV RBX, RAX - CMP [RBX + Node_Tuple.value], ECX - JA .PQ_LOOP - - - + CMP ECX, 0 + JE .PQ_PASS + CMP ECX, -1 + JE .PQ_PASS + CMP [RBX + NodeTuple.value], ECX + JA .PQ_LOOP + .PQ_PASS: + .flag: INT3 MOV RDI, [RBP - dijkstra.graph] - MOV ESI, [RBX + Node_Tuple.value] + MOV ESI, [RBX + NodeTuple.element] + MOV R14D, ESI CALL dijkstra~GetRow + .chkRow: INT3 MOV [RBP - dijkstra.currentRow], RAX MOV R11, [RBP - dijkstra.dist] - MOV RCX. 0 + MOV R15, [RBP - dijkstra.currentRow] + MOV RCX, 0 .neighbor_loop: - CMP DWORD [R11 + RCX*SIZE_INT], 0 + INT3 + CMP DWORD [R15 + RCX*SIZE_INT], 0 JE .neighbor_iterate - - MOV EDX, [R11 + RCX*SIZE_INT] - MOV R12D, [RBX + Node_Tuple.element] - MOV R12D, [R11 + R12*SIZE_INT] - ADD R12D, EDX + MOV R14, [RBP - dijkstra.x] + MOV R12D, [R11 + R14*SIZE_INT] + ADD R12D, [R15 + RCX*SIZE_INT] MOV R13D, [R11 + RCX*SIZE_INT] + CMP R13D, -1 + JE .update CMP R12D, R13D - JB .neighbor_iterate + .12chk: INT3 + JAE .neighbor_iterate + .update: MOV [R11 + RCX*SIZE_INT], R12D - MOV RDI, RCX - MOV ESI, [R11 + RCX*SIZE_INT] + MOV ESI, R12D + .chkDst: INT3 + .checkTuple: INT3 CALL dijkstra~GenerateTuple - + .chkNewTuple: INT3 MOV RDI, [RBP - dijkstra.PriorityQueue] MOV RSI, RAX CALL priority_queue@add .neighbor_iterate: INC RCX + CMP RCX, [RBP - dijkstra.numVerts] + JE .PQ_LOOP JMP .neighbor_loop .PQ_EXIT: +POP R15 POP R14 POP R13 POP R12 @@ -798,7 +809,8 @@ dijkstra~GenerateTuple: ; Clobbers - ; --------------------------------------------------------------------------- MMAP_PUSH - +PUSH RSI +PUSH RDI MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, NodeTuple_size @@ -807,6 +819,8 @@ MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL +POP RDI +POP RSI MOV DWORD [RAX + NodeTuple.value], ESI MOV DWORD [RAX + NodeTuple.element], EDI @@ -850,19 +864,29 @@ priority_queue@add: ; Clobbers - ; --------------------------------------------------------------------------- MMAP_PUSH ;Having abstracted the min heap allows me to do this. +PUSH R12 +MOV R12, RSI MOV EDX, [RDI + priority_queue.size] +.sze: INT3 +MOV ESI, [RDI + priority_queue.size] CMP EDX, [RDI + priority_queue.max_len] CMOVE RAX, [BOOLs.FALSE] JE .ext MOV R8, [RDI + priority_queue.heap] -MOV [R8 + RDX*SIZE_LONG], RSI +MOV R8, [R8 + min_heap.elems] +MOV [R8 + RSI*SIZE_LONG], R12 +.chkheap: INT3 INC EDX -INC [RDI + priority_queue.size] -MOV RDI, R8 -MOV ESI, EDX +INC DWORD [RDI + priority_queue.size] +.sze2: INT3 +MOV R8D, [RDI + priority_queue.size] +MOV RDI, [RDI + priority_queue.heap] +MOV [RDI + min_heap.size], R8D +INT3 CALL minheap@siftUp MOV RAX, [BOOLs.TRUE] .ext: +POP R12 MMAP_POP RET @@ -884,25 +908,40 @@ priority_queue@remove: ; Clobbers - RDI, RSI, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- PUSH RDI +PUSH RBX +PUSH R12 +PUSH R13 +MOV RBX, [RDI + priority_queue.heap] +MOV R12, [RBX + min_heap.elems] +.R12CHK: INT3 CMP DWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] -JE .ext: - -MOV RSI, [RDI + priority_queue.heap] -MOV RCX, [RDI + min_heap.elems] -MOV RAX, [RCX] +JE .ext +MOV RAX, [R12] PUSH RAX +MOV QWORD [R12], NULL MOV EDX, [RDI + priority_queue.size] +.bfr: INT3 DEC EDX -MOV R8, [RCX + RDX*SIZE_LONG] -MOV [RCX], R8 - -MOV RDI, RSI +.aftr: INT3 +DEC DWORD [RDI + priority_queue.size] +MOV R13D, [RDI + priority_queue.size] +MOV [RBX + min_heap.size], R13D +PUSH RDI +.chkHp: INT3 +MOV RDI, RBX +MOV RSI, 0 +CALL minheap@swap +POP RDI MOV ESI, 0 CALL minheap@siftDown +.chkModHP: INT3 POP RAX .ext: +POP R13 +POP R12 +POP RBX POP RDI RET @@ -922,13 +961,19 @@ priority_queue@peek: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or nil (0). ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. ; --------------------------------------------------------------------------- +PUSH RBX +PUSH R12 +MOV RBX, priority_queue.heap +MOV R12, min_heap.elems CMP DWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] -JE .ext: -MOV RSI, [RDI + priority_queue.heap] -MOV RCX, [RSI + min_heap.elems] +JE .ext +MOV RSI, [RDI + RBX] +MOV RCX, [RSI + R12] MOV RAX, [RCX] .ext: +POP R12 +POP RBX RET @@ -997,13 +1042,13 @@ MOV RCX, 0 CMOVE RAX, [BOOLs.FALSE] JE .ext MOV R10, [RDX + RCX*SIZE_LONG] - CMP ESI, [R10 + Node_Tuple.element] + CMP ESI, [R10 + NodeTuple.element] JE .success INC ECX JNE .search .success: MOV R10, [RDX + RCX*SIZE_LONG] -MOV [R10 + Node_Tuple.value], EDX +MOV [R10 + NodeTuple.value], EDX MOV ESI, ECX CALL minheap@siftUp MOV RAX, [BOOLs.TRUE] @@ -1026,6 +1071,7 @@ priority_queue@construct: ; RAX - (PriorityQueue*)Ptr to new PQ. ; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9 ; --------------------------------------------------------------------------- +.constrct:INT3 PUSH RBP MOV RBP, RSP SUB RSP, priority_queue@construct.STACK_INIT @@ -1043,7 +1089,7 @@ MOV R9, NO_OFFSET SYSCALL MOV [RBP - priority_queue@construct.PQPtr], RAX MOV QWORD [RAX + priority_queue.size], 0 -MOV QWORD [RAX + priority_queue.max_len], R12 +MOV [RAX + priority_queue.max_len], R12D MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -1115,7 +1161,6 @@ minheap@siftUp: PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftUp.STACK_INIT - .sift_loop: CMP ESI, 0 JE .sift_ext @@ -1125,10 +1170,11 @@ SUB RSP, minheap@siftUp.STACK_INIT MOV R11, RDI POP RDI MOV RDX, [RDI + min_heap.elems] + INT3 MOV R8, [RDX + RAX*SIZE_LONG] MOV R9, [RDX + RSI*SIZE_LONG] - MOV ECX, [R8 + Node_Tuple.value] - CMP ECX, [R9 + Node_Tuple.value] + MOV ECX, [R8 + NodeTuple.value] + CMP ECX, [R9 + NodeTuple.value] JBE .sift_ext MOV EDX, EAX MOV ESI, R11D @@ -1211,7 +1257,7 @@ minheap@swap: ; R9 - () Unused. ; Returns: ; RAX - () None. -; Clobbers - R8, R9. +; Clobbers - R8, R9, R10. ; --------------------------------------------------------------------------- MOV R10, [RDI + min_heap.elems] MOV R8, [R10 + RSI*SIZE_LONG] @@ -1288,7 +1334,7 @@ minheap@construct: ; Constructs minheap with information generated by priority_queue@construct ; Parameters: ; RDI - (long[]*) Element array. -; ESI - (int) Array size in memory. +; ESI - (int) Array size. ; RDX - () Unused. ; R10 - () Unused. ; R8 - () Unused. @@ -1335,17 +1381,12 @@ minheap@destruct: MOV RDX, RDI MOV RAX, SYS_MUNMAP -MOV RDI, [RDX + min_heap.array] -MOV RSI, [RDX + min_heap.arr_size] -SYSCALL - -MOV RAX, SYS_MUNMAP -MOV RDI, [RDX + min_heap.elements] -MOV RSI, [RDX + min_heap.arr_size] +MOV RDI, [RDX + min_heap.elems] +MOV RSI, [RDX + min_heap.max_len] SYSCALL MOV RAX, SYS_MUNMAP -MOV RDI, [RDX + min_heap.array] +MOV RDI, [RDX] MOV RSI, min_heap_size SYSCALL @@ -1405,7 +1446,7 @@ atoi: ; Clobbers - RAX, RDX, RCX, R10. ; --------------------------------------------------------------------------- PUSH RBX - .check_atoi: INT3 + .check_atoi: MOV RCX, 0 MOV RBX, 10 @@ -1418,7 +1459,7 @@ atoi: INC RCX JB .loop .ext: - .check_atoi2: INT3 + .check_atoi2: POP RBX RET From 04d9f16354a1538b257ef84d53842d0b243a5e8a Mon Sep 17 00:00:00 2001 From: = Date: Sun, 4 Jan 2026 23:31:40 -0800 Subject: [PATCH 78/87] So close to finishing debugging and completing this. I will also need to remove debugging artifacts and pretty up the code. --- archive/x/x86-64/dijkstra.asm | 61 ++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index f74d098fe..370d0d7cb 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -112,6 +112,8 @@ POP RDI %DEFINE MAP_SHARED 0x01 %DEFINE MAP_ANONYMOUS 0x20 +%DEFINE SYS_MPROTECT 10 + %DEFINE SYS_MUNMAP 11 ;Thread @@ -201,6 +203,7 @@ section .bss section .text global _start + _start: @@ -291,7 +294,6 @@ MOV R13, [RBP - _start.graph] MOV RDI, [RBP + _start.argv1] MOV RSI, [RBP - _start.graph] MOV RDX, [RBP - _start.NumVerts] -.print_graph: CALL parseVertices MOV RDI, [RBP - _start.SRC] MOV RSI, [RBP - _start.graph] @@ -653,7 +655,6 @@ PUSH R15 MOV [RBP - dijkstra.SRC], RDI MOV [RBP - dijkstra.graph], RSI MOV [RBP - dijkstra.numVerts], RDX -.chkInps: INT3 MOV DWORD [RBP - dijkstra.x], 0 MOV DWORD [RBP - dijkstra.y], 0 @@ -693,7 +694,6 @@ MOV R9, [RBP - dijkstra.dist] .dists_loop: CMP RCX, [RBP - dijkstra.numVerts] JE .dists_ext - INT3 MOV DWORD [R8 + RCX*SIZE_INT], 0 MOV DWORD [R9 + RCX*SIZE_INT], INT_MAX INC RCX @@ -712,19 +712,24 @@ MOV RDI, [RBP - dijkstra.SRC] MOV ESI, 0 CALL dijkstra~GenerateTuple MOV RSI, RAX -MOV RDI, [RBP - dijkstra.PriorityQueue] -CALL priority_queue@add -.PQ_INIT_EXIT: MOV RDI, [RBP - dijkstra.PriorityQueue] +CALL priority_queue@add +.PQ_INIT_EXIT: .PQ_LOOP: + MOV RDI, [RBP - dijkstra.PriorityQueue] CALL priority_queue@isEmpty .raxchk: INT3 CMP RAX, [BOOLs.TRUE] JE .PQ_EXIT .chkRDI: INT3 MOV RDI, [RBP - dijkstra.PriorityQueue] + PUSH R15 + MOV R15, [RDI + priority_queue.heap] + .dijkCHKHP: INT3 CALL priority_queue@remove - INT3 + MOV R15, [RDI + priority_queue.heap] + .dijkCHKHP2: INT3 + POP R15 MOV EBX, [RAX + NodeTuple.element] MOV [RBP - dijkstra.x], EBX MOV RCX, [RBP - dijkstra.dist] @@ -762,6 +767,12 @@ MOV RDI, [RBP - dijkstra.PriorityQueue] JAE .neighbor_iterate .update: MOV [R11 + RCX*SIZE_INT], R12D + MOV RDI, [RBP - dijkstra.PriorityQueue] + MOV ESI, ECX + MOV EDX, R12D + CALL priority_queue@decreaseKey + CMP RAX, 1 + JE .neighbor_iterate MOV RDI, RCX MOV ESI, R12D .chkDst: INT3 @@ -866,10 +877,10 @@ priority_queue@add: MMAP_PUSH ;Having abstracted the min heap allows me to do this. PUSH R12 MOV R12, RSI -MOV EDX, [RDI + priority_queue.size] +MOV RDX, [RDI + priority_queue.size] .sze: INT3 -MOV ESI, [RDI + priority_queue.size] -CMP EDX, [RDI + priority_queue.max_len] +MOV RSI, [RDI + priority_queue.size] +CMP RDX, [RDI + priority_queue.max_len] CMOVE RAX, [BOOLs.FALSE] JE .ext MOV R8, [RDI + priority_queue.heap] @@ -912,6 +923,7 @@ PUSH RBX PUSH R12 PUSH R13 MOV RBX, [RDI + priority_queue.heap] +.chkHeeP: INT3 MOV R12, [RBX + min_heap.elems] .R12CHK: INT3 CMP DWORD [RDI + priority_queue.size], 0 @@ -934,6 +946,7 @@ MOV RDI, RBX MOV RSI, 0 CALL minheap@swap POP RDI +MOV RDI, [RDI + priority_queue.heap] MOV ESI, 0 CALL minheap@siftDown .chkModHP: INT3 @@ -991,13 +1004,14 @@ priority_queue@isEmpty: ; R8 - () Unused. ; R9 - () Unused. ; Returns: -; RAX - (bool) Boolean denoting whether PQ is empty (true) or not (false). +; RAX - (bool) RAX == 0 FALSE; RAX == 1 TRUE ; Clobbers - RAX, RDI. ; --------------------------------------------------------------------------- MOV RAX, 0 CMP QWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] CMOVE RAX, [BOOLs.TRUE] +.rx:INT3 RET priority_queue@size: @@ -1035,7 +1049,10 @@ priority_queue@decreaseKey: ; EAX - (int) EAX == 0 : NOT IN QUEUE; EAX == 1 : IN QUEUE. ; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8. ; --------------------------------------------------------------------------- +MMAP_PUSH MOV RDX, [RDI + priority_queue.heap] +.chkMH: INT3 +MOV RDX, [RDX + min_heap.elems] MOV RCX, 0 .search: CMP ECX, [RDI + priority_queue.size] @@ -1053,6 +1070,7 @@ MOV ESI, ECX CALL minheap@siftUp MOV RAX, [BOOLs.TRUE] .ext: +MMAP_POP RET priority_queue@construct: @@ -1089,7 +1107,14 @@ MOV R9, NO_OFFSET SYSCALL MOV [RBP - priority_queue@construct.PQPtr], RAX MOV QWORD [RAX + priority_queue.size], 0 -MOV [RAX + priority_queue.max_len], R12D +MOV [RAX + priority_queue.max_len], R12 + +MOV RDI, [RAX + priority_queue.max_len] +MOV RAX, SYS_MPROTECT +MOV RSI, SIZE_LONG +MOV RDX, PROT_READ +MOV R8, 0 +SYSCALL MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -1167,6 +1192,7 @@ SUB RSP, minheap@siftUp.STACK_INIT PUSH RDI MOV RDI, RSI CALL minheap@parent + INT3 MOV R11, RDI POP RDI MOV RDX, [RDI + min_heap.elems] @@ -1205,6 +1231,8 @@ minheap@siftDown: PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftDown.STACK_INIT +PUSH RDI +.sftSTRT: INT3 .sift: MOV RCX, RDI @@ -1234,9 +1262,10 @@ SUB RSP, minheap@siftDown.STACK_INIT CALL minheap@swap POP RSI POP RDI - JMP .sift - + JMP .sift .siftEXT: +POP RDI +.sftCMPL: INT3 ADD RSP, minheap@siftDown.STACK_INIT MOV RSP, RBP POP RBP @@ -1259,11 +1288,13 @@ minheap@swap: ; RAX - () None. ; Clobbers - R8, R9, R10. ; --------------------------------------------------------------------------- +.chkMH: INT3 MOV R10, [RDI + min_heap.elems] MOV R8, [R10 + RSI*SIZE_LONG] MOV R9, [R10 + RDX*SIZE_LONG] MOV [R10 + RSI*SIZE_LONG], R9 MOV [R10 + RDX*SIZE_LONG], R8 +.chkMH2: INT3 RET @@ -1357,7 +1388,7 @@ SYSCALL MMAP_POP MOV [RAX + min_heap.elems], RDI -MOV [RAX + min_heap.max_len], ESI +MOV [RAX + min_heap.max_len], RSI MOV QWORD [RAX + min_heap.size], 0 RET From f184cb6640db42a6c3c38944746419abc1a85d63 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 00:21:41 -0800 Subject: [PATCH 79/87] I think all of the bugs are worked out now, but we'll see. I'm going to test this against some cases not presented on the sample-programs website just in case. --- archive/x/x86-64/dijkstra.asm | 147 +++++++++++++++++----------------- 1 file changed, 73 insertions(+), 74 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 370d0d7cb..287869623 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -154,6 +154,10 @@ POP RDI section .rodata +newline: + .msg db 0xA + .len equ $- .msg + Error: .msg db 'Usage: please provide three inputs: a serialized matrix, a source node and a destination node' .len equ $- .msg @@ -299,7 +303,7 @@ MOV RDI, [RBP - _start.SRC] MOV RSI, [RBP - _start.graph] MOV RDX, [RBP - _start.NumVerts] CALL dijkstra -.dijkstra_complete: INT3 +.dijkstra_complete: MOV RCX, [RBP - _start.DST] MOV EBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX @@ -307,24 +311,32 @@ MOV [RBP - _start.RET], RBX MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, MAX_STR_INT +INC RSI MOV RDX, PROT_READ | PROT_WRITE MOV R10, MAP_SHARED | MAP_ANONYMOUS MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL - -PUSH RAX -MOV RDI, RBX -MOV R15, RDI +MOV R15, RAX +MOV RDI, [RBP - _start.RET] MOV RSI, RAX CALL itoa -MOV RAX, R10 +MOV R10, RAX +MOV RSI, R15 +INC RAX +MOV BYTE [RSI + RAX], NULL MOV RAX, SYS_WRITE MOV RDI, STDOUT MOV RSI, R15 MOV RDX, R10 SYSCALL +MOV RAX, SYS_WRITE +MOV RDI, STDOUT +MOV RSI, newline.msg +MOV RDX, newline.len +SYSCALL + MOV RAX, SYS_EXIT MOV RDI, [Err_Table+EXIT_OK*SIZE_LONG] SYSCALL @@ -361,46 +373,33 @@ itoa: ; RAX - (int) Strlen. ; Clobbers - RAX, RDI, RSI, RCX, RDX ; --------------------------------------------------------------------------- -PUSH RBX -PUSH RDX -PUSH R10 -PUSH R8 -.itoa_check: -XOR RCX, RCX +.chkINP: INT3 +CMP RDI, 0 +JE .zero +MOV R8, 10 +MOV RCX, 0 MOV RAX, RDI -MOV RBX, 10 - .loop: - CMP RAX, 0 - JE .ext - XOR RDX, RDX - DIV RBX - ADD RDX, '0' - MOV BYTE [RSI + RCX], DL - INC RCX - JMP .loop -.ext: -MOV BYTE [RSI + RCX], 0 -PUSH RCX - -DEC RCX MOV RDX, 0 - .reverse: - CMP RDX, RCX - JAE .ext2 - MOV R10B, [RSI+RDX] - MOV R8B, [RSI+RCX] - MOV [RSI+RDX], R8B - MOV [RSI+RCX], R10B - INC RDX - DEC RCX - JMP .reverse -.ext2: -POP RCX +INT3 +.loop: + CMP RAX, 0 + JE .ext + CMP RCX, MAX_STR_INT ; I don't like accessing global stuff from inside functions, though these definitions are stateless at least. + JA .ext + DIV R8 + ADD RDX, '0' + MOV [RSI + RCX], DL + INT3 + MOV RDX, 0 + INC RCX + JMP .loop +.zero: +INT3 +MOV BYTE [RSI], '0' +MOV RAX, 1 +.ext: MOV RAX, RCX -POP R8 -POP R10 -POP RDX -POP RBX +.ITOACHK: INT3 RET parseSRCDST: @@ -701,7 +700,7 @@ MOV R9, [RBP - dijkstra.dist] .dists_ext: MOV RCX, [RBP - dijkstra.SRC] MOV DWORD [R9 + RCX*SIZE_INT], 0 -.chkDistsArr: INT3 +.chkDistsArr: MOV RDI, [RBP - dijkstra.numVerts] CALL priority_queue@construct MOV [RBP - dijkstra.PriorityQueue], RAX @@ -718,17 +717,17 @@ CALL priority_queue@add .PQ_LOOP: MOV RDI, [RBP - dijkstra.PriorityQueue] CALL priority_queue@isEmpty - .raxchk: INT3 + .raxchk: CMP RAX, [BOOLs.TRUE] JE .PQ_EXIT - .chkRDI: INT3 + .chkRDI: MOV RDI, [RBP - dijkstra.PriorityQueue] PUSH R15 MOV R15, [RDI + priority_queue.heap] - .dijkCHKHP: INT3 + .dijkCHKHP: CALL priority_queue@remove MOV R15, [RDI + priority_queue.heap] - .dijkCHKHP2: INT3 + .dijkCHKHP2: POP R15 MOV EBX, [RAX + NodeTuple.element] MOV [RBP - dijkstra.x], EBX @@ -742,18 +741,18 @@ CALL priority_queue@add CMP [RBX + NodeTuple.value], ECX JA .PQ_LOOP .PQ_PASS: - .flag: INT3 + .flag: MOV RDI, [RBP - dijkstra.graph] MOV ESI, [RBX + NodeTuple.element] MOV R14D, ESI CALL dijkstra~GetRow - .chkRow: INT3 + .chkRow: MOV [RBP - dijkstra.currentRow], RAX MOV R11, [RBP - dijkstra.dist] MOV R15, [RBP - dijkstra.currentRow] MOV RCX, 0 .neighbor_loop: - INT3 + CMP DWORD [R15 + RCX*SIZE_INT], 0 JE .neighbor_iterate MOV R14, [RBP - dijkstra.x] @@ -763,7 +762,7 @@ CALL priority_queue@add CMP R13D, -1 JE .update CMP R12D, R13D - .12chk: INT3 + .12chk: JAE .neighbor_iterate .update: MOV [R11 + RCX*SIZE_INT], R12D @@ -775,10 +774,10 @@ CALL priority_queue@add JE .neighbor_iterate MOV RDI, RCX MOV ESI, R12D - .chkDst: INT3 - .checkTuple: INT3 + .chkDst: + .checkTuple: CALL dijkstra~GenerateTuple - .chkNewTuple: INT3 + .chkNewTuple: MOV RDI, [RBP - dijkstra.PriorityQueue] MOV RSI, RAX CALL priority_queue@add @@ -878,7 +877,7 @@ MMAP_PUSH ;Having abstracted the min heap allows me to do this. PUSH R12 MOV R12, RSI MOV RDX, [RDI + priority_queue.size] -.sze: INT3 +.sze: MOV RSI, [RDI + priority_queue.size] CMP RDX, [RDI + priority_queue.max_len] CMOVE RAX, [BOOLs.FALSE] @@ -886,14 +885,14 @@ JE .ext MOV R8, [RDI + priority_queue.heap] MOV R8, [R8 + min_heap.elems] MOV [R8 + RSI*SIZE_LONG], R12 -.chkheap: INT3 +.chkheap: INC EDX INC DWORD [RDI + priority_queue.size] -.sze2: INT3 +.sze2: MOV R8D, [RDI + priority_queue.size] MOV RDI, [RDI + priority_queue.heap] MOV [RDI + min_heap.size], R8D -INT3 + CALL minheap@siftUp MOV RAX, [BOOLs.TRUE] .ext: @@ -923,9 +922,9 @@ PUSH RBX PUSH R12 PUSH R13 MOV RBX, [RDI + priority_queue.heap] -.chkHeeP: INT3 +.chkHeeP: MOV R12, [RBX + min_heap.elems] -.R12CHK: INT3 +.R12CHK: CMP DWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] JE .ext @@ -934,14 +933,14 @@ PUSH RAX MOV QWORD [R12], NULL MOV EDX, [RDI + priority_queue.size] -.bfr: INT3 +.bfr: DEC EDX -.aftr: INT3 +.aftr: DEC DWORD [RDI + priority_queue.size] MOV R13D, [RDI + priority_queue.size] MOV [RBX + min_heap.size], R13D PUSH RDI -.chkHp: INT3 +.chkHp: MOV RDI, RBX MOV RSI, 0 CALL minheap@swap @@ -949,7 +948,7 @@ POP RDI MOV RDI, [RDI + priority_queue.heap] MOV ESI, 0 CALL minheap@siftDown -.chkModHP: INT3 +.chkModHP: POP RAX .ext: POP R13 @@ -1011,7 +1010,7 @@ MOV RAX, 0 CMP QWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] CMOVE RAX, [BOOLs.TRUE] -.rx:INT3 +.rx: RET priority_queue@size: @@ -1051,7 +1050,7 @@ priority_queue@decreaseKey: ; --------------------------------------------------------------------------- MMAP_PUSH MOV RDX, [RDI + priority_queue.heap] -.chkMH: INT3 +.chkMH: MOV RDX, [RDX + min_heap.elems] MOV RCX, 0 .search: @@ -1089,7 +1088,7 @@ priority_queue@construct: ; RAX - (PriorityQueue*)Ptr to new PQ. ; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9 ; --------------------------------------------------------------------------- -.constrct:INT3 +.constrct: PUSH RBP MOV RBP, RSP SUB RSP, priority_queue@construct.STACK_INIT @@ -1192,11 +1191,11 @@ SUB RSP, minheap@siftUp.STACK_INIT PUSH RDI MOV RDI, RSI CALL minheap@parent - INT3 + MOV R11, RDI POP RDI MOV RDX, [RDI + min_heap.elems] - INT3 + MOV R8, [RDX + RAX*SIZE_LONG] MOV R9, [RDX + RSI*SIZE_LONG] MOV ECX, [R8 + NodeTuple.value] @@ -1232,7 +1231,7 @@ PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftDown.STACK_INIT PUSH RDI -.sftSTRT: INT3 +.sftSTRT: .sift: MOV RCX, RDI @@ -1265,7 +1264,7 @@ PUSH RDI JMP .sift .siftEXT: POP RDI -.sftCMPL: INT3 +.sftCMPL: ADD RSP, minheap@siftDown.STACK_INIT MOV RSP, RBP POP RBP @@ -1288,13 +1287,13 @@ minheap@swap: ; RAX - () None. ; Clobbers - R8, R9, R10. ; --------------------------------------------------------------------------- -.chkMH: INT3 +.chkMH: MOV R10, [RDI + min_heap.elems] MOV R8, [R10 + RSI*SIZE_LONG] MOV R9, [R10 + RDX*SIZE_LONG] MOV [R10 + RSI*SIZE_LONG], R9 MOV [R10 + RDX*SIZE_LONG], R8 -.chkMH2: INT3 +.chkMH2: RET From 1258007c3d3c1199edaa6f73d760ffe572ffb4d9 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 01:28:14 -0800 Subject: [PATCH 80/87] I think this is finished now? Time to test against the actual test cases. --- archive/x/x86-64/dijkstra.asm | 81 +++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 14 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 287869623..9d3874636 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -206,9 +206,43 @@ section .bss section .text -global _start - +reverseString: +; ---------------------------------------------------------------------------- +; Function: Int to ASCII +; Description: +; Converts integer to ASCII, returned through char[] ptr. +; Parameters: +; RDI - (char[]*) String ptr. +; RSI - (int) Strlen +; RDX - () Unused. +; R10 - () Unused. +; R8 - () Unused. +; R9 - () Unused. +; Returns: +; RAX - () None. +; Clobbers - RCX, RDX, R9, R9 +; --------------------------------------------------------------------------- +CMP RSI, 1 +JBE .ext + +MOV RCX, 0 +MOV RDX, RSI +DEC RDX + +.loop: + CMP RCX, RDX + JAE .ext + MOV R8B, [RDI+RCX] + MOV R9B, [RDI+RDX] + MOV [RDI+RCX], R9B + MOV [RDI+RDX], R8B + INC RCX + DEC RDX + JMP .loop +.ext: +RET +global _start _start: PUSH RBP @@ -237,8 +271,8 @@ MOV RBX, 0 .count_end: INC RBX MOV RDI, RBX +.grphchk: CALL ezsqrt - MOV [RBP - _start.NumVerts], RAX CMP RAX, -1 CMOVE RDI, [Err_Table + INVALID_NOT_SQUARE*SIZE_LONG] @@ -249,6 +283,11 @@ MOV [RBP - _start.SRC], RAX MOV RDI, [RBP + _start.argv3] CALL parseSRCDST MOV [RBP - _start.DST], RAX +MOV RAX, [RBP - _start.SRC] +MOV RBX, [RBP - _start.DST] +CMP RAX, RBX +CMOVE RDI, [Err_Table+INVALID_SRCDST] +JE .error MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -321,14 +360,22 @@ MOV R15, RAX MOV RDI, [RBP - _start.RET] MOV RSI, RAX CALL itoa -MOV R10, RAX + +MOV R12, RAX MOV RSI, R15 +PUSH RAX +MOV RDI, R15 +MOV RSI, R12 +CALL reverseString +POP RAX INC RAX +MOV RSI, R15 MOV BYTE [RSI + RAX], NULL + MOV RAX, SYS_WRITE MOV RDI, STDOUT MOV RSI, R15 -MOV RDX, R10 +MOV RDX, R12 SYSCALL MOV RAX, SYS_WRITE @@ -351,6 +398,12 @@ SYSCALL MOV RDX, Error.len SYSCALL + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, newline.msg + MOV RDX, newline.len + SYSCALL + MOV RAX, SYS_EXIT POP RSI POP RDI @@ -373,14 +426,18 @@ itoa: ; RAX - (int) Strlen. ; Clobbers - RAX, RDI, RSI, RCX, RDX ; --------------------------------------------------------------------------- -.chkINP: INT3 +.chkINP: CMP RDI, 0 JE .zero MOV R8, 10 MOV RCX, 0 MOV RAX, RDI MOV RDX, 0 -INT3 +JMP .loop +.zero: +MOV BYTE [RSI], '0' +MOV RAX, 1 +JMP .ext .loop: CMP RAX, 0 JE .ext @@ -389,17 +446,13 @@ INT3 DIV R8 ADD RDX, '0' MOV [RSI + RCX], DL - INT3 + MOV RDX, 0 INC RCX - JMP .loop -.zero: -INT3 -MOV BYTE [RSI], '0' -MOV RAX, 1 + JMP .loop .ext: MOV RAX, RCX -.ITOACHK: INT3 +.ITOACHK: RET parseSRCDST: From 232ec14142c947daa8d12786aa27ece42801b24a Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 01:48:50 -0800 Subject: [PATCH 81/87] All test cases + some extra passing. Time to clean this up and make it look presentable. --- archive/x/x86-64/dijkstra.asm | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 9d3874636..198c60bb9 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -33,7 +33,7 @@ POP RDI %DEFINE INVALID_STATE 7 %DEFINE INVALID_EMPTY 8 %DEFINE INVALID_BAD_STR 9 - +%DEFINE INVALID_NO_WAY 10 %DEFINE VALID_ARGC 4 ; CONSTANTS @@ -173,6 +173,7 @@ Err_Table: ; This is absurd but this because of CMOV not allowing immediates. dq -7 dq -8 dq -9 + dq -10 BOOLs: .TRUE dq 1 @@ -248,6 +249,18 @@ _start: PUSH RBP MOV RBP, RSP SUB RSP, _start.STACK_INIT + +MOV RDI, [Err_Table + INVALID_EMPTY] +MOV RAX, [RBP + _start.argv1] +CMP BYTE [RAX], 0 +JE .error +MOV RAX, [RBP + _start.argv2] +CMP BYTE [RAX], 0 +JE .error +MOV RAX, [RBP + _start.argv3] +CMP BYTE [RAX], 0 +JE .error + MOV RSI, [RBP + _start.argv1] CMP QWORD [RBP + _start.argc], VALID_ARGC CMOVNE RDI, [Err_Table + INVALID_ARGC*SIZE_LONG] @@ -346,6 +359,9 @@ CALL dijkstra MOV RCX, [RBP - _start.DST] MOV EBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX +CMP EBX, -1 +CMOVE RDI, [Err_Table + INVALID_NO_WAY] +JE .error MOV RAX, SYS_MMAP MOV RDI, NO_ADDR @@ -510,6 +526,12 @@ MOV RCX, 0 MOV RDX, Error.len SYSCALL + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, newline.msg + MOV RDX, newline.len + SYSCALL + MOV RAX, SYS_EXIT POP RDI @@ -672,7 +694,6 @@ MOV [RBP - parseVertices.NumPtr], RDI ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. MOV RAX, SYS_EXIT MOV RDI, [RBP - parseVertices.PrevState] - SYSCALL @@ -1493,8 +1514,9 @@ ezsqrt: ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP + PUSH RBX - MOV RDX, -1 + MOV RBX, -1 MOV RCX, 1 .sqrt_loop: MOV RAX, RCX @@ -1502,12 +1524,14 @@ ezsqrt: CMP EAX, EDI JE .ext INC RCX - CMOVA RAX, RDX + CMP EAX, EDI + CMOVA RAX, RBX JA .short_circuit JB .sqrt_loop .ext: MOV RAX, RCX .short_circuit: + POP RBX MOV RSP, RBP POP RBP RET From 06905da73f389192e401a2dabb279df4b566fd1c Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 01:53:16 -0800 Subject: [PATCH 82/87] Removed debug labels. --- archive/x/x86-64/dijkstra.asm | 45 ++++------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 198c60bb9..bad2e065a 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -284,7 +284,6 @@ MOV RBX, 0 .count_end: INC RBX MOV RDI, RBX -.grphchk: CALL ezsqrt MOV [RBP - _start.NumVerts], RAX CMP RAX, -1 @@ -336,7 +335,6 @@ MOV R13, [RBP - _start.graph] MOV R8, NO_FD MOV R9, NO_OFFSET SYSCALL - .graph_mchk: POP RCX MOV [R13 + RCX*SIZE_LONG], RAX .graph_regchk: @@ -442,7 +440,6 @@ itoa: ; RAX - (int) Strlen. ; Clobbers - RAX, RDI, RSI, RCX, RDX ; --------------------------------------------------------------------------- -.chkINP: CMP RDI, 0 JE .zero MOV R8, 10 @@ -468,7 +465,6 @@ JMP .ext JMP .loop .ext: MOV RAX, RCX -.ITOACHK: RET parseSRCDST: @@ -629,14 +625,10 @@ MOV [RBP - parseVertices.NumPtr], RDI MOV RDI, [RBP - parseVertices.NumPtr] MOV RSI, [RBP - parseVertices.strlen] CALL atoi - .atoi_res: MOV RCX, [RBP - parseVertices.NumElems] MOV R12, [RBP - parseVertices.DST] - .chkDstVert: MOV RDI, [R12 + RBX*SIZE_LONG] - .chkDstRdi: MOV [RDI + RCX*SIZE_INT], EAX - .arr_chk: .skip_move: POP RDX POP RCX @@ -774,7 +766,6 @@ MOV R9, [RBP - dijkstra.dist] .dists_ext: MOV RCX, [RBP - dijkstra.SRC] MOV DWORD [R9 + RCX*SIZE_INT], 0 -.chkDistsArr: MOV RDI, [RBP - dijkstra.numVerts] CALL priority_queue@construct MOV [RBP - dijkstra.PriorityQueue], RAX @@ -791,17 +782,13 @@ CALL priority_queue@add .PQ_LOOP: MOV RDI, [RBP - dijkstra.PriorityQueue] CALL priority_queue@isEmpty - .raxchk: CMP RAX, [BOOLs.TRUE] JE .PQ_EXIT - .chkRDI: MOV RDI, [RBP - dijkstra.PriorityQueue] PUSH R15 MOV R15, [RDI + priority_queue.heap] - .dijkCHKHP: CALL priority_queue@remove - MOV R15, [RDI + priority_queue.heap] - .dijkCHKHP2: + MOV R15, [RDI + priority_queue.heap] POP R15 MOV EBX, [RAX + NodeTuple.element] MOV [RBP - dijkstra.x], EBX @@ -814,13 +801,11 @@ CALL priority_queue@add JE .PQ_PASS CMP [RBX + NodeTuple.value], ECX JA .PQ_LOOP - .PQ_PASS: - .flag: + .PQ_PASS: MOV RDI, [RBP - dijkstra.graph] MOV ESI, [RBX + NodeTuple.element] MOV R14D, ESI CALL dijkstra~GetRow - .chkRow: MOV [RBP - dijkstra.currentRow], RAX MOV R11, [RBP - dijkstra.dist] MOV R15, [RBP - dijkstra.currentRow] @@ -836,7 +821,6 @@ CALL priority_queue@add CMP R13D, -1 JE .update CMP R12D, R13D - .12chk: JAE .neighbor_iterate .update: MOV [R11 + RCX*SIZE_INT], R12D @@ -848,10 +832,7 @@ CALL priority_queue@add JE .neighbor_iterate MOV RDI, RCX MOV ESI, R12D - .chkDst: - .checkTuple: CALL dijkstra~GenerateTuple - .chkNewTuple: MOV RDI, [RBP - dijkstra.PriorityQueue] MOV RSI, RAX CALL priority_queue@add @@ -951,7 +932,6 @@ MMAP_PUSH ;Having abstracted the min heap allows me to do this. PUSH R12 MOV R12, RSI MOV RDX, [RDI + priority_queue.size] -.sze: MOV RSI, [RDI + priority_queue.size] CMP RDX, [RDI + priority_queue.max_len] CMOVE RAX, [BOOLs.FALSE] @@ -959,10 +939,8 @@ JE .ext MOV R8, [RDI + priority_queue.heap] MOV R8, [R8 + min_heap.elems] MOV [R8 + RSI*SIZE_LONG], R12 -.chkheap: INC EDX INC DWORD [RDI + priority_queue.size] -.sze2: MOV R8D, [RDI + priority_queue.size] MOV RDI, [RDI + priority_queue.heap] MOV [RDI + min_heap.size], R8D @@ -995,10 +973,8 @@ PUSH RDI PUSH RBX PUSH R12 PUSH R13 -MOV RBX, [RDI + priority_queue.heap] -.chkHeeP: -MOV R12, [RBX + min_heap.elems] -.R12CHK: +MOV RBX, [RDI + priority_queue.heap] +MOV R12, [RBX + min_heap.elems] CMP DWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] JE .ext @@ -1007,14 +983,11 @@ PUSH RAX MOV QWORD [R12], NULL MOV EDX, [RDI + priority_queue.size] -.bfr: DEC EDX -.aftr: DEC DWORD [RDI + priority_queue.size] MOV R13D, [RDI + priority_queue.size] MOV [RBX + min_heap.size], R13D -PUSH RDI -.chkHp: +PUSH RDI MOV RDI, RBX MOV RSI, 0 CALL minheap@swap @@ -1022,7 +995,6 @@ POP RDI MOV RDI, [RDI + priority_queue.heap] MOV ESI, 0 CALL minheap@siftDown -.chkModHP: POP RAX .ext: POP R13 @@ -1084,7 +1056,6 @@ MOV RAX, 0 CMP QWORD [RDI + priority_queue.size], 0 CMOVA RAX, [BOOLs.FALSE] CMOVE RAX, [BOOLs.TRUE] -.rx: RET priority_queue@size: @@ -1124,7 +1095,6 @@ priority_queue@decreaseKey: ; --------------------------------------------------------------------------- MMAP_PUSH MOV RDX, [RDI + priority_queue.heap] -.chkMH: MOV RDX, [RDX + min_heap.elems] MOV RCX, 0 .search: @@ -1305,7 +1275,6 @@ PUSH RBP MOV RBP, RSP SUB RSP, minheap@siftDown.STACK_INIT PUSH RDI -.sftSTRT: .sift: MOV RCX, RDI @@ -1338,7 +1307,6 @@ PUSH RDI JMP .sift .siftEXT: POP RDI -.sftCMPL: ADD RSP, minheap@siftDown.STACK_INIT MOV RSP, RBP POP RBP @@ -1361,13 +1329,11 @@ minheap@swap: ; RAX - () None. ; Clobbers - R8, R9, R10. ; --------------------------------------------------------------------------- -.chkMH: MOV R10, [RDI + min_heap.elems] MOV R8, [R10 + RSI*SIZE_LONG] MOV R9, [R10 + RDX*SIZE_LONG] MOV [R10 + RSI*SIZE_LONG], R9 MOV [R10 + RDX*SIZE_LONG], R8 -.chkMH2: RET @@ -1566,7 +1532,6 @@ atoi: INC RCX JB .loop .ext: - .check_atoi2: POP RBX RET From 0113e45413564f482397892cb017682a41478b46 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 02:02:29 -0800 Subject: [PATCH 83/87] Cleaned up unecessary stack frames. --- archive/x/x86-64/dijkstra.asm | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index bad2e065a..72a528ad1 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -65,19 +65,7 @@ POP RDI %DEFINE atoi.STACK_INIT 8 %DEFINE atoi.ret 8 -%DEFINE minheap@siftDown.STACK_INIT 40 -%DEFINE minheap@siftDown.minheap_len 8 -%DEFINE minheap@siftDown.index 16 -%DEFINE minheap@siftDown.left 24 -%DEFINE minheap@siftDown.right 32 -%DEFINE minheap@siftDown.conditional_BOOLs 40 -%DEFINE minheap@siftDown.conditional_BOOLs~1 36 -%DEFINE minheap@siftDown.conditional_BOOLs~2 40 -%DEFINE minheap@siftDown.conditional_BOOLs~ACCEPT 0xFFFFFFFFFFFFFFFF - -%DEFINE minheap@siftUp.STACK_INIT 16 -%DEFINE minheap@siftUp.index 8 -%DEFINE minheap@siftUp.parent 16 + %DEFINE priority_queue@construct.STACK_INIT 8 %DEFINE priority_queue@construct.PQPtr 8 @@ -1226,9 +1214,6 @@ minheap@siftUp: ; RAX - () None. ; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9, R11. ; --------------------------------------------------------------------------- -PUSH RBP -MOV RBP, RSP -SUB RSP, minheap@siftUp.STACK_INIT .sift_loop: CMP ESI, 0 JE .sift_ext @@ -1251,9 +1236,6 @@ SUB RSP, minheap@siftUp.STACK_INIT MOV RSI, RAX JMP .sift_loop .sift_ext: -ADD RSP, minheap@siftUp.STACK_INIT -MOV RSP, RBP -POP RBP RET minheap@siftDown: ; ---------------------------------------------------------------------------- @@ -1271,9 +1253,6 @@ minheap@siftDown: ; RAX - () None. ; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8, R9, R11. ; --------------------------------------------------------------------------- -PUSH RBP -MOV RBP, RSP -SUB RSP, minheap@siftDown.STACK_INIT PUSH RDI .sift: @@ -1307,9 +1286,6 @@ PUSH RDI JMP .sift .siftEXT: POP RDI -ADD RSP, minheap@siftDown.STACK_INIT -MOV RSP, RBP -POP RBP RET From e7a1abdb95a651b4b07735291ffe872b59dfe68d Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 02:46:46 -0800 Subject: [PATCH 84/87] Added newline to some more errors, and fixed some error logic (not passing glotter tests). --- archive/x/x86-64/dijkstra.asm | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 72a528ad1..b03af1bea 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -239,6 +239,9 @@ MOV RBP, RSP SUB RSP, _start.STACK_INIT MOV RDI, [Err_Table + INVALID_EMPTY] +CMP [RBP + _start.argc], 0 +JE .error + MOV RAX, [RBP + _start.argv1] CMP BYTE [RAX], 0 JE .error @@ -672,8 +675,21 @@ MOV [RBP - parseVertices.NumPtr], RDI RET .error: ;For debugging, I can also add pointers, or other info into other registers before SYSCALLing. + PUSH RDX + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, Error.msg + MOV RDX, Error.len + SYSCALL + + MOV RAX, SYS_WRITE + MOV RDI, STDOUT + MOV RSI, newline.msg + MOV RDX, newline.len + SYSCALL + MOV RAX, SYS_EXIT - MOV RDI, [RBP - parseVertices.PrevState] + POP RDX SYSCALL From 765fbb556bc7079f40f665f340e0f17d6e19b528 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 02:48:51 -0800 Subject: [PATCH 85/87] Oopsie, forgot to specify operation size. --- archive/x/x86-64/dijkstra.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index b03af1bea..b9f1697fb 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -239,7 +239,7 @@ MOV RBP, RSP SUB RSP, _start.STACK_INIT MOV RDI, [Err_Table + INVALID_EMPTY] -CMP [RBP + _start.argc], 0 +CMP QWORD [RBP + _start.argc], 0 JE .error MOV RAX, [RBP + _start.argv1] From 7feece9fc96d682aaab334bd16b294227873925c Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 03:01:24 -0800 Subject: [PATCH 86/87] Hopefully this does it; fixed the empty argument logic. --- archive/x/x86-64/dijkstra.asm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index b9f1697fb..1ea9de095 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -238,10 +238,11 @@ PUSH RBP MOV RBP, RSP SUB RSP, _start.STACK_INIT -MOV RDI, [Err_Table + INVALID_EMPTY] -CMP QWORD [RBP + _start.argc], 0 -JE .error +CMP QWORD [RBP + _start.argc], VALID_ARGC +CMOVB RDI, [Err_Table + INVALID_ARGC*SIZE_LONG] +JB .error +MOV RDI, [Err_Table + INVALID_EMPTY*SIZE_LONG] MOV RAX, [RBP + _start.argv1] CMP BYTE [RAX], 0 JE .error @@ -289,7 +290,7 @@ MOV [RBP - _start.DST], RAX MOV RAX, [RBP - _start.SRC] MOV RBX, [RBP - _start.DST] CMP RAX, RBX -CMOVE RDI, [Err_Table+INVALID_SRCDST] +CMOVE RDI, [Err_Table+INVALID_SRCDST*SIZE_LONG] JE .error MOV RAX, SYS_MMAP @@ -349,7 +350,7 @@ MOV RCX, [RBP - _start.DST] MOV EBX, [RAX + RCX*SIZE_INT] MOV [RBP - _start.RET], RBX CMP EBX, -1 -CMOVE RDI, [Err_Table + INVALID_NO_WAY] +CMOVE RDI, [Err_Table + INVALID_NO_WAY*SIZE_LONG] JE .error MOV RAX, SYS_MMAP From 5e75d8f2bc98c17728c9f27938b494ddd88d888c Mon Sep 17 00:00:00 2001 From: = Date: Mon, 5 Jan 2026 03:14:51 -0800 Subject: [PATCH 87/87] Did some finishing touches on function descriptions. --- archive/x/x86-64/dijkstra.asm | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/archive/x/x86-64/dijkstra.asm b/archive/x/x86-64/dijkstra.asm index 1ea9de095..4f1391e16 100644 --- a/archive/x/x86-64/dijkstra.asm +++ b/archive/x/x86-64/dijkstra.asm @@ -197,9 +197,9 @@ section .text reverseString: ; ---------------------------------------------------------------------------- -; Function: Int to ASCII +; Function: Reverse string ; Description: -; Converts integer to ASCII, returned through char[] ptr. +; Reverses string simply. ; Parameters: ; RDI - (char[]*) String ptr. ; RSI - (int) Strlen @@ -430,7 +430,7 @@ itoa: ; R9 - () Unused. ; Returns: ; RAX - (int) Strlen. -; Clobbers - RAX, RDI, RSI, RCX, RDX +; Clobbers - RAX, RSI, RCX, RDX, R8 ; --------------------------------------------------------------------------- CMP RDI, 0 JE .zero @@ -712,7 +712,7 @@ dijkstra: ; R9 - () Unused. ; Returns: ; RAX - (int[]*) Array of distances. -; Clobbers - RAX, RDI, RSI, RDX, R10, R11. +; Clobbers - RAX, RDI, RSI, RCX, RDX, R8, R9, R10, R11. ; --------------------------------------------------------------------------- PUSH RBP MOV RBP, RSP @@ -1022,7 +1022,7 @@ priority_queue@peek: ; R9 - () Unused. ; Returns: ; RAX - (NodeTuple*) NodeTuple containing value, elem, or nil (0). -; Clobbers - RDI, RSI, RCX, RDX, R10, R8, R9. +; Clobbers - RAX, RSI, RCX. ; --------------------------------------------------------------------------- PUSH RBX PUSH R12 @@ -1045,7 +1045,7 @@ priority_queue@isEmpty: ; ---------------------------------------------------------------------------- ; Function: priority queue isEmpty. ; Description: -; Self explanatory. +; Gets status of PQ emptiness in boolean form; CMOVcc to avoid branching. ; Parameters: ; RDI - (PriorityQueue*)This* priority queue. ; RSI - () Unused. @@ -1096,7 +1096,7 @@ priority_queue@decreaseKey: ; R9 - () Unused. ; Returns: ; EAX - (int) EAX == 0 : NOT IN QUEUE; EAX == 1 : IN QUEUE. -; Clobbers - RAX, RDI, RSI, RCX, RDX, R10, R8. +; Clobbers - RAX. ; --------------------------------------------------------------------------- MMAP_PUSH MOV RDX, [RDI + priority_queue.heap] @@ -1135,7 +1135,7 @@ priority_queue@construct: ; R9 - () Unused. ; Returns: ; RAX - (PriorityQueue*)Ptr to new PQ. -; Clobbers - RAX, RDI, RSI, RDX, R10, R8, R9 +; Clobbers - RAX, RDI, RSI, RCX, RDX, R8, R9, R10. ; --------------------------------------------------------------------------- .constrct: PUSH RBP @@ -1157,13 +1157,6 @@ MOV [RBP - priority_queue@construct.PQPtr], RAX MOV QWORD [RAX + priority_queue.size], 0 MOV [RAX + priority_queue.max_len], R12 -MOV RDI, [RAX + priority_queue.max_len] -MOV RAX, SYS_MPROTECT -MOV RSI, SIZE_LONG -MOV RDX, PROT_READ -MOV R8, 0 -SYSCALL - MOV RAX, SYS_MMAP MOV RDI, NO_ADDR MOV RSI, R12 @@ -1372,7 +1365,7 @@ INC RAX RET minheap@right: ; ---------------------------------------------------------------------------- -; Function: minheap left +; Function: minheap right ; Description: ; Grabs right element index relative to given index. ; Parameters: