;; teilweise ersetzt durch, logisch fehler, ansatz...
;; (c) david vajda
;; 10/13/25
;; matrix multiplikation nasm x86, i586, amd64, ia64, ...
global _start
section .data
;; (xmm)-register xmm_i sind 128 bit, schon klar
;; muss man ueberlegen. weil, ob ich 16 oder 8 xmm register habe, muss ich gucken
;; und wenn es nur 8 sind, wie bei mm7 .. mm0, dann muss gucken, weil die 64 bit muessen erhalten bleiben
;; da sich allerdings herausgestellt hat, dass, folgendes: das bisher 4 bloecke a 64 bit sind, allerdings
;; 8 gebraucht sind, fuegen wir die alten zahlen wieder ein und machen die ungepackt, am besten mit bash
;; programmieren
;; M1: dw 0x00d6, 0x0056, 0x00f5, 0x0067, 0x0084, 0x001b, 0x00b5, 0x00ba, 0x0062, 0x007a, 0x003c, 0x00b9, 0x00a8, 0x0012, 0x00f4, 0x00e4
;; M2: dw 0x00b2, 0x00a3, 0x001f, 0x009f, 0x0044, 0x005b, 0x00b4, 0x00e1, 0x007d, 0x00dc, 0x008e, 0x00b3, 0x008c, 0x00b9, 0x00ea, 0x002d
;; M1: .dw 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010
;; M2: .dw 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010
;; M1: .db 0x4a, 0xd6, 0x4c, 0x56, 0x6c, 0xf5, 0x22, 0x67, 0x83, 0x84, 0xea, 0x1b, 0x46, 0xb5, 0xa4, 0xba, 0x38, 0x62, 0x4c, 0x7a, 0x9d, 0x3c, 0x35, 0xb9, 0xdf, 0xa8, 0x97, 0x12, 0xa4, 0xf4, 0x6f, 0xe4
;; M2: .db 0xd6, 0xb2, 0x54, 0xa3, 0x77, 0x1f, 0xb5, 0x9f, 0x1f, 0x44, 0x9d, 0x5b, 0xbb, 0xb4, 0x22, 0xe1, 0x64, 0x7d, 0x66, 0xdc, 0x48, 0x8e, 0xcd, 0xb3, 0xcb, 0x8c, 0xc6, 0xb9, 0xd3, 0xea, 0xda, 0x2d
;;cat tosed101425.tt | sed 's/0x\([a-z0-9][a-z0-9]\)\([a-z0-9][a-z0-9]\)/0x\1, 0x\2/g'
;; nach dem sed ist immer noch ein fehler drin, so, weil die sollen ungepackt, das heisst, die brauchen fuehrend zwei nullen
M1: dw 0x004a, 0x00d6, 0x004c, 0x0056, 0x006c, 0x00f5, 0x0022, 0x0067, 0x0083, 0x0084, 0x00ea, 0x001b, 0x0046, 0x00b5, 0x00a4, 0x00ba, 0x0038, 0x0062, 0x004c, 0x007a, 0x009d, 0x003c, 0x0035, 0x00b9, 0x00df, 0x00a8, 0x0097, 0x0012, 0x00a4, 0x00f4, 0x006f, 0x00e4
M2: dw 0x00d6, 0x00b2, 0x0054, 0x00a3, 0x0077, 0x001f, 0x00b5, 0x009f, 0x001f, 0x0044, 0x009d, 0x005b, 0x00bb, 0x00b4, 0x0022, 0x00e1, 0x0064, 0x007d, 0x0066, 0x00dc, 0x0048, 0x008e, 0x00cd, 0x00b3, 0x00cb, 0x008c, 0x00c6, 0x00b9, 0x00d3, 0x00ea, 0x00da, 0x002d
Mall: dw 512 DUP (0x00)
;M3: db 10, 13
;;M3str: db
section .text
;; so der erste schritt ist das zu transformieren ...
;; ok, ich transformiere die matrix mal selber und zwar per hand
;;
mov rsi, M1
mob rbp, Mall
mov cl, 0x08
mov ch, 0x08
matrixmul1:
;;movq xmm0, [rsi]
;;movq xmm1, [rdi]
;;pmullw xmm1, xmm0
;;movq [rdi], xmm1
movq mm0, [rsi]
mov rdi, M2
mov cl, 0x08
matrixmul2:
movq mm1, [rdi]
pmullw mm1, mm0
add rdi, 0x08
movq [rbp], mm1
dec cl
cmp cl, 0x00
jne matrixmul2
add rsi, 0x08
dec ch
cmp ch, 0x00
jne matrixmul1
mov rdx, 1024
mov rcx, Mall
mov rax, 0x04
mov rbx, 0x01
int 0x80
mov rax, 0x01
mov rbx, 0x00
int 0x80
;; (c) david vajda
;; 10/13/25
;; matrix multiplikation nasm x86, i586, amd64, ia64, ...
global _start
section .data
M1: .db 4, 10, 13, 6, 4, 12, 5, 6, 6, 12, 15, 5, 2, 2, 6, 7, 8, 3, 8, 4, 14, 10, 1, 11, 4, 6, 11, 5, 10, 4, 11, 10, 3, 8, 6, 2, 4, 12, 7, 10, 9, 13, 3, 12, 3, 5, 11, 9, 13, 15, 10, 8, 9, 7, 1, 2, 10, 4, 15, 4, 6, 15, 14, 4
;; M2: .db 13, 7, 1, 11, 6, 4, 12, 13, 6, 7, 15, 11, 4, 8, 11, 3, 11, 1, 4, 11, 7, 8, 8, 14, 2, 15, 4, 4, 13, 14, 12, 10, 5, 11, 9, 2, 6, 12, 12, 13, 4, 5, 13, 2, 6, 13, 6, 10, 10, 9, 5, 14, 13, 11, 11, 2, 3, 15, 11, 1, 12, 3, 9, 13
M2: .db 13, 6, 11, 2, 5, 4, 10, 3, 7, 7, 1, 15, 11, 5, 9, 15, 1, 15, 4, 4, 9, 13, 5, 11, 11, 11, 11, 4, 2, 2, 14, 1, 6, 4, 7, 13, 6, 6, 13, 12, 4, 8, 8, 14, 12, 13, 11, 3, 12, 11, 8, 12, 12, 6, 11, 9, 13, 3, 14, 10, 13, 10, 2, 13
M1: .db 0x4ad6, 0x4c56, 0x6cf5, 0x2267, 0x8384, 0xea1b, 0x46b5, 0xa4ba, 0x3862, 0x4c7a, 0x9d3c, 0x35b9, 0xdfa8, 0x9712, 0xa4f4, 0x6fe4
M2: .db 0xd6b2, 0x54a3, 0x771f, 0xb59f, 0x1f44, 0x9d5b, 0xbbb4, 0x22e1, 0x647d, 0x66dc, 0x488e, 0xcdb3, 0xcb8c, 0xc6b9, 0xd3ea, 0xda2d
M3: .db 10, 13
M3str: .db
section .text
;; so der erste schritt ist das zu transformieren ...
;; ok, ich transformiere die matrix mal selber und zwar per hand
;;
mov rsi, [M1]
mov rdi, [M2]
matrixmul1:
movq xmm0, [rsi]
movq xmm1, [rdi]
pmullw xmm1, xmm0
movq [rdi], xmm1
add rsi, 0x08
add rdi, 0x08
cmp rsi, M1+40
je matrixmul1
mov rdx, 66
mov rcx, M3str
mov rax, 0x04
mov rbx, 0x01
int 0x80
mov rax, 0x01
mov rbx, 0x00
int 0x80